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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

Spring的OncePerRequestFilter的作用

發(fā)布時(shí)間:2025/3/21 javascript 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring的OncePerRequestFilter的作用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

?

OncePerRequestFilter顧名思義,他能夠確保在一次請(qǐng)求只通過(guò)一次filter,而不需要重復(fù)執(zhí)行。

?

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);??
  • ????????????}??
  • ????????}??
  • ????}??
  • ?

    大家常識(shí)上都認(rèn)為,一次請(qǐng)求本來(lái)就只過(guò)一次,為什么還要由此特別限定呢,呵呵實(shí)際上我們常識(shí)和實(shí)際的實(shí)現(xiàn)并不真的一樣,經(jīng)過(guò)一番查閱后,此方式是為了兼容不同的web container,特意而為之(jsr168),也就是說(shuō)并不是所有的container都像我們期望的只過(guò)濾一次,servlet版本不同,表現(xiàn)也不同:。

    ?

    ?寫道

    /**
    * 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會(huì)過(guò)濾一切請(qǐng)求,包括服務(wù)器內(nèi)部使用forward轉(zhuǎn)發(fā)請(qǐng)求和<%@ include file="/index.jsp"%>的情況。

    到了servlet-2.4中Filter默認(rèn)下只攔截外部提交的請(qǐng)求,forward和include這些內(nèi)部轉(zhuǎn)發(fā)都不會(huì)被過(guò)濾,但是有時(shí)候我們需要 forward的時(shí)候也用到Filter。

    ?

    因此,為了兼容各種不同的運(yùn)行環(huán)境和版本,默認(rèn)filter繼承OncePerRequestFilter是一個(gè)比較穩(wěn)妥的選擇。

    總結(jié)

    以上是生活随笔為你收集整理的Spring的OncePerRequestFilter的作用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。