【问题标题】:Spring MVC - Add custom CSRF Header to all HTTP responsesSpring MVC - 将自定义 CSRF 标头添加到所有 HTTP 响应
【发布时间】:2019-02-06 16:07:17
【问题描述】:

在我的 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. doFilter 方法在控制器执行之前(而不是之后)调用

我真的很想深入了解如何处理这些拦截器,所以有人可以举个例子来解释我可以操纵HttpServletResponse 以实现我的目标的最佳位置吗?

【问题讨论】:

  • 您好 fantaghirocco 感谢您的回答!不幸的是,OncePerRequestFilter 具有与过滤器相同的行为。我正在寻找在控制器返回后触发的东西,以便捕获返回值并对响应头执行一些操作。
  • 1.与拦截器中的相同。调用doFilter 之前的所有内容都在控制器之前调用,doFilter 之后的所有内容都在控制器之后调用。方法调用通过,所以你可以同时做。

标签: java spring spring-mvc csrf-protection


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多