Spring 3 MVC เข้าถึง HttpRequest จากคอนโทรลเลอร์


105

ฉันต้องการจัดการคำขอและแอตทริบิวต์เซสชันด้วยตัวเองจากนั้นปล่อยให้เป็นฤดูใบไม้ผลิ@SessionAttributesเพื่อเข้าสู่ระบบการจัดการคุกกี้

ฉันคิดไม่ออกว่าฉันจะเข้าถึงHttpRequestจากภายในคอนโทรลเลอร์ได้อย่างไรฉันต้องการวิธีไปที่เลเยอร์เหนือ@RequestAttributeและเข้าถึงHttpRequestตัวมันเอง มีลายเส้นในการใช้ในการทำเช่นนี้โดยการดำเนินการและเรียกApplicationContextgetAttribute()

นอกจากนี้การส่งผ่านHttpServletRequestพารามิเตอร์ as ดูเหมือนจะไม่ทำงาน:

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

วิธีการข้างต้นไม่พิมพ์อะไรเลย

คุณมีคำแนะนำเกี่ยวกับเรื่องนี้หรือไม่?

คำตอบ:


185

Spring MVC จะให้ HttpRequest แก่คุณหากคุณเพิ่มลงในลายเซ็นวิธีควบคุมของคุณ:

ตัวอย่างเช่น:

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

}

อย่างที่คุณเห็นเพียงแค่เพิ่มHttpServletRequestและHttpServletResponseอ็อบเจกต์ลงในลายเซ็นทำให้ Spring MVC ส่งต่ออ็อบเจ็กต์เหล่านั้นไปยังวิธีการควบคุมของคุณ คุณจะต้องการHttpSessionวัตถุด้วย

แก้ไข: ดูเหมือนว่า HttpServletRequest / Response จะไม่ทำงานสำหรับบางคนใน Spring 3 ลองใช้ออบเจ็กต์ Spring WebRequest / WebResponse ตามที่ Eduardo Zola ชี้ไว้

ฉันขอแนะนำให้คุณดูรายการอาร์กิวเมนต์ที่รองรับซึ่ง Spring MVC สามารถฉีดอัตโนมัติไปยังวิธีการจัดการของคุณได้อย่างน่าอัศจรรย์


สวัสดีขอบคุณสำหรับคำแนะนำฉันไม่รู้ว่าฉันทำอะไรผิด แต่ไม่ได้ผล: มันไม่ได้พิมพ์อะไรเลย: @RequestMapping (value = "/") บ้าน String สาธารณะ (คำขอ HttpServletRequest) {System.out. println ("" + request.getSession (). getCreationTime ()); กลับบ้าน"; } สิ่งนี้ควรกำหนดจำนวนเงินปัจจุบันเป็นมิลลิวินาที แต่ไม่รวมทั้งการใส่คำอธิบายประกอบวิธีด้วย @RequestBody ไม่เปลี่ยนแปลงอะไรมีคำแนะนำเพิ่มเติมหรือไม่ ขอบคุณสำหรับสิ่งนี้
JBoy

2
ขอบคุณ @jjmontes สำหรับลิงก์ไปยังข้อโต้แย้งที่สนับสนุนของ Spring MVC!
บาเร็ตต์

ฉันไม่รู้อะไรเลยเกี่ยวกับ Spring แต่ฉันต้องเพิ่ม@Contextคำอธิบายประกอบก่อนการโต้แย้งเพื่อให้ได้รับการฉีด อาจเป็นสิ่งใหม่ฉันไม่รู้ แต่คิดว่าฉันจะพูดถึงมัน
ivarni

81

ฉันรู้ว่านั่นเป็นคำถามเก่า แต่ ...

คุณยังสามารถใช้สิ่งนี้ในชั้นเรียนของคุณ:

@Autowired
private HttpServletRequest context;

และนี่จะเป็นอินสแตนซ์ปัจจุบันที่HttpServletRequestคุณใช้กับวิธีการของคุณ


7
การทำเช่นนี้จะป้องกันไม่ให้คอนโทรลเลอร์ bean เป็นซิงเกิลตันหรือไม่?
jjmontes

2
ตัวควบคุมสปริงเป็นเสื้อกล้ามเสมอ
Deividi Cavarzan

16
รู้สึกผิด - จะเกิดอะไรขึ้นถ้าผู้ควบคุมจัดการคำขอมากกว่าหนึ่งรายการในเวลาที่กำหนด แล้วคำขอ "ปัจจุบัน" คืออะไร?
sbk

2
คำถามนี้มีคำอธิบายเกี่ยวกับที่คุณกำลังถาม: stackoverflow.com/questions/17235794/…
Deividi Cavarzan

1
มันจะมีประโยชน์มากที่จะมีบางอย่างเช่นgetThreadLocalRequest()ใน GWT RemoteServiceServletซึ่งส่งคืนคำขอที่ถูกต้องเสมอแม้ว่าจะดำเนินการในสภาพแวดล้อมพร้อมกันสูงก็ตาม
Yuriy Nakonechnyy

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.