日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring的OncePerRequestFilter的作用

發布時間:2025/3/21 javascript 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring的OncePerRequestFilter的作用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在spring中,filter都默認繼承OncePerRequestFilter,但為什么要這樣呢?

?

OncePerRequestFilter顧名思義,他能夠確保在一次請求只通過一次filter,而不需要重復執行。

?

Java代碼??

  • public?final?void?doFilter(ServletRequest?request,?ServletResponse?response,?FilterChain?filterChain)??
  • ????????????throws?ServletException,?IOException?{??
  • ??
  • ????????if?(!(request?instanceof?HttpServletRequest)?||?!(response?instanceof?HttpServletResponse))?{??
  • ????????????throw?new?ServletException("OncePerRequestFilter?just?supports?HTTP?requests");??
  • ????????}??
  • ????????HttpServletRequest?httpRequest?=?(HttpServletRequest)?request;??
  • ????????HttpServletResponse?httpResponse?=?(HttpServletResponse)?response;??
  • ??
  • ????????String?alreadyFilteredAttributeName?=?getAlreadyFilteredAttributeName();??
  • ????????if?(request.getAttribute(alreadyFilteredAttributeName)?!=?null?||?shouldNotFilter(httpRequest))?{??
  • ????????????//?Proceed?without?invoking?this?filter...??
  • ????????????filterChain.doFilter(request,?response);??
  • ????????}??
  • ????????else?{??
  • ????????????//?Do?invoke?this?filter...??
  • ????????????request.setAttribute(alreadyFilteredAttributeName,?Boolean.TRUE);??
  • ????????????try?{??
  • ????????????????doFilterInternal(httpRequest,?httpResponse,?filterChain);??
  • ????????????}??
  • ????????????finally?{??
  • ????????????????//?Remove?the?"already?filtered"?request?attribute?for?this?request.??
  • ????????????????request.removeAttribute(alreadyFilteredAttributeName);??
  • ????????????}??
  • ????????}??
  • ????}??
  • ?

    大家常識上都認為,一次請求本來就只過一次,為什么還要由此特別限定呢,呵呵實際上我們常識和實際的實現并不真的一樣,經過一番查閱后,此方式是為了兼容不同的web container,特意而為之(jsr168),也就是說并不是所有的container都像我們期望的只過濾一次,servlet版本不同,表現也不同:。

    ?

    ?寫道

    /**
    * Filter base class that guarantees to be just executed once per request,
    * on any servlet container. It provides a {@link #doFilterInternal}
    * method with HttpServletRequest and HttpServletResponse arguments.
    *
    * <p>The {@link #getAlreadyFilteredAttributeName} method determines how
    * to identify that a request is already filtered. The default implementation
    * is based on the configured name of the concrete filter instance.
    *
    * @author Juergen Hoeller
    * @since 06.12.2003
    */

    ?

    如,servlet2.3與servlet2.4也有一定差異

    ?寫道

    在servlet-2.3中,Filter會過濾一切請求,包括服務器內部使用forward轉發請求和<%@ include file="/index.jsp"%>的情況。

    到了servlet-2.4中Filter默認下只攔截外部提交的請求,forward和include這些內部轉發都不會被過濾,但是有時候我們需要 forward的時候也用到Filter。

    ?

    因此,為了兼容各種不同的運行環境和版本,默認filter繼承OncePerRequestFilter是一個比較穩妥的選擇。

    總結

    以上是生活随笔為你收集整理的Spring的OncePerRequestFilter的作用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。