栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

如何在springMVC的controller中获取request

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在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 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获取用户信息,动态的返回结果时,建议使用第二种方式;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/135863.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号