zoukankan      html  css  js  c++  java
  • token机制(Struts中知识点)

    token机制(Struts中知识点)

    http://www.cnblogs.com/yixianbin/articles/1440397.html

    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="");
                    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,证明已经重复,不允许提交。

  • 相关阅读:
    383 Ransom Note 赎金信
    382 Linked List Random Node 链表随机节点
    381 Insert Delete GetRandom O(1)
    380 Insert Delete GetRandom O(1)
    378 Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素
    377 Combination Sum IV 组合之和 IV
    376 Wiggle Subsequence 摆动序列
    SpringBoot(十四):springboot整合shiro-登录认证和权限管理
    SpringBoot(十三):springboot 小技巧
    SpringBoot(十二):springboot如何测试打包部署
  • 原文地址:https://www.cnblogs.com/shininguang/p/4922880.html
Copyright © 2011-2022 走看看