Struts Token 使用

 

1,先在一个Action中,调用saveToken(HttpServletRequest request)方法。然后转向带有表单的JSP页面。

 

2,在JSP页面提交表单给一个Action,再这个Action中进行是否为重复提交的判断。

              if (isTokenValid(request, true)) {

                     
// 未重复提交时,正确的时候应该做的事情

                  
return mapping.findForward("success");

              }
 else {

            
// 重复提交时,需要做的事情

                  saveToken(request);

                  
return mapping.findForward("error");

              }

 

Struts Token 机制:

 

1,  由第一个Action调用saveToken(HttpServletRequest request),这个方法内部实现如下:

    protected void saveToken(HttpServletRequest request) {

        token.saveToken(request);

}

 

        token.saveToken(request);

       这个方法的实现如下:

    public synchronized void saveToken(HttpServletRequest request) {

 

        HttpSession session 
= request.getSession();

        String token 
= generateToken(request);

        
if (token != null{

            session.setAttribute(Globals.TRANSACTION_TOKEN_KEY, token);

        }


}


 

这个方法调用generateToken方法实现如下:

    public synchronized void saveToken(HttpServletRequest request) {

 

        HttpSession session 
= request.getSession();

        String token 
= generateToken(request);

        
if (token != null{

            session.setAttribute(Globals.TRANSACTION_TOKEN_KEY, token);

        }


}


 

generateToken完毕后,将得到的唯一值setAttributesession中。

 

            session.setAttribute(Globals.TRANSACTION_TOKEN_KEY, token);

 

 

Globals.TRANSACTION_TOKEN_KEY的值是:” org.apache.struts.action.TOKEN”

 

 

然后跳转到JSP页面。

 

 

2,  JSP页面的Struts自定义标签 <html:form>的标签类:org.apache.struts.taglib.html. FormTag

 

这个类的doStartTag()方法会调用本类的renderToken()方法。

    protected String renderToken() {

        StringBuffer results 
= new StringBuffer();

        HttpSession session 
= pageContext.getSession();

 

        
if (session != null{

            String token 
=

                (String) session.getAttribute(Globals.TRANSACTION_TOKEN_KEY);

                

            
if (token != null{

                results.append(
"<input type=\"hidden\" name=\"");

                results.append(Constants.TOKEN_KEY);

                results.append(
"\" value=\"");

                results.append(token);

                
if (this.isXhtml()) {

                    results.append(
"\" />");

                }
 else {

                    results.append(
"\">");

                }


            }


        }


 

        
return results.toString();

}

 

 

这样子会生成类似于

 

<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" 
         value
="6aa35341f25184fd996c4c918255c3ae">

 

的隐藏标签。

 

然后提交到一个Action中,在Action中用isTokenValid()方法进行比较session” org.apache.struts.action.TOKEN”的这个key所对应的值和提交来的request中的” org.apache.struts.action.TOKEN”的这个value是否一致。

如果为true,那么证明可以提交。如果为false,证明已经重复,不允许提交。