過濾器攔截器監(jiān)聽器的區(qū)別

過濾器

過濾器是實現(xiàn)了javax.servlet.Filter接口的服務(wù)器端程序,主要的用途是過濾字符編碼洋幻、做一些業(yè)務(wù)邏輯判斷等郁轻。繼承自Filter,需要實現(xiàn)init()鞋屈,doFilter()和destroy()三個方法范咨,其中init和destroy只會在容器啟動和結(jié)束的時候才調(diào)用一次,所以主要邏輯卸載doFilter中

step1:新建過濾器類

tip:也可以用@WebFilter注解

@Slf4j

@Component? //別忘了裝載

public class TestFilter2 implements Filter{

? ? @Override

? ? public void init(FilterConfig filterConfig) throws ServletException {

? ? }

? ? @Override

? ? public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

? ? ? ? HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;

? ? ? ? HttpServletResponse httpServletResponse = (HttpServletResponse)servletResponse;

? ? ? ? //這里可以操作session厂庇,cookie,過濾文件上傳請求...可以自行查閱

? ? ? ? filterChain.doFilter(servletRequest, servletResponse);//別忘了釋放請求

? ? }

? ? @Override

? ? public void destroy() {

? ? }

}

step2:注冊過濾器

需要在配置類中注入過濾器

@Bean

public FilterRegistrationBean filterRegistrationBeanA(){

? ? FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();

? ? filterRegistrationBean.setFilter(new TestFilter());

? ? filterRegistrationBean.addUrlPatterns("/blogs"); //url前不要忘記加"/"渠啊,否則會報錯

? ? filterRegistrationBean.setName("sessionFilterA");

? ? filterRegistrationBean.setOrder(10);

? ? return filterRegistrationBean;

}

setFilter()設(shè)置過濾器

addUrlPatterns()添加過濾url

setName()設(shè)置攔過濾名字,同一容器下如果過濾器重名會報錯

setOrder()設(shè)置過濾器排序权旷,小的在前面替蛉。

攔截器

step1:新建攔截器類

@Slf4j

public class MyInterceptor? implements HandlerInterceptor{

? ? @Override

? ? public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

? ? ? ? //在請求處理之前進行調(diào)用(Controller方法調(diào)用之前)

? ? ? ? return true; //只有返回true才放行贯溅,否則攔截請求

? ? }

? ? @Override

? ? public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

? ? ? ? //請求處理之后進行調(diào)用,但是在視圖被渲染之前(Controller方法調(diào)用之后)

? ? ? ? log.info("postHandle");

? ? }

? ? @Override

? ? public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

? ? ? ? //在整個請求結(jié)束之后被調(diào)用躲查,也就是在DispatcherServlet 渲染了對應(yīng)的視圖之后執(zhí)行(主要是用于進行資源清理工作)

? ? ? ? log.info("afterCompletion");

? ? }

}

step2:創(chuàng)建一個配置類實現(xiàn)WebMvcConfigurer接口它浅,并重寫 addInterceptors 方法

@Configuration

public class WebMvcConfig implements WebMvcConfigurer {

? ? //增加攔截器

? ? @Override

? ? public void addInterceptors(InterceptorRegistry registry) {

? ? ? ? //實例化我們自定義的攔截器,然后將對像手動添加到攔截器鏈中

? ? ? ? registry.addInterceptor(new MyInterceptor()).addPathPatterns("/blogs");

? ? ? ? registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/blogs2");

? ? }

}

監(jiān)聽器

spring boot在啟動過程中增加事件監(jiān)聽機制镣煮,為用戶功能拓展提供極大的便利姐霍。

//支持的事件類型四種

ApplicationStartedEvent //spring boot啟動開始時執(zhí)行的事件

ApplicationEnvironmentPreparedEvent //spring boot 對應(yīng)Enviroment已經(jīng)準備完畢,但此時上下文context還沒有創(chuàng)建典唇。

ApplicationPreparedEvent //spring boot上下文context創(chuàng)建完成镊折,但此時spring中的bean是沒有完全加載完成的。

ApplicationFailedEvent //spring boot啟動異常時執(zhí)行事件

這里以監(jiān)聽ApplicationStartedEvent事件為例

**step1:監(jiān)聽類實現(xiàn)ApplicationListener接口 **

public class MyApplicationStartedEventListener implements ApplicationListener<ApplicationStartedEvent> {

? ? private Logger logger = LoggerFactory.getLogger(MyApplicationStartedEventListener.class);

? ? @Override

? ? public void onApplicationEvent(ApplicationStartedEvent event) {

? ? ? ? SpringApplication app = event.getSpringApplication();

? ? ? ? app.setShowBanner(false);// 不顯示banner信息

? ? ? ? logger.info("==MyApplicationStartedEventListener==");

? ? }

}

在該事件中可以獲取到SpringApplication對象介衔,可做一些執(zhí)行前的設(shè)置.

step2:將監(jiān)聽類添加到主類實例

@SpringBootApplication

public class Application {

? ? public static void main(String[] args) {

? ? ? ? SpringApplication app = new SpringApplication(Application.class);

? ? ? ? app.addListeners(new MyApplicationStartedEventListener());

? ? ? ? app.run(args);

? ? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恨胚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子炎咖,更是在濱河造成了極大的恐慌赃泡,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乘盼,死亡現(xiàn)場離奇詭異升熊,居然都是意外死亡漩氨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門赂乐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痴柔,“玉大人,你說我怎么就攤上這事寄纵。” “怎么了?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵矛双,是天一觀的道長。 經(jīng)常有香客問我蟆豫,道長议忽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任十减,我火速辦了婚禮栈幸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘帮辟。我一直安慰自己速址,他們只是感情好,可當我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布由驹。 她就那樣靜靜地躺著芍锚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上并炮,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天默刚,我揣著相機與錄音,去河邊找鬼逃魄。 笑死荤西,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的伍俘。 我是一名探鬼主播皂冰,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼养篓!你這毒婦竟也來了秃流?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤柳弄,失蹤者是張志新(化名)和其女友劉穎舶胀,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碧注,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡嚣伐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了萍丐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轩端。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖逝变,靈堂內(nèi)的尸體忽然破棺而出基茵,到底是詐尸還是另有隱情,我是刑警寧澤壳影,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布拱层,位于F島的核電站,受9級特大地震影響宴咧,放射性物質(zhì)發(fā)生泄漏根灯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一掺栅、第九天 我趴在偏房一處隱蔽的房頂上張望烙肺。 院中可真熱鬧,春花似錦氧卧、人聲如沸桃笙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怎栽。三九已至丽猬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間熏瞄,已是汗流浹背脚祟。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留强饮,地道東北人由桌。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像邮丰,于是被迫代替她去往敵國和親行您。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,576評論 2 349

推薦閱讀更多精彩內(nèi)容