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

歡迎訪問 生活随笔!

生活随笔

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

javascript

008--【SpringBoot】过滤器,拦截器,切面

發布時間:2024/1/8 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 008--【SpringBoot】过滤器,拦截器,切面 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

0、 參考網址:

  • 攔截器和過濾器的區別:https://www.jianshu.com/p/7bd0cad17f23
  • Interceptor使用:https://blog.csdn.net/weixin_36927395/article/details/81067146

1、過濾器,攔截器,切面

  • 1.過濾器(Filter):所謂過濾器顧名思義是用來過濾的,Java的過濾器能夠為我們提供系統級別的過濾,也就是說,能過濾所有的web請求,
    這一點,是攔截器無法做到的。在Java Web中,你傳入的request,response提前過濾掉一些信息,或者提前設置一些參數,然后再傳入servlet或
    者struts的action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者struts
    的action前統一設置字符集,或者去除掉一些非法字符(聊天室經常用到的,一些罵人的話)。filter 流程是線性的,url傳來之后,檢查之后,
    可保持原來的流程繼續向下執行,被下一個filter, servlet接收。
  • 2.監聽器(Listener):Java的監聽器,也是系統級別的監聽。監聽器隨web應用的啟動而啟動。Java的監聽器在c/s模式里面經常用到,它
    會對特定的事件產生產生一個處理。監聽在很多模式下用到,比如說觀察者模式,就是一個使用監聽器來實現的,在比如統計網站的在線人數。
    又比如struts2可以用監聽來啟動。Servlet監聽器用于監聽一些重要事件的發生,監聽器對象可以在事情發生前、發生后可以做一些必要的處理。
  • 3.攔截器(Interceptor):java里的攔截器提供的是非系統級別的攔截,也就是說,就覆蓋面來說,攔截器不如過濾器強大,但是更有針對性。
    Java中的攔截器是基于Java反射機制實現的,更準確的劃分,應該是基于JDK實現的動態代理。它依賴于具體的接口,在運行期間動態生成字節碼。
    攔截器是動態攔截Action調用的對象,它提供了一種機制可以使開發者在一個Action執行的前后執行一段代碼,也可以在一個Action執行前阻止其
    執行,同時也提供了一種可以提取Action中可重用部分代碼的方式。在AOP中,攔截器用于在某個方法或者字段被訪問之前,進行攔截然后再之前或
    者之后加入某些操作。java的攔截器主要是用在插件上,擴展件上比如 Hibernate Spring Struts2等,有點類似面向切片的技術,在用之前先要在
    配置文件即xml,文件里聲明一段的那個東西。

2、過濾器

  • 以上可知:過濾器和攔截器有時可以實現相同的功能,比如登錄鑒權
    ,但是這個并不是Spring推薦的;

Filter特性:

  • Filter在程序啟動的時候啟動一次
  • 不能擁有service對象,數據源,事務管理
  • 可以攔截靜態資源(可以才是它的存在意義)
  • 結合SpringMVC內置的filter做參考:https://www.cnblogs.com/a8457013/p/8260867.html

基于以上,
1)我們可以對資源類文件進行攔截(設定字符編碼)
2)進行URL級別的訪問控制(并非登錄這一種控制,是不是內部接口,是否允許外部接口調用)
3)。。。

Filter使用:

1、創建Filter

public class TimeFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) {System.out.println("過濾器初始化");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("過濾器執行了");long start2 = System.currentTimeMillis();filterChain.doFilter(servletRequest, servletResponse);long time = System.currentTimeMillis() - start2;System.out.println("過濾器執行的時間是 :" + time);System.out.println("過濾器執行結束");}@Overridepublic void destroy() {System.out.println("過濾器銷毀了");} }

2、web.xml中配置(可以配置多個,從上到下執行)

<!-- 自定義過濾器 --> <filter> <filter-name>firstfilter</filter-name> <filter-class>com.filter.filterFirst</filter-class> <!-- 設置初始化參數 --> <init-param> <param-name>nofilterpath</param-name> <param-value>login</param-value> </init-param> </filter> <filter-mapping> <filter-name>firstfilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

3、訪問順序:


4、生命周期


生命周期

3、攔截器

攔截器使用

1、創建Interceptor

public class TestInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {System.out.println("preHandle");return true;}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {System.out.println("afterCompletion");} }

2、在web.xml中配置

<!-- 配置攔截器 --><mvc:interceptors><!-- 全局的攔截器 --><bean class="com.xcy.interceptor.HandlerInterceptor1" /><!-- 指定路徑攔截器,按順序執行 --><mvc:interceptor><mvc:mapping path="/api/user/**" /> <bean class="com.xcy.interceptor.HandlerInterceptor2" /></mvc:interceptor><mvc:interceptor><mvc:mapping path="/api/person/**" /><bean class="com.xcy.interceptor.HandlerInterceptor3" /></mvc:interceptor></mvc:interceptors>

3、調用鏈


攔截器和過濾器執行順序:
1).Filter.init();
2).Filter.doFilter(); before doFilter
3).HandlerInterceptor.preHandle();
4).Controller方法執行
5).HandlerInterceptor.postHandle();
6).DispatcherServlet視圖渲染
7).HandlerInterceptor.afterCompletion();
8).Filter.doFilter(); after doFilter
9).Filter.destroy();

preHandle是在請求到達Controller之前實現,可進行用戶校驗登錄等操作,返回true后,請求到達Controller層;postHandle方法是在執行完Controller層代碼之后,DispatcherServlet進行視圖的渲染之前

執行,因此可以對ModelAndView 對象進行處理;afterCompletion方法是在DispatcherServlet進行視圖的渲染之后執行調用,主要是進行一些資源清理等工作。

注:只能對Controller請求進行攔截,對一些靜態資源無法攔截。


4、過濾器和攔截器的區別

過濾器和攔截器的區別:
①攔截器是基于java的反射機制的,而過濾器是基于函數回調。
②攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
③攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
④攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
⑤在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。
⑥攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器里注入一個service,可以調用業務邏輯。


5、總結

  • 在這篇博客里有一個理論:

其實我感覺這種理解方式也是對的,因為在SpringBoot中使用時,貌似就是這種概念!


總結

以上是生活随笔為你收集整理的008--【SpringBoot】过滤器,拦截器,切面的全部內容,希望文章能夠幫你解決所遇到的問題。

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