1. 程式人生 > >SpringBoot(十一)過濾器和攔截器

SpringBoot(十一)過濾器和攔截器

在做web開發的時候,過濾器(Filter)攔截器(Interceptor)很常見,通俗的講,過濾器可以簡單理解為“取你所想取”,忽視掉那些你不想要的東西;攔截器可以簡單理解為“拒你所想拒”,關心你想要拒絕掉哪些東西,比如一個BBS論壇上攔截掉敏感詞彙。

過濾器依賴於servlet容器,是JavaEE標準,是在請求進入容器之後,還未進入Servlet之前進行預處理,並且在請求結束返回給前端這之間進行後期處理。在實現上基於函式回撥,可以對幾乎所有請求進行過濾,但是缺點是一個過濾器例項只能在容器初始化時呼叫一次。使用過濾器的目的是用來做一些過濾操作,獲取我們想要獲取的資料,比如:在過濾器中修改字元編碼;在過濾器中修改HttpServletRequest的一些引數,包括:過濾低俗文字、危險字元等

java裡的攔截器是動態攔截Action呼叫的物件。它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的程式碼,也可以在一個action執行前阻止其執行,同時也提供了一種可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中攔截器用於在某個方法或欄位被訪問之前,進行攔截然後在之前或之後加入某些操作。

v過濾器demo

1.1 建立MyTestFilter

package com.demo.Filter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; /** * Created by toutou on 2018/10/27. */ @Slf4j @Component
public class MyTestFilter implements Filter{ @Override public void init(FilterConfig filterConfig) throws
ServletException { System.out.println("1111111111111111111111111"); log.info("filter 初始化"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub System.out.println("2222222222222222222222222"); log.info("doFilter 請求處理"); //TODO 進行業務邏輯 //鏈路 直接傳給下一個過濾器 chain.doFilter(request, response); } @Override public void destroy() { System.out.println("33333333333333333333333333"); log.info("filter 銷燬"); } }

1.2 檢視idea啟動日誌

1.3 啟動tomcat,檢視日誌。

如果需要針對指定路徑才讓過濾器生效,可以參考WebConfig類。

v攔截器demo

2.1 MyTestInterceptor

package com.demo.Filter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * Created by toutou on 2018/10/27.
 */
@Component
public class MyTestInterceptor implements HandlerInterceptor {
    /*
     * 檢視渲染之後的操作
     */
    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {

    }

    /*
     * 處理請求完成後檢視渲染之前的處理操作
     */
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {

    }

    /*
     * 進入controller層之前攔截請求
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
        System.out.println("MyTestInterceptor  1111111111");
        return true;
    }
}

2.2 WebConfig

package com.demo.Filter;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;

/**
* Created by toutou on 2018/10/27.
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Resource
    private MyTestInterceptor myTestInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 自定義攔截器,新增攔截路徑和排除攔截路徑
        registry.addInterceptor(myTestInterceptor).addPathPatterns("/show");
    }

    @Bean
    public FilterRegistrationBean testFilterRegistration(MyTestFilter myTestFilter) {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(myTestFilter);//新增過濾器
        registration.addUrlPatterns("/show");//設定過濾路徑,/*所有路徑
        //registration.addInitParameter("name", "alue");//新增預設引數
        registration.setName("MyFilter");//設定優先順序
        registration.setOrder(1);//設定優先順序
        return registration;
    }
}

執行效果:

v注意事項

注意設定啟動類的掃描路徑。

package com.demo.hellospringboot;


import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages = {"com.demo"})
@MapperScan(basePackages = {"com.demo.dao"})
@Slf4j
public class HellospringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(HellospringbootApplication.class, args);
    }
}


作  者:請叫我頭頭哥
出  處:http://www.cnblogs.com/toutou/
關於作者:專注於基礎平臺的專案開發。如有問題或建議,請多多賜教!
版權宣告:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。
特此宣告:所有評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信
聲援博主:如果您覺得文章對您有幫助,可以點選文章右下角推薦一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!