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,證明已經重復,不允許提交。