Spring 3 MVC truy cập HttpRequest từ bộ điều khiển


104

Tôi muốn tự mình xử lý các thuộc tính yêu cầu và phiên thay vì để nó sang mùa xuân @SessionAttributes, ví dụ như đăng nhập xử lý cookie.

Tôi chỉ không thể tìm ra cách tôi có thể truy cập HttpRequesttừ bên trong bộ điều khiển, tôi cần một cách để đi đến một lớp phía trên @RequestAttributevà truy cập vào HttpRequestchính nó. Với Stripes được sử dụng để làm điều này bằng cách thực hiện một ApplicationContextvà gọi getAttribute().

Ngoài ra, việc truyền HttpServletRequesttham số as dường như không hoạt động:

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

Phương pháp trên không in bất cứ thứ gì.

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

Câu trả lời:


184

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

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ỉ cần thêm HttpServletRequestHttpServletResponsecác đối tượng vào chữ ký sẽ làm cho Spring MVC chuyển các đối tượng đó sang phương thức bộ điều khiển của bạn. Bạn cũng sẽ muốn HttpSessionđối tượng.

CHỈNH SỬA: Có vẻ như HttpServletRequest / Response không hoạt động đối với một số người trong Spring 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 danh sách các đối số được hỗ trợ mà Spring MVC có thể tự động đưa vào các phương thức xử lý của bạn một cách kỳ diệu.


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

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

Tôi không biết gì về Spring, nhưng tôi phải thêm @Contextchú thích trước đối số để đưa chúng vào. Có thể là một cái gì đó mới, tôi không biết, nhưng tôi nghĩ là tôi sẽ đề cập đến nó.
ivarni

81

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

Bạn cũng có thể sử dụng điều này trong lớp học của mình:

@Autowired
private HttpServletRequest context;

Và điều này sẽ cung cấp phiên bản hiện tại HttpServletRequestmà bạn sử dụng trên phương thức của mình.


7
Không làm theo cách này ngăn chặn bean điều khiển là một singleton?
jjmontes

2
Bộ điều khiển lò xo luôn luôn là bộ điều khiển đơn.
Deividi Cavarzan,

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

2
Câu hỏi này có một số lời giải thích về việc bạn đang yêu cầu: stackoverflow.com/questions/17235794/…
Deividi Cavarzan,

1
Sẽ khá hữu ích nếu có một cái gì đó giống như getThreadLocalRequest()trong GWT RemoteServiceServletluôn trả về yêu cầu chính xác ngay cả khi nó được thực thi trong môi trường đồng thời cao.
Yuriy Nakonechnyy

0
@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println("My Attribute :: "+request.getAttribute("YourAttributeName"));
    return "home"; 
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.