`
syq891015
  • 浏览: 11889 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

使用tokenSession时提示没有invalid.token的问题

阅读更多

因为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

分享到:
评论

相关推荐

    [浪曦原创]Struts系列 第9讲 Struts的令牌使用(zk001)

    这里的`&lt;interceptor-ref name="token"&gt;`指定了使用令牌拦截器,`&lt;param name="sessionStatus"&gt;invalid.token&lt;/param&gt;`设置了当令牌验证失败时的会话状态,以便在Action中检查并作出相应处理。 在Action类中,可以...

    Struts2解决表单重复提交

    这样,当发生重复提交时,Struts2框架会自动处理并转向token.jsp页面,提示用户重复提交了表单。 对于第二种原因,即提交表单后刷新浏览器页面导致的重复提交,Struts2框架允许开发者通过配置结果视图的跳转方式来...

    struts2中防止重复提交的方法

    当拦截器识别到重复提交时,会返回一个特定的结果,例如 "invalid.token"。在这个例子中,这个结果将会重定向到 `NoBack.jsp` 页面。这个页面应该设计成用户友好的,提示用户提交已经被处理,或者页面可能已过期,...

    struts1的令牌解决页面重复提交问题

    为了解决这个问题,Struts1引入了“令牌”机制,也称为Token Session或Token Interceptor。下面我们将详细探讨如何使用Struts1的令牌来防止页面重复提交。 ### 1. 令牌机制概述 令牌机制的基本思路是在用户提交...

    struts2令牌

    这里`&lt;s:token&gt;`标签的作用是在页面上生成一个隐藏字段,其值即为`session`中存储的令牌值。`name`属性指定了令牌在`session`中的名称。 ##### 2. 表单提交时的验证 当用户提交表单时,Struts2会检查表单中包含的...

    自定义拦截器实现防止重复提交

    当用户再次提交表单时,如果提交的令牌与会话中的令牌不匹配,拦截器就会识别为重复提交,并返回一个错误提示(如"invalidToken"),防止请求继续执行。 接下来,我们需要一个工具类`RandomGUIDUtil`来生成唯一的...

    重复提交和回发或回调参数无效问题

    当ASP.NET检测到POST请求中的数据与服务器端渲染的数据不匹配时,会抛出异常,提示信息通常为:“Invalid postback or callback argument.”。这是因为客户端提交的数据未能通过服务器的安全验证机制。 ##### 2.3 ...

    Java中的Struts2框架拦截器之实例代码

    这是一个常见的问题,当用户提交表单时,由于网络延迟或其他原因导致页面没有及时跳转,用户可能会反复点击提交按钮,造成重复数据的插入。为了避免这种情况,Struts2提供了一个名为`token`的拦截器。 `token`拦截...

    自定义拦截器实现防止重复提交-5页.pdf

    - 检查请求参数中的令牌(`strToken`)是否与会话中的令牌(`strRequestToken`)相匹配,如果不匹配则表示可能存在重复提交,此时需要更新令牌并返回错误提示("invalidToken")。 - 如果令牌匹配,那么更新会话中...

Global site tag (gtag.js) - Google Analytics