Spring MVC-将自定义CSRF标头添加到所有HTTP响应

时间:2018-08-31 15:26:01

标签: java spring spring-mvc csrf-protection

在Spring MVC应用程序中,我想在带注释的控制器方法上实现一种CSRF标头。

我已经在HandlerInterceptorAdapter.preHandle方法上实现了100%正常工作的客户端CSRF标头解析器,并且我曾经尝试在同一处理程序中为afterCompletion内部的响应生成标头,因为这似乎成为最适合我的地方:

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
        throws Exception {
    if (handler instanceof HandlerMethod) {
        HandlerMethod handlerMethod = (HandlerMethod) handler;

        boolean requestCheck = handlerMethod.getMethodAnnotation(CSRF.class) != null;

        if (requestCheck && handlerMethod.getMethodAnnotation(CSRF.class).response()) {
            response.addHeader(payloadEncryptedHeaderName, SecureUtil.buildCsrfHeader(salt, response));
        }
    }

    super.afterCompletion(request, response, handler, ex);
}

有人在this线程中告诉我,我不能使用该方法,最好使用过滤器,但我注意到在doFilter中...

  
      
  1. 无法为响应设置标头(或者至少我找不到方法)
  2.   
  3. 在控制器执行之前(而不是之后)调用方法doFilter
  4.   

我真的很想深入了解如何处理这些拦截器,所以有人可以通过一个例子向我解释一下我可以操纵HttpServletResponse来达到目标​​的最佳位置吗?

1 个答案:

答案 0 :(得分:0)

在我的另一个线程here上找到了解决方案,为了实现我的目标,一切都使用ResponseBodyAdvice