- 因昨天接到一个需求,关于数据安全问题需要设置请求和响应头信息,也就是我们系统请求外系统和本系统接收到的请求进行设置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源码还是太粗心了。。还需要学习啊。。。