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

  • 相关阅读:
    协程-Greenlet
    协程简介-异步IO
    关于__name__=='__main__
    进程池-限制同一时间在CPU上运行的进程数
    STM32丰富的资料网站(库函数手册)
    STM32CubeMX入门之点亮板载LED
    STM32CUBEMX忘记配置sys中的debug导致程序只能下载一次的问题
    GX Works2 存储器空间或桌面堆栈不足 解决方案
    Lua安装报错:编译 Lua 报错:error: readline/readline.h: No such file or directory 问题解决办法
    Ubuntu18.04不能联网问题
  • 原文地址:https://www.cnblogs.com/shininguang/p/4922880.html
Copyright © 2011-2022 走看看