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

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

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

    duansky'weblog

    統計

    留言簿(3)

    友情鏈接

    閱讀排行榜

    評論排行榜

    通過xml配置搞定Struts重復提交問題(轉)

    在webWork中有Token標簽,可以直接搞定重復提交的問題,但在Struts2.0以下的版本,傳統的做法只有通過提供的Token編程來搞定,代碼雖然不多但是,這樣的細節涉及了兩個Action,對于頁面的跳轉控制來說是一個額外的負擔,必須處處小心,本文闡述了如何通過Filter通過配置來避免struts的Form重復提交問題。
    核心代碼如下:

    package?com.yapulan.util.filter;?

    import
    ?java.io.IOException;?
    import
    ?java.util.HashMap;?
    import
    ?java.util.Iterator;?
    import
    ?java.util.List;?

    import
    ?javax.servlet.Filter;?
    import
    ?javax.servlet.RequestDispatcher;?
    import
    ?javax.servlet.ServletException;?
    import
    ?javax.servlet.FilterConfig;?
    import
    ?javax.servlet.http.HttpServletRequest;?
    import
    ?javax.servlet.http.HttpServletResponse;?
    import
    ?javax.servlet.FilterChain;?
    import
    ?javax.servlet.ServletRequest;?
    import
    ?javax.servlet.ServletResponse;?

    import
    ?org.apache.log4j.Logger;?
    import
    ?org.apache.struts.action.Action;?
    import
    ?org.apache.struts.action.ActionForm;?
    import
    ?org.apache.struts.action.ActionForward;?
    import
    ?org.apache.struts.action.ActionMapping;?
    import
    ?org.dom4j.Document;?
    import
    ?org.dom4j.Element;?
    import
    ?org.dom4j.io.SAXReader;?

    /**?
    *?重復提交令牌自動加載器?功能:讀取過濾器中設置的信息,讀入令牌設置組?
    */
    ?

    public?class?TokenFilter?implements?Filter?
    {?

    private?String?TokenConfig?=?"TokenConfig.xml"
    ;?
    private?HashMap?TokenMap?=?null
    ;?
    private?HashMap?ErrorMap?=?null
    ;?
    protected
    ?FilterConfig?filterConfig;?
    static?Logger?logger?=?Logger.getLogger(TokenFilter.class
    .getName());?

    public?void?init(FilterConfig?config)?throws?ServletException?
    {?
    this.filterConfig?=
    ?config;?
    this.TokenConfig?=?config.getInitParameter("tokenfile"
    );?
    logger.debug(
    "Tokenlist?init?OK!"
    );?
    }
    ?

    /**?
    *?初始化系統的xml文件,讀入令牌列表?
    */
    ?
    @SuppressWarnings(
    {?"unchecked",?"deprecation"?}
    )?
    public?void?initConfig(ServletRequest?srequest)?
    {?

    HttpServletRequest?httpRequest?
    =
    ?(HttpServletRequest)?srequest;?
    try?
    {?

    TokenMap?
    =?new
    ?HashMap();?
    ErrorMap?
    =?new
    ?HashMap();?

    SAXReader?reader?
    =?new
    ?SAXReader();?
    Document?document?
    =?reader.read(httpRequest.getRealPath(this
    .TokenConfig));?
    List?list1?
    =?document.getRootElement().selectNodes("/TokenList/Token/TokenForm"
    );?
    List?list2?
    =?document.getRootElement().selectNodes("/TokenList/Token/TokenAction"
    );?
    List?list3?
    =?document.getRootElement().selectNodes("/TokenList/Token/ErrorPage"
    );?

    Iterator?iter1?
    =
    ?list1.iterator();?
    Iterator?iter2?
    =
    ?list2.iterator();?
    Iterator?iter3?
    =
    ?list3.iterator();?
    while?(iter1.hasNext()&&iter2.hasNext()&&iter3.hasNext())?
    {?
    Element?element1?
    =
    ?(Element)?iter1.next();?
    Element?element2?
    =
    ?(Element)?iter2.next();?
    Element?element3?
    =
    ?(Element)?iter3.next();?
    TokenMap.put(element1.getStringValue(),?element2.getStringValue());?
    ErrorMap.put(element1.getStringValue(),?element3.getStringValue());?
    }
    ?
    logger.debug(
    "TokenFilter?Read?"
    ?
    +?httpRequest.getRealPath(this
    .TokenConfig)?
    +?"?is?OK!"
    );?
    }
    ?catch?(Exception?e)?{?
    logger.error(
    "TokenFilter?Read?"
    ?
    +?httpRequest.getRealPath(this
    .TokenConfig)?
    +?"?is?Error!"
    );?
    }
    ?

    }
    ?

    public?void
    ?doFilter(ServletRequest?srequest,?ServletResponse?sresponse,?
    FilterChain?chain)?
    throws?IOException,?ServletException?
    {?

    HttpServletRequest?httpRequest?
    =
    ?(HttpServletRequest)?srequest;?

    try?
    {?
    //取出實際的文件路徑直接調用文件,如index.html,login.jsp等?

    String?toURI?=?httpRequest.getRequestURI().replaceFirst(httpRequest.getContextPath(),?"");?
    if?(TokenMap==null
    )?
    {?
    initConfig(httpRequest);?
    }
    ?
    //檢測為提交jsp頁?

    if?(TokenMap.get(toURI)?!=?null)?
    {?
    FromTokenAction?token?
    =?new
    ?FromTokenAction();?
    token.execute(
    null,?null
    ,?srequest,?sresponse);?
    httpRequest.getSession().setAttribute(
    "PRE_TOKEN_FORM"
    ,?toURI);?
    logger.debug(
    "TokenFilter?save?'"+toURI?+"'?at?'PRE_TOKEN_FORM'?of?Session!"
    );?
    logger.debug(
    "TokenFilter?saveToken?to?'"+toURI?+"'?is?OK!"
    );?
    chain.doFilter(srequest,?sresponse);?
    return
    ;?
    }
    ?

    @SuppressWarnings(
    "unused"
    )?
    String?preURI?
    =(String)httpRequest.getSession().getAttribute("PRE_TOKEN_FORM"
    );?
    //檢測到為Action接收提交頁面?

    if?(TokenMap.get(preURI).equals(toURI))?
    {?
    TOTokenAction?token?
    =?new
    ?TOTokenAction();?
    token.execute(
    null,?null
    ,?srequest,?sresponse);?
    chain.doFilter(srequest,?sresponse);?
    return
    ;?
    }
    ?


    }
    ?catch?(Exception?e)?
    {?
    logger.error(e);?
    }
    ?

    chain.doFilter(srequest,?sresponse);?
    }
    ?

    public?void?setFilterConfig(final?FilterConfig?filterConfig)?
    {?
    this.filterConfig?=
    ?filterConfig;?
    }
    ?

    public?void?destroy()?
    {?
    TokenMap.clear();?
    ErrorMap.clear();?
    this.filterConfig?=?null
    ;?
    }
    ?

    //檢測到需要令牌增加一個令牌?

    public?class?FromTokenAction?extends?Action?{?
    public
    ?ActionForward?execute(ActionMapping?mapping,?ActionForm?form,?
    HttpServletRequest?request,?HttpServletResponse?response)?
    {?
    this
    .saveToken(request);?
    return?null
    ;?
    }
    ?
    }
    ?

    //到達Action前檢測令牌?

    public?class?TOTokenAction?extends?Action?{?
    public
    ?ActionForward?execute(ActionMapping?mapping,?ActionForm?form,?
    HttpServletRequest?request,?HttpServletResponse?response)?
    {?
    @SuppressWarnings(
    "unused"
    )?
    String?preURI?
    =(String)request.getSession().getAttribute("PRE_TOKEN_FORM"
    );?
    //如果檢測令牌錯誤執行錯誤頁,正確將繼續執行?

    if?(!isTokenValid(request,?true))?
    {?
    @SuppressWarnings(
    "unused"
    )?
    String?toURI?
    =
    ?(String)ErrorMap.get(preURI);?
    if?(toURI!=null
    )?
    {?
    RequestDispatcher?disp?
    =
    ?request.getRequestDispatcher(toURI);?
    try?
    {?
    disp.forward(request,?response);?

    }
    catch
    (Exception?e)?
    {?
    logger.error(e);?
    }
    ?
    }
    ?
    }
    ?
    return?null
    ;?
    }
    ?
    }
    ?

    }
    ?

    Web.xml的配制
    <!--?令牌自動加載配制?-->?
    <filter>?
    <filter-name>tokenFilter</filter-name>?
    <filter-class>com.yapulan.util.filter.TokenFilter</filter-class>?
    <init-param>?
    <param-name>tokenfile</param-name>?
    <param-value>/WEB-INF/TokenConfig.xml</param-value>?
    </init-param>?
    </filter>?

    注意:將代碼包中web.xml做以下修改:

    <filter-mapping>?
    <filter-name>tokenFilter</filter-name>?
    <url-pattern/*</url-pattern>?
    </filter-mapping>?
    設置好過濾器,只要配置列表即可避免所有的重復提交問題,不必在編程時再次考慮了

    <?xml?version="1.0"?encoding="UTF-8"?>?
    <TokenList?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?xsi:noNamespaceSchemaLocation="TokenConfig.xsd">?
    <Token>?
    <TokenForm>/index.jsp</TokenForm>?
    <TokenAction>/TokenAction.do</TokenAction>?
    <ErrorPage>/error.html</ErrorPage>?
    </Token>?
    <Token>?
    <TokenForm>/index1.jsp</TokenForm>?
    <TokenAction>/TokenAction1.do</TokenAction>?
    <ErrorPage>/error1.jsp</ErrorPage>?
    </Token>?
    <Token>?
    <TokenForm>/index2.jsp</TokenForm>?
    <TokenAction>/TokenAction2.do</TokenAction>?
    <ErrorPage>/error2.jsp</ErrorPage>?
    </Token>?
    <Token>?
    <TokenForm>/index3.jsp</TokenForm>?
    <TokenAction>/TokenAction3.do</TokenAction>?
    <ErrorPage>/error3.jsp</ErrorPage>?
    </Token>?
    </TokenList>?
    注意:本代碼可以很好的驗證非法的提交,對于管理非法的提交是一個不可多得的具有一定安全意義封裝。
    請熱心的朋友分析有無其它沒有考慮的細節問題,并且是否有可以進一部完善的地方,謝謝!

    轉自:http://www.tkk7.com/SE7EN/archive/2008/08/14/222083.html

    posted on 2008-11-29 02:22 duansky 閱讀(295) 評論(0)  編輯  收藏 所屬分類: Java

    主站蜘蛛池模板: 亚洲视频免费观看| 国产精品亚洲五月天高清| 国产91色综合久久免费分享| 亚洲国产精品综合久久20| 亚洲国产人成中文幕一级二级| 在线播放免费人成毛片乱码| 亚洲AV成人噜噜无码网站| 亚洲国产综合精品一区在线播放| 午夜视频在线免费观看| 亚洲Av永久无码精品一区二区| 亚洲免费人成在线视频观看| 无码国产精品一区二区免费式直播 | 亚洲春色在线视频| 天天摸天天操免费播放小视频| 人妻仑乱A级毛片免费看| 亚洲理论片在线观看| 亚洲国产一成久久精品国产成人综合| 性色午夜视频免费男人的天堂| 国产精品亚洲精品日韩电影| 色婷婷六月亚洲婷婷丁香| 亚洲国产综合精品中文字幕| 97在线观免费视频观看| a级成人毛片免费视频高清| 亚洲日本成本人观看| 老司机亚洲精品影院无码| 亚洲黄黄黄网站在线观看| 毛片免费在线观看网站| 鲁丝片一区二区三区免费| 黄页免费视频播放在线播放| 亚洲国产人成在线观看| 亚洲成A人片777777| 免费一看一级毛片| 在线看片人成视频免费无遮挡| 无码AV片在线观看免费| 九九热久久免费视频| 成人精品国产亚洲欧洲| 亚洲中文字幕一二三四区苍井空| 亚洲成人激情在线| 亚洲精品无码精品mV在线观看| 免费**毛片在线播放直播| 成年大片免费视频|