在springMVC的controller中获取request,response对象的一个方法

问题描述:

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



如果您认为这篇文章还不错或者有所收获,您可以通过右边的“打赏”功能 打赏我一杯咖啡【物质支持】,也可以点击文章下方“推荐”按钮【精神支持】,您的“推荐”将是我最大的写作动力!
欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!
posted @   三人成虎  阅读(2746)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
历史上的今天:
2012-03-31 花生壳原理求解

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示