问题概述: 我们正在将我们的系统从CQ5.4升级到AEM 6.1。在现有代码中,我们使用ajax引用了POST.jsp,我们在其中调用身份验证服务来验证系统的外部用户。当我们对资源POST.jsp执行ajax发布时,我们收到以下错误。在error.log中。 com.adobe.granite.csrf.impl.CSRFFilter doFilter:提供的CSRF令牌无效
我们尝试了什么:
我们还解压缩了com.adobe.granite.csrf.impl.CSRFFilter并找到了以下代码:
public void doFilter(ServletRequest req, ServletResponse res, FilterChain Chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
if ((request.getAuthType() != null) && (isFilteredMethod(request)) && (doFilterBasedOnUserAgent(request)) && (!isValidRequest(request))) {
HttpServletResponse response = (HttpServletResponse)res;
this.logger.info("doFilter: the provided CSRF token is invalid");
response.sendError(403);
return;
}
chain.doFilter(req, res);
}
在上面的代码中,isFilteredMethod检查当前请求(POST)是否存在于已配置的Adobe Granite CSRF过滤器的过滤方法中。 doFilterBasedOnUserAgent检查配置的用户代理中是否缺少当前请求的用户代理。 在我们的例子中,request.getAuthType是“FORM”。所以这不会导致(403)。
isValidRequest获取请求参数:cq_csrf_token并检查此参数值是否有效。 (观察到这一点并在我们的案例中有效并发送参数)
那么过滤方法和用户代理的意义何在?为什么CSRF为POST.jsp发送403,尽管所有CQ和AEM 5.x版本都支持这种POSTING请求方式?
所以你可以做几件事 -