javascript
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】过滤器,拦截器,切面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于web出现此问题:index:25
- 下一篇: Unexpected token o i