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.