在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
中...
- 无法为响应设置标头(或者至少我找不到方法)
- 在控制器执行之前(而不是之后)调用方法
doFilter
我真的很想深入了解如何处理这些拦截器,所以有人可以通过一个例子向我解释一下我可以操纵HttpServletResponse
来达到目标的最佳位置吗?