컨트롤러에서 HttpRequest에 액세스하는 Spring 3 MVC


104

@SessionAttributes예를 들어 쿠키 처리 로그인 을 위해 요청 및 세션 속성을 직접 처리하고 spring으로 남겨두고 싶습니다 .

나는 HttpRequest컨트롤러 내에서 어떻게 액세스 할 수 있는지 알 수 없으며 위의 레이어로 이동 @RequestAttribute하여 HttpRequest자체에 액세스 하는 방법이 필요 합니다. 사용의 줄무늬와 함께 구현하여이 작업을 수행합니다 ApplicationContext및 호출 getAttribute().

또한 HttpServletRequestas 매개 변수를 전달하는 것이 작동하지 않는 것 같습니다.

@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println(""+request.getSession().getCreationTime());
    return "home"; 
}

위의 방법은 아무것도 인쇄하지 않습니다.

이것에 대한 조언이 있습니까?

답변:


184

Spring MVC는 컨트롤러 메소드 서명에 추가하면 HttpRequest를 제공합니다.

예를 들면 :

/**
 * Generate a PDF report...
 */
@RequestMapping(value = "/report/{objectId}", method = RequestMethod.GET)
public @ResponseBody void generateReport(
        @PathVariable("objectId") Long objectId, 
        HttpServletRequest request, 
        HttpServletResponse response) {

    // ...
    // Here you can use the request and response objects like:
    // response.setContentType("application/pdf");
    // response.getOutputStream().write(...);

}

보시다시피 서명에 HttpServletRequestHttpServletResponse객체를 추가하기 만하면 Spring MVC가 해당 객체를 컨트롤러 메서드에 전달합니다. HttpSession개체도 원할 것 입니다.

편집 : HttpServletRequest / Response가 Spring 3의 일부 사람들에게 작동하지 않는 것 같습니다. Eduardo Zola가 지적한대로 Spring WebRequest / WebResponse 객체를 사용해보십시오.

Spring MVC가 처리기 메서드에 자동으로 주입 할 수있는 지원되는 인수 목록을 살펴볼 것을 강력히 권장합니다 .


안녕하세요, 힌트를 위해 thx, 내가 뭘 잘못하고 있는지 모르겠지만 작동하지 않습니다. 아무것도 인쇄하지 않습니다. @RequestMapping (value = "/") public String home (HttpServletRequest request) {System.out. println ( ""+ request.getSession (). getCreationTime ()); 집에 돌아 간다"; } 이것은 현재의 pof millis 양을 pring해야하지만 그렇지 않습니다. 또한 @RequestBody로 메소드에 주석을 달아도 아무것도 변경되지 않습니다. 추가 조언이 있습니까? 이것에 대한 thx
JBoy dec.

2
Spring MVC의 지원되는 인수에 대한 링크에 대해 @jjmontes에게 감사드립니다!
Barett

나는 Spring에 대해 아무것도 알지 못하지만, @Context그것들을 주입하기 위해 인자 앞에 주석 을 추가 해야했다. 뭔가 새로운 것일 수도 있지만, 내가 언급 할 것이라고 생각했습니다.
ivarni

81

그게 오래된 질문이라는 건 알지만 ...

수업에서 이것을 사용할 수도 있습니다.

@Autowired
private HttpServletRequest context;

그리고 이것은 HttpServletRequest당신이 당신의 방법에 사용할 현재 인스턴스를 제공합니다 .


7
이렇게하면 컨트롤러 빈이 싱글 톤이되는 것을 막지 않습니까?
jjmontes 2013 년

2
스프링 컨트롤러는 항상 싱글 톤입니다.
Deividi Cavarzan 2013 년

16
이것은 잘못된 느낌입니다. 만약 컨트롤러가 주어진 시간에 하나 이상의 요청을 처리한다면 어떨까요? 그렇다면 "현재"요청은 무엇입니까?
sbk

2
이 질문에는 당신이 요구하는 것에 대한 몇 가지 설명이 있습니다 : stackoverflow.com/questions/17235794/…
Deividi Cavarzan

1
매우 동시적인 환경에서 실행 되더라도 항상 올바른 요청을 반환하는 getThreadLocalRequest()GWT 와 같은 것을 갖는 것이 매우 유용 할 것 RemoteServiceServlet입니다.
Yuriy Nakonechnyy

0
@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println("My Attribute :: "+request.getAttribute("YourAttributeName"));
    return "home"; 
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.