2011-12-14 36 views
66

Tôi muốn xử lý các thuộc tính yêu cầu và phiên của chính mình thay vì để nó vào mùa xuân @SessionAttributes, ví dụ như để đăng nhập xử lý cookie.Mùa xuân 3 MVC truy cập HttpRequest từ bộ điều khiển

Tôi không thể tìm ra cách truy cập HttpRequest từ bên trong bộ điều khiển, tôi cần một cách để đi một lớp phía trên @RequestAttribute và tự truy cập vào số HttpRequest. Với Stripes được sử dụng để thực hiện việc này bằng cách triển khai ApplicationContext và gọi số getAttribute().

Ngoài ra, đi qua các HttpServletRequest như tham số dường như không có tác dụng:

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

Các phương pháp trên không in bất cứ điều gì.

Bạn có lời khuyên nào về điều này không?

Trả lời

133

Spring MVC sẽ cung cấp cho bạn HttpRequest nếu bạn chỉ cần thêm nó vào bộ điều khiển phương pháp chữ ký của bạn:

Ví dụ:

/** 
* 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(...); 

} 

Như bạn thấy, chỉ đơn giản là thêm HttpServletRequestHttpServletResponse đối tượng để chữ ký làm cho Spring MVC truyền các đối tượng đó tới phương thức điều khiển của bạn. Bạn cũng sẽ muốn đối tượng HttpSession.

EDIT: Có vẻ như HttpServletRequest/Response không hoạt động đối với một số người trong mùa xuân 3. Hãy thử sử dụng các đối tượng Spring WebRequest/WebResponse như Eduardo Zola đã chỉ ra.

Tôi thực sự khuyên bạn nên xem list of supported arguments rằng Spring MVC có thể tự động tiêm ma thuật vào các phương thức xử lý của bạn.

+0

Hi, thx cho các gợi ý, tôi không biết những gì tôi đang làm sai nhưng điều này không làm việc: nó không in bất cứ điều gì: \t @RequestMapping (value = "/") \t public String nhà (yêu cầu HttpServletRequest) { \t \t \t System.out.println ("" + request.getSession(). GetCreationTime()); \t \t \t \t trả lại "nhà riêng"; \t \t \t} Điều này nên pring số tiền hiện tại pof millis nhưng nó không, cũng chú thích phương pháp với @RequestBody không thay đổi bất cứ điều gì, bất kỳ lời khuyên nào khác? thx cho điều này – JBoy

+1

Tôi thứ hai JBoy quá, nó không hoạt động –

+1

Cảm ơn @ jjmontes cho các liên kết đến các đối số được hỗ trợ của Spring MVC! – Barett

53

Tôi biết đó là một câu hỏi cũ, nhưng ...

Bạn cũng có thể sử dụng trong lớp học của bạn:

@Autowired 
private HttpServletRequest context; 

Và điều này sẽ cung cấp cho các trường hợp hiện tại của HttpServletRequest cho bạn sử dụng trên của bạn phương pháp.

+3

Không thực hiện nó theo cách này ngăn chặn các điều khiển đậu từ một singleton? – jjmontes

+1

Bộ điều khiển lò xo luôn là đĩa đơn. –

+7

Điều này cảm thấy sai - điều gì sẽ xảy ra nếu bộ điều khiển xử lý nhiều yêu cầu vào một thời điểm nhất định? Yêu cầu "hiện tại" là gì? – sbk

Các vấn đề liên quan