<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 々上善若水々 閱讀(5535) 評論(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
    主站蜘蛛池模板: 亚洲毛片在线观看| 精品亚洲成α人无码成α在线观看 | 亚洲激情中文字幕| 久久黄色免费网站| 日韩亚洲Av人人夜夜澡人人爽| 大地资源中文在线观看免费版| 中文字幕中韩乱码亚洲大片| 国产男女爽爽爽免费视频| 亚洲一区二区三区自拍公司| 美女被免费网站91色| 亚洲av午夜福利精品一区人妖| 免费人成毛片动漫在线播放| 久久亚洲国产成人精品性色 | 免费可以看黄的视频s色| 久久亚洲日韩看片无码| 91久久精品国产免费一区| 亚洲成人高清在线观看| 成人黄软件网18免费下载成人黄18免费视频| 亚洲av无码一区二区三区观看| 四虎成人免费大片在线| 曰韩无码AV片免费播放不卡| 国产av无码专区亚洲av果冻传媒| 精品国产污污免费网站| 中文字幕亚洲综合久久| 午夜免费福利网站| 一本久久A久久免费精品不卡| 亚洲AV无一区二区三区久久| 成人黄色免费网站| 国产成人综合亚洲一区| 亚洲va久久久噜噜噜久久| 国产精品久久久久久久久免费| 亚洲av无码兔费综合| 色久悠悠婷婷综合在线亚洲| 中文字幕免费观看| 美女裸免费观看网站| 亚洲爆乳无码专区| 日本免费高清一本视频| 免费无码又爽又刺激网站直播| 亚洲1234区乱码| 亚洲国产精品无码久久久秋霞2| 蜜桃视频在线观看免费网址入口|