首页 > 代码库 > [Struts]Token 使用及原理

[Struts]Token 使用及原理

 

 

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完毕后,将得到的唯一值setAttribute到session中。

 

            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=http://www.mamicode.com/"");

                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="http://www.mamicode.com/6aa35341f25184fd996c4c918255c3ae">

 

的隐藏标签。

 

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

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

[Struts]Token 使用及原理