1. 程式人生 > 程式設計 >如何在springMVC的controller中獲取request

如何在springMVC的controller中獲取request

這篇文章主要介紹瞭如何在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獲取使用者資訊,動態的返回結果時,建議使用第二種方式;

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。