springboot设置返回的response中的header解决办法

您所在的位置:网站首页 response设置文件名未生效 springboot设置返回的response中的header解决办法

springboot设置返回的response中的header解决办法

2024-06-03 15:21| 来源: 网络整理| 查看: 265

因昨天接到一个需求,关于数据安全问题需要设置请求和响应头信息,也就是我们系统请求外系统和本系统接收到的请求进行设置header属性一开始感觉这岂不是很简单,只需要使用拦截器即可.思路是没有错了.但是拦截器的方法要使用对,否则你就会在浏览器的network中发现死活没有返回你设置的header,下面贴代码关于springboot拦截器的使用,请参考springboot拦截器 public class HttpResponseInterceptorHandler implements HandlerInterceptor { // 实现HandlerInterceptor 或者 继承HandlerInterceptorAdapter都可以,如果想看着简洁就使用后者 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { response.addHeader("content-test","123"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }

看的实现的方法后,大部分人第一想法就是在postHandle方法(后置处理)中进行处理,结果发现浏览器中并没有返回header名称为content-test,博主也感觉到奇怪。本来我以为是shiro的问题,后来发现并不是。还好博主之前阅读过spring的部分源码(装个X~嘿嘿),下面贴代码

// DispatcherServlet.java类 protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { ....省略代码 // #1 进行前置处理,进入controller方法之前的处理 if (!mappedHandler.applyPreHandle(processedRequest, response)) { return; } // #2 执行controller方法 mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); if (asyncManager.isConcurrentHandlingStarted()) { return; } applyDefaultViewName(processedRequest, mv); // #3 执行后置处理,也就是controller方法执行完成后进行的处理 mappedHandler.applyPostHandle(processedRequest, response, mv); ....省略代码 } 其实在#2代码行执行完后,数据已经返回给了请求者,所以在postHandle在添加header已经没有意义了。那么该如何处理,只需要把response.addHeader("content-test","123");这行代码移到preHandle方法中即可,如下 public class HttpResponseInterceptorHandler implements HandlerInterceptor { // 实现HandlerInterceptor 或者 继承HandlerInterceptorAdapter都可以,如果想看着简洁就使用后者 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { response.addHeader("content-test","123"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } } 切记preHandle返回值一定要是true

在这里插入图片描述

这样返回的header已经可以了,当初看spring源码还是太粗心了。。还需要学习啊。。。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3