2016-08-30 2 views
3

컨트롤러에 두 가지 매핑 방법이 있습니다. 하나는 다른 것으로 리디렉션 중입니다. 리디렉션하기 전에 응답으로 헤더를 설정하고 있습니다. 하지만 null로 요청 헤더를 받고. 다음은 컨트롤러의 메소드입니다. 둘 다 같은 컨트롤러에 있습니다.요청 헤더가 봄 MVC에서 null로 표시됩니다.

@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를 테스트하기 위해 우편 클라이언트를 사용하고 있습니다. 그것은 URL을 때리고 다른 URL로 리디렉션하고 있습니다. 그러나 헤더는 널입니다. 나는 무엇이 잘못되었는지를 모른다. 어느 누구도 이것을 알아낼 수 있습니까? 감사합니다

답변

2

로 리디렉션 방법 웹 애플 리케이션은 리디렉션하려는 페이지를로드하도록 브라우저에 지시합니다. 따라서 브라우저에서 새로운 http 요청을 보내면 원래 요청에 도달 할 수 없습니다.

따라서 앞으로 방법으로 문제를 해결할 수 있습니다. 다른 핸들러 메서드에 웹 응용 프로그램은 앞으로 모든 요청 데이터는 내부적으로

또한
return "forward:/test"; 

, 당신의

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

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

는 응답 오브젝트에 authToken에 추가되기 때문으로 변경하십시오. (의견 HttpServletResponse -> 서블릿 3.0 이후 작품)

편집 :

이 코드는 완벽한 솔루션 "/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

헤더는 여전히 널 점점 얻을 수 있습니다. – sparrow

+0

응답 개체에 authToken을 추가하고 요청 개체에서 가져 오려고합니다. 당신은 응답 객체로부터 authToken을 얻거나 요청 객체에 그것을 추가 할 필요가있다. –

+0

@sparrow btw이 데이터 전달 문제에 대해 setAttribute/getAttribute를 사용할 수있다. 더 나은 방법이 될 것이다. –

1

사용 RedirectAttributes을 확인 디스패처의 종류에 따라 토큰 해결해야 0을 사용하다 12,당신이 header에 추가 할 경우 여전히 다음 RestTemplateHTTPHeaders를 사용 request.setAttributerequest.getAttribute

로 이동하고 response String