<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
    主站蜘蛛池模板: 一二三四视频在线观看中文版免费| 一级大黄美女免费播放| 亚洲日韩精品无码专区加勒比☆| 免费一级特黄特色大片| 777成影片免费观看| 免费很黄很色裸乳在线观看| 亚洲日本精品一区二区| 看Aⅴ免费毛片手机播放| 国产黄色免费网站| 亚洲精品乱码久久久久久| 亚洲日韩精品无码专区加勒比| 成年女人18级毛片毛片免费| 亚洲国产精品国自产拍电影| 免费国产黄网站在线观看可以下载| 亚洲狠狠爱综合影院婷婷| 亚洲日本VA午夜在线电影| 青青草国产免费久久久下载| 亚洲一区二区三区91| 十九岁在线观看免费完整版电影| 亚洲高清偷拍一区二区三区 | 国产色爽免费无码视频| 青青青青青青久久久免费观看| 亚洲AV网一区二区三区 | 最近2019免费中文字幕6| 亚洲女人18毛片水真多| 一级毛片免费播放| 亚洲免费在线视频观看| 每天更新的免费av片在线观看 | 日韩午夜免费视频| 亚洲激情视频图片| 免费无码又爽又刺激聊天APP| 亚洲自偷自拍另类图片二区| 久久久久成人片免费观看蜜芽| 亚洲国产美女精品久久久久| 在线日韩av永久免费观看| 在线观看人成视频免费无遮挡| 久久精品国产亚洲AV不卡| 亚洲视频在线免费| 国产成人精品曰本亚洲79ren| 一区二区3区免费视频| 亚洲精品动漫在线|