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

  • 因昨天接到一个需求,关于数据安全问题需要设置请求和响应头信息,也就是我们系统请求外系统和本系统接收到的请求进行设置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源码还是太粗心了。。还需要学习啊。。。
  • 9
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值