怎么在springMVC中利用controller获取request

本篇文章给大家分享的是有关怎么在springMVC中利用controller获取request,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

创新互联公司成立于2013年,我们提供高端重庆网站建设公司成都网站制作成都网站设计、网站定制、营销型网站微信平台小程序开发、微信公众号开发、seo优化排名服务,提供专业营销思路、内容策划、视觉设计、程序开发来完成项目落地,为铜雕雕塑企业提供源源不断的流量和订单咨询。

ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
HttpServletResponse response = attributes.getResponse();
try {
  response.getWriter().write("hello");
} catch (IOException e) {
  e.printStackTrace();
}
Enumeration 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 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 headerNames = request.getHeaderNames();
    while (headerNames.hasMoreElements()) {
      String name = headerNames.nextElement();
      String value = request.getHeader(name);
      System.out.println(name + "===========" + value);
    }
 
  }
}

可以看到第二种方式代码简洁很多,如果对请求或者响应对象有大量的使用需求,例如需要从传过来的请求头中的token获取用户信息,动态的返回结果时,建议使用第二种方式;

以上就是怎么在springMVC中利用controller获取request,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。


网页名称:怎么在springMVC中利用controller获取request
网页网址:http://ybzwz.com/article/jdhpps.html