因为struts2阻塞tokenSession的id值相同的访问,最初的访问结束后直接返回到正常处理代码,后面的访问略过,即只处理第一次访问。
按理说使用tokenSession可以不配置invalid.token的result,但是偶尔有种情况会提示“No result defined for action com.syq2cy.test.LoginAction and result invalid.token”,就是如下情况:
在<s:token/>的页面点击提交时,form提交前做了一次ajax访问,在这次ajax访问中会做tokenSession的id判断,但ajax访问未将tokenSession作为参数提交到后台,就会返回invalid.token。代码:
@Override
protected String handleToken(ActionInvocation invocation) throws Exception {
//see WW-2902: we need to use the real HttpSession here, as opposed to the map
//that wraps the session, because a new wrap is created on every request
HttpSession session = ServletActionContext.getRequest().getSession(true);
synchronized (session) {
if (!TokenHelper.validToken()) { //判断参数中是否有tokenSession ajax返回false
return handleInvalidToken(invocation); // 走这
}
return handleValidToken(invocation);
}
}
protected String handleInvalidToken(ActionInvocation invocation) throws Exception {
ActionContext ac = invocation.getInvocationContext();
HttpServletRequest request = (HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST);
HttpServletResponse response = (HttpServletResponse) ac.get(ServletActionContext.HTTP_RESPONSE);
String tokenName = TokenHelper.getTokenName();
String token = TokenHelper.getToken(tokenName);
if ((tokenName != null) && (token != null)) { // 都是null
......
}
return INVALID_TOKEN_CODE; // 即invalid.token
}
解决办法:
<interceptor-ref name="token">
<param name="includeMethods">login</param> // 加上这个就ok了
</interceptor-ref>
另:1、Unexpected Exception caught setting 'token' on...这个东西不必在意,是params的问题。
2、很多博客上都说第一次访问tokenSession比对成功后,session重新弄个数,这是不对的,应该是从session中清空这次的tokenSession,所以第二次访问的时候session中的tokenSession已经是null了,代码:public class TokenHelper{
public static boolean validToken(){
...
session.remove(tokenSessionName);
}
}
作者:sunyq
相关推荐
这里的`<interceptor-ref name="token">`指定了使用令牌拦截器,`<param name="sessionStatus">invalid.token</param>`设置了当令牌验证失败时的会话状态,以便在Action中检查并作出相应处理。 在Action类中,可以...
这样,当发生重复提交时,Struts2框架会自动处理并转向token.jsp页面,提示用户重复提交了表单。 对于第二种原因,即提交表单后刷新浏览器页面导致的重复提交,Struts2框架允许开发者通过配置结果视图的跳转方式来...
当拦截器识别到重复提交时,会返回一个特定的结果,例如 "invalid.token"。在这个例子中,这个结果将会重定向到 `NoBack.jsp` 页面。这个页面应该设计成用户友好的,提示用户提交已经被处理,或者页面可能已过期,...
为了解决这个问题,Struts1引入了“令牌”机制,也称为Token Session或Token Interceptor。下面我们将详细探讨如何使用Struts1的令牌来防止页面重复提交。 ### 1. 令牌机制概述 令牌机制的基本思路是在用户提交...
这里`<s:token>`标签的作用是在页面上生成一个隐藏字段,其值即为`session`中存储的令牌值。`name`属性指定了令牌在`session`中的名称。 ##### 2. 表单提交时的验证 当用户提交表单时,Struts2会检查表单中包含的...
当用户再次提交表单时,如果提交的令牌与会话中的令牌不匹配,拦截器就会识别为重复提交,并返回一个错误提示(如"invalidToken"),防止请求继续执行。 接下来,我们需要一个工具类`RandomGUIDUtil`来生成唯一的...
当ASP.NET检测到POST请求中的数据与服务器端渲染的数据不匹配时,会抛出异常,提示信息通常为:“Invalid postback or callback argument.”。这是因为客户端提交的数据未能通过服务器的安全验证机制。 ##### 2.3 ...
这是一个常见的问题,当用户提交表单时,由于网络延迟或其他原因导致页面没有及时跳转,用户可能会反复点击提交按钮,造成重复数据的插入。为了避免这种情况,Struts2提供了一个名为`token`的拦截器。 `token`拦截...
- 检查请求参数中的令牌(`strToken`)是否与会话中的令牌(`strRequestToken`)相匹配,如果不匹配则表示可能存在重复提交,此时需要更新令牌并返回错误提示("invalidToken")。 - 如果令牌匹配,那么更新会话中...