2016-08-30 6 views
3

私のコントローラに2つのマッピング方法があります。 1つは他にリダイレクトしています。 リダイレクトする前に、私は応答としてヘッダーを設定しています。しかし、私はnullとして要求ヘッダーを取得します。 これは私のコントローラのメソッドです。両方が同じコントローラにあります。リクエストヘッダが春のMVCでヌルになっています

@RequestMapping(value="/testStart", method=RequestMethod.POST) 
     public String testStart(HttpServletRequest request, HttpServletResponse response){ 
      String token = "126712810-1289291": 

      response.addHeader("authToken", token); 

      return "redirect:/test"; 
     } 
@RequestMapping(value="/test", method={ RequestMethod.POST, RequestMethod.GET }) 
    public String getTestPage(Model model, HttpServletRequest request, HttpServletResponse response){ 

     String token = request.getHeader("authToken"); 
     System.out.println(token); //prints null 
     model.addAttribute("Testtoken", token); 
     System.out.println("Test page about to load .."); 
     return "test"; 

} 

私はこのapiをテストするためにpostmanクライアントを使用しています。それは、URLを打つと、他のURLにリダイレクトしています。ヘッダーはnullです。 何が問題なのか分かりません。私はこれを理解する手助けをすることができますか?ありがとう

答えて

2

リダイレクト方法webアプリケーションは、リダイレクトしたいページを読み込むようブラウザに指示します。これにより、ブラウザからの新しいhttp要求が作成されます。この時点では、元の要求には到達できません。

したがって、の転送の方法で問題を解決できます。あなたが応答オブジェクトにあなたのauthTokenのを追加しているので、他のハンドラメソッドに転送し、すべての要求データのWebアプリは、内部

return "forward:/test"; 

また、

String token = response.getHeader("authToken"); 

であなたの

String token = request.getHeader("authToken"); 

を変更してください。(コメントからHttpServletResponse - > はサーブレット3.0以降に動作します)

EDIT:

このコードは、あなたの完全なソリューション"/test"方法が転送reuqestをサポートし、また、ブラウザからの要求をサポートとなります。 (転送しないで呼び出す/テストする方法でトークン情報を取得したいので、このように動作しますが、転送時にヘッダを追加することで応答に追加しようとしましたが、

@RequestMapping(value="/test1", method=GET) 
public String test(RedirectAttributes redirectAttributes){ 
    redirectAttributes.addAttribute("authToken", "val"); 
    return "redirect:/test"; 
} 

またはあなたができれば:その方法での仕事はあなたがリダイレクトURLとパラメータを渡すようにコード)

@RequestMapping(value="/testStart", method=RequestMethod.POST) 
public String testStart(HttpServletRequest request, HttpServletResponse response){ 
    String token = "126712810-1289291"; 

    request.setAttribute("authToken", token); 

    return "forward:/test"; 
} 

@RequestMapping(value="/test", method={ RequestMethod.POST, RequestMethod.GET }) 
public String getTestPage(Model model, HttpServletRequest request, HttpServletResponse response) 
{ 

    //----------------- 
    //resolving token 
    String token = null; 
    DispatcherType type = request.getDispatcherType(); 

    if(type == DispatcherType.FORWARD) 
    { 
     token = (String) request.getAttribute("authToken"); 
    } 
    else if(type == DispatcherType.REQUEST) 
    { 
     token = (String) request.getHeader("authToken"); 
    } 
    //----------------- 

    System.out.println(token); //prints the value 
    model.addAttribute("Testtoken", token); 
    System.out.println("Test page about to load .."); 
    return "test"; 
} 
+0

ヘッダを取得headerに追加したい場合あなたはまだrequest.setAttributerequest.getAttribute

で行くことができます。 – sparrow

+0

あなたは応答オブジェクトにauthTokenを追加し、それを要求オブジェクトから取得しようとしています。あなたは応答オブジェクトからauthTokenを取得するか、リクエストオブジェクトに追加する必要があります。 –

+0

@sparrow btwこのデータ転送の問題では、setAttribute/getAttributeを使用すると、より良い方法になります –

1

使用RedirectAttributesをチェックディスパッチャの種類に応じてトークン解決する必要があります0を使用するあなたはRestTemplateHTTPHeadersを使用して、まだヌルとなっresponse String

関連する問題