1)当用户通过SSO登录我们的系统时,我们会生成一个随机令牌并将其保存在服务器端的会话代码中,因此只会在用户登录后生成一次
if(slingRequest.getSession().getAttribute("csrfToken") == null){
UUID uuidRandom = UUID.randomUUID();
String Guid = "_" + uuidRandom.toString();
log.info("Random CSRF number Generated is "+Guid);
slingRequest.getSession().setAttribute("csrfToken",Guid);
}
2)在每一页上,我们都是从会话中读取并将此值保存在隐藏字段代码中,如
<%String csrfToken="";
if(null != request.getSession() && null != request.getSession().getAttribute("csrfToken")){
csrfToken=(String)request.getSession().getAttribute("csrfToken");
pageContext.setAttribute("csrfToken",csrfToken);
}
%>
<input type="text" id="csrfToken" value="${csrfToken}" style="display:none;" name="csrfToken">
3)在每个POST请求中,我们将这个存储在隐藏字段中的csrfToken发送到服务器并在后端使用从服务器端的会话中检索到的值进行验证,如果它是相同的则请求有效,否则不是。 / p>
if(csrfToken.equals(request.getSession().getAttribute("csrfToken").toString() ))
4)注销时,我们使会话无效并从会话中删除令牌。
request.getSession().removeAttribute("csrfToken");
request.getSession().removeAttribute("globalAccountHolder");
request.getSession().invalidate();
问题: 有时,pagesource / hidden字段值显示为与之前会话中相同,即在注销值之前。即步骤2显示较旧的值,当执行步骤3时,令牌的匹配失败,但如果我们使用Cntrl + R重新加载页面,则隐藏的字段值将正确显示并起作用。所以无法理解这是否是页面的浏览器缓存问题?
尝试的解决方案:作为解决方案,我们在响应标头中设置了no-cache,但这不起作用。
您是否还有其他可以想到的解决方案,例如在页眉中包含任何元标记,还是某些其他解决方案? 另外这个问题我有时也不会每次都面临