您现在的位置:首页 > >

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

发布时间:

因昨天接到一个需求,关于数据安全问题需要设置请求和响应头信息,也就是我们系统请求外系统和本系统接收到的请求进行设置header属性一开始感觉这岂不是很简单,只需要使用拦*骷纯.思路是没有错了.但是拦*鞯姆椒ㄒ褂枚裕裨蚰憔突嵩阡榔鞯膎etwork中发现死活没有返回你设置的header,下面贴代码关于springboot拦*鞯氖褂茫氩慰約pringboot拦*

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源码还是太粗心了。。还需要学*啊。。。


热文推荐
猜你喜欢
友情链接: