Spring 3 MVC mengakses HttpRequest dari pengontrol

104

Saya ingin menangani sendiri atribut permintaan dan sesi daripada membiarkannya di musim semi @SessionAttributes, untuk login penanganan cookie misalnya.

Saya hanya tidak tahu bagaimana saya bisa mengakses HttpRequestdari dalam pengontrol, saya perlu cara untuk pergi ke lapisan di atas @RequestAttributedan mengakses HttpRequestitu sendiri. Dengan Stripes digunakan untuk melakukan ini dengan mengimplementasikan ApplicationContextdan memanggil getAttribute().

Selain itu, meneruskan HttpServletRequestparameter as tampaknya tidak berhasil:

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

Metode di atas tidak mencetak apa pun.

Apakah Anda punya saran tentang ini?

JBoy
sumber

Jawaban:

184

Spring MVC akan memberi Anda HttpRequest jika Anda menambahkannya ke tanda tangan metode pengontrol Anda:

Misalnya:

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

}

Seperti yang Anda lihat, cukup menambahkan objek HttpServletRequestdan HttpServletResponseke tanda tangan membuat Spring MVC meneruskan objek tersebut ke metode pengontrol Anda. Anda juga akan menginginkan HttpSessionobjeknya.

EDIT: Tampaknya HttpServletRequest / Response tidak berfungsi untuk beberapa orang di bawah Spring 3. Coba gunakan objek Spring WebRequest / WebResponse seperti yang ditunjukkan Eduardo Zola.

Saya sangat menyarankan Anda untuk melihat daftar argumen yang didukung yang dapat disuntikkan secara otomatis ke metode handler Spring MVC.

jjmontes
sumber
Hai, terima kasih atas petunjuknya, saya tidak tahu apa yang saya lakukan salah tetapi ini tidak berhasil: tidak mencetak apa pun: @RequestMapping (value = "/") public String home (permintaan HttpServletRequest) {System.out. println ("" + request.getSession (). getCreationTime ()); kembali ke rumah"; } Ini seharusnya mengurangi jumlah pof milidetik saat ini tetapi tidak, juga menganotasi metode dengan @RequestBody tidak mengubah apa pun, saran lebih lanjut?
terima kasih
2
Terima kasih @jjmontes atas tautan ke argumen yang didukung Spring MVC!
Barett
Saya hampir tidak tahu apa-apa tentang Spring, tetapi saya harus menambahkan @Contextanotasi sebelum argumen untuk menyuntikkannya. Bisa jadi sesuatu yang baru, entahlah, tapi kupikir aku akan menyebutkannya.
ivarni
81

Saya tahu itu pertanyaan lama, tapi ...

Anda juga dapat menggunakan ini di kelas Anda:

@Autowired
private HttpServletRequest context;

Dan ini akan memberikan contoh saat ini HttpServletRequestuntuk Anda gunakan pada metode Anda.

Deividi Cavarzan
sumber
7
Bukankah melakukannya dengan cara ini mencegah kacang pengontrol menjadi tunggal?
jjmontes
2
Pengendali pegas selalu tunggal.
Deividi Cavarzan
16
Ini terasa salah - bagaimana jika pengontrol menangani lebih dari satu permintaan pada waktu tertentu? Lalu apa itu permintaan "saat ini"?
sbk
2
Pertanyaan ini memiliki beberapa penjelasan tentang yang Anda minta: stackoverflow.com/questions/17235794/…
Deividi Cavarzan
1
Akan sangat berguna untuk memiliki sesuatu seperti getThreadLocalRequest()di GWT RemoteServiceServletyang selalu mengembalikan permintaan yang benar meskipun dijalankan dalam lingkungan yang sangat bersamaan.
Yuriy Nakonechnyy
0
@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println("My Attribute :: "+request.getAttribute("YourAttributeName"));
    return "home"; 
}
SaiSudha HG
sumber