Kontrolörden HttpRequest'e erişen Spring 3 MVC


105

@SessionAttributesÖrneğin, çerezlerin işlenmesi için oturum açmak için isteği ve oturum özniteliklerini kendim yerine getirmek istiyorum .

HttpRequestBir denetleyicinin içinden nasıl erişebileceğimi anlayamıyorum, üstündeki bir katmana gidip kendisine @RequestAttributeerişmek için bir yola ihtiyacım var HttpRequest. Stripes ile bunu bir ApplicationContextve çağırarak yapmak için kullanılır getAttribute().

Ayrıca, HttpServletRequestas parametresini geçirmek çalışmıyor gibi görünüyor:

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

Yukarıdaki yöntem hiçbir şey yazdırmaz.

Bununla ilgili herhangi bir tavsiyen var mı?

Yanıtlar:


185

Spring MVC, yalnızca denetleyici yöntemi imzanıza eklerseniz size HttpRequest'i verecektir:

Örneğin:

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

}

Gördüğünüz gibi , imzaya HttpServletRequestve HttpServletResponsenesnelerini eklemek, Spring MVC'nin bu nesneleri denetleyici yönteminize aktarmasını sağlar. HttpSessionNesneyi de isteyeceksin .

DÜZENLEME: Görünüşe göre HttpServletRequest / Response Bahar 3 altında bazı insanlar için çalışmıyor. Eduardo Zola'nın işaret ettiği gibi Spring WebRequest / WebResponse nesnelerini kullanmayı deneyin.

Spring MVC'nin işleyici yöntemlerinize otomatik olarak sihirli bir şekilde enjekte edebildiği desteklenen argümanlar listesine bir göz atmanızı şiddetle tavsiye ederim .


Merhaba, teşekkürler, neyi yanlış yaptığımı bilmiyorum ama bu işe yaramıyor: hiçbir şey yazdırmıyor: @RequestMapping (value = "/") public String home (HttpServletRequest request) {System.out. println ("" + request.getSession (). getCreationTime ()); eve dön"; } Bu, mevcut pof milis miktarını artırmalı, ancak bu, yöntemi @RequestBody ile açıklama da hiçbir şeyi değiştirmez, başka bir tavsiye? bunun için
— teşekkürler

2
Spring MVC'nin desteklediği argümanlara bağlantı için @jjmontes'a teşekkürler!
— Barett

Bahar hakkında neredeyse hiçbir şey bilmiyorum, ancak @Contextonları enjekte ettirmek için açıklamayı tartışmadan önce eklemem gerekiyordu. Yeni bir şey olabilir, bilmiyorum ama bundan bahsedeyim dedim.
— ivarni

81

Bunun eski bir soru olduğunu biliyorum, ama ...

Bunu sınıfınızda da kullanabilirsiniz:

@Autowired
private HttpServletRequest context;

Ve bu, HttpServletRequestyönteminizde kullanabileceğiniz mevcut örneğini sağlayacaktır .


7
Bu şekilde yapmak kontrolör çekirdeğinin tekli olmasını engellemiyor mu?
— jjmontes

2
Yay kontrolörleri her zaman tek tondur.
— Deividi Cavarzan

16
Bu yanlış geliyor - ya kontrolör belirtilen zamanda birden fazla talebi işliyorsa? O halde "mevcut" istek nedir?
— sbk

2
Bu soruda sorduğunuz bazı açıklamalar var: stackoverflow.com/questions/17235794/…
— Deividi Cavarzan

1
getThreadLocalRequest()GWT'lerde RemoteServiceServletolduğu gibi , yüksek derecede eşzamanlı ortamda çalıştırılsa bile her zaman doğru isteği döndüren bir şeye sahip olmak oldukça yararlı olacaktır .
— Yuriy Nakonechnyy

0
@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println("My Attribute :: "+request.getAttribute("YourAttributeName"));
    return "home"; 
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.