如何在springMVC的controller中獲取request
阿新 • • 發佈:2020-01-07
這篇文章主要介紹瞭如何在springMVC的controller中獲取request,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); HttpServletResponse response = attributes.getResponse(); try { response.getWriter().write("hello"); } catch (IOException e) { e.printStackTrace(); } Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String name = headerNames.nextElement(); String value = request.getHeader(name); System.out.println(name + "===========" + value); }
使用springMVC的時候,有些時候會需要獲取請求或者響應物件,例如在身份驗證的時候,需要獲取請求頭中的token,在做登入系統的時候需要使用response物件向客戶端新增cookie,一個有效的做法是在controller的方法中新增對應引數如下所示:
@RestController public class Test2Contrller { @RequestMapping("/test") public void test(HttpServletRequest req,HttpServletResponse res) { // todo } }
這樣做有一個問題,就是如果這個系統是作為介面並希望被遠端呼叫的,那麼額外的引數的存在便會破壞原本的介面定義,造成麻煩,下面介紹兩種不需要在方法中增加額外引數就能獲取request和response的方式
第一種方式:通過RequestContextHolder類的方法獲取requestAttributes,再從中獲取請求和響應物件;
@RestController public class Test2Contrller { @RequestMapping("/testreq") public void test() { // 獲得request物件,response物件 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); HttpServletResponse response = attributes.getResponse(); try { response.getWriter().write("hello"); } catch (IOException e) { e.printStackTrace(); } Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String name = headerNames.nextElement(); String value = request.getHeader(name); System.out.println(name + "===========" + value); } } }
第二種方式:可以將請求和響應物件抽取出來放在一個超類中,需要使用這兩個物件的controller繼承這個類,直接使用即可,程式碼如下:
超類:
public class BaseController { // 這些物件何以直接被子類使用 protected HttpServletRequest request; protected HttpServletResponse response; protected HttpSession session; @ModelAttribute public void setReqAndRes(HttpServletRequest req,HttpServletResponse res) { this.request = req; this.response = res; this.session = req.getSession(); } }
子類:
@RestController public class Test3Contrller extends BaseController{ @RequestMapping("/testreq2") public void test() { try { response.getWriter().write("hello"); } catch (IOException e) { e.printStackTrace(); } Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String name = headerNames.nextElement(); String value = request.getHeader(name); System.out.println(name + "===========" + value); } } }
可以看到第二種方式程式碼簡潔很多,如果對請求或者響應物件有大量的使用需求,例如需要從傳過來的請求頭中的token獲取使用者資訊,動態的返回結果時,建議使用第二種方式;
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。