<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我的漫漫程序之旅

    專注于JavaWeb開發
    隨筆 - 39, 文章 - 310, 評論 - 411, 引用 - 0
    數據加載中……

    Struts1.x中的令牌(Token)使用

    使用token是為了防止重復提交,像灌水之類的.

    LoginAction:

    package com.web.action;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
    import org.apache.struts.actions.DispatchAction;

    public class LoginAction extends DispatchAction {
        
        
    public ActionForward get(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response)
                
    throws Exception {
            
    //保存令牌(保存在jsp動態生成的32位jsessionid)\
            this.saveToken(request);
            System.out.println(
    "begin save");
            
    return mapping.findForward("login");
        }

        
        
    public ActionForward login(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response)
                
    throws Exception {
            
    /*if(this.isTokenValid(request))
            {
                System.out.println("valid");
                this.resetToken(request);
                return mapping.findForward("ok");
            }
    */

            
    //這個寫法和上面注釋部分一樣效果
            if(this.isTokenValid(request,true))
            
    {
                System.out.println(
    "valid");
                
    return mapping.findForward("ok");
            }

            
    else
            
    {
                System.out.println(
    "invalid");
                
    return mapping.findForward("error");
            }

        }

    }

    struts-config.xml:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

    <struts-config>
        
    <data-sources />
        
    <form-beans>
            
    <form-bean name="loginForm" type="com.web.form.LoginForm"></form-bean>
        
    </form-beans>
        
    <global-exceptions />
        
    <global-forwards />
        
    <action-mappings>
            
    <action path="/login" parameter="method" name="loginForm"
                type
    ="com.web.action.LoginAction">
                
    <forward name="login" path="/login.jsp" />
                
    <forward name="ok" path="/ok.jsp" />
                
    <forward name="error" path="/error.jsp" />
            
    </action>
        
    </action-mappings>
        
    <message-resources parameter="" />
    </struts-config>


    index.jsp:
    <%@page contentType="text/html; charset=GBK"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <c:set var="ctx" value="${pageContext.request.contextPath}" />
    <html>
      
    <head>
        
    <title>My Jsp</title>
      
    </head>
      
    <body>
      
    <href="${ctx}/login.do?method=get">發言</a>
      
    </body>
    </html>

    login.jsp:
    <%@page contentType="text/html; charset=GBK"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <%@taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
    <html>
      
    <head>
        
    <title>My Jsp</title>
      
    </head>
      
    <body>
      
    <c:set var="ctx" value="${pageContext.request.contextPath}"/>
      
    <!-- 此處必須使用html標簽,否則token不能用 -->
      
    <html:form action="login.do?method=login" method="post">
        
    <html:submit value="提交"></html:submit>
      
    </html:form>
      
    </body>
    </html>

    當你運行第一次的時候,會提示你"成功".
    這時我們退到login.jsp查看一下源代碼:
    <html>
      
    <head>
        
    <title>My Jsp</title>
      
    </head>
      
    <body>
      
      
    <form name="loginForm" method="post" action="/strutsToken/login.do?method=login">
    <div><input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="d7484f95247cf242a6f35107a1c7ac25"></div>
        
    <input type="submit" value="提交">
      
    </form>
      
    </body>
    </html>
    對比一下我們寫的login.jsp多了一個隱藏域:
    <div><input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="d7484f95247cf242a6f35107a1c7ac25"></div>
    此時生成了一個32位的唯一的JsessionID做為值.
    與LoginAction中的get方法的saveToken(request)是一樣的.
    此句的作用就是把一個jsessionid保存到request范圍里.

    在我們后退重新調用:
    if(this.isTokenValid(request,true))
            
    {
                System.out.println(
    "valid");
                
    return mapping.findForward("ok");
            }
    時,就會拿login.jsp里傳過來的jsessionid和request的
    進行比較,如果一樣,說明不合法.因為我們的操作都是在一個請求會話里
    操作的.說明你在重復提交.
    如果不一樣,說明重新生成了一個唯一的jsessionid(新開一個瀏覽器),
    開啟了一個新會話,重新提交,這是合法的.
    這樣就防止了表單重復提交問題.
    源碼下載

    posted on 2008-01-13 23:17 々上善若水々 閱讀(5527) 評論(3)  編輯  收藏 所屬分類: JavaWeb

    評論

    # re: Struts1.x中的令牌(Token)使用  回復  更多評論   

    非常好,非常好,非常好
    2009-06-16 10:04 | GloomySunday

    # re: Struts1.x中的令牌(Token)使用[未登錄]  回復  更多評論   

    11
    2013-11-21 14:32 | 1

    # re: Struts1.x中的令牌(Token)使用[未登錄]  回復  更多評論   

    1111
    2013-11-21 14:32 | 1
    主站蜘蛛池模板: 美女被吸屁股免费网站| 亚洲日韩精品一区二区三区| 亚洲欧洲日本天天堂在线观看| 一级做a爱片特黄在线观看免费看| 在线观看av永久免费| 亚洲国产成人在线视频 | 乱人伦中文视频在线观看免费| 噼里啪啦电影在线观看免费高清| 亚洲VA中文字幕无码一二三区| 国产精品免费一区二区三区 | 91国内免费在线视频| 亚洲成aⅴ人片久青草影院| 特级毛片全部免费播放| 国产精品免费看久久久无码| 午夜在线a亚洲v天堂网2019| 青青草国产免费久久久下载| 色多多免费视频观看区一区| 亚洲а∨天堂久久精品| 91成人免费福利网站在线| 老汉色老汉首页a亚洲| 黄色片在线免费观看| 亚洲av无码专区青青草原| 亚洲国产香蕉人人爽成AV片久久| selaoban在线视频免费精品| 亚洲一区二区三区四区在线观看| 台湾一级毛片永久免费| 亚洲国产精品无码观看久久| 久久精品国产精品亚洲人人| 99视频免费播放| 亚洲入口无毒网址你懂的| 免费二级毛片免费完整视频| 中文字幕av免费专区| 亚洲人成影院午夜网站| 国产又大又粗又硬又长免费| 你懂的免费在线观看| 久久夜色精品国产噜噜亚洲a| 亚洲国产精品无码久久九九| 最近中文字幕免费完整| 麻豆亚洲AV成人无码久久精品 | 亚洲大香伊人蕉在人依线| 国产精品免费视频网站|