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

  • 相关阅读:
    进程与线程(二)(线程池)
    进程与线程(一)(基本定义和demo)
    SpringBoot的整合(二、整合redis)
    SpringBoot的整合(一、定时任务task)
    Thymeleaf的学习(二)(常用标签的使用方法)
    程序员常用单词词汇汇总
    程序员代码打字练习题库
    浅谈原型对象和原型链(源于学习整理笔记)
    JS中this的四种用法
    VS code自定义用户代码片段snippet
  • 原文地址:https://www.cnblogs.com/shininguang/p/4922880.html
Copyright © 2020-2023  润新知