Spring boot 過濾器、攔截器、監(jiān)聽器

1. 過濾器

在HttpServletRequest 到達(dá)Servlet 之前,攔截客戶的HttpServletRequest 。
根據(jù)需要檢查HttpServletRequest ,也可以修改HttpServletRequest 頭和數(shù)據(jù)。
在HttpServletResponse 到達(dá)客戶端之前,攔截HttpServletResponse 。
根據(jù)需要檢查HttpServletResponse ,可以修改HttpServletResponse 頭和數(shù)據(jù)
應(yīng)用場景:
修改request和reponse、跨域、攔截請求
過濾器使用:
繼承Filter

package com.example.demo.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.time.LocalDateTime;

public class ParamFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("url:" + ((HttpServletRequest)servletRequest).getRequestURL() + " paramFilter time:" + LocalDateTime.now().toString());
        servletRequest.setAttribute("param", "param");
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

配置Filter

package com.example.demo.config;

import com.example.demo.filter.ParamFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {


    @Bean
    public FilterRegistrationBean regisFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new ParamFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        return filterRegistrationBean;
    }

}

2. 攔截器

攔截器類似于Servlet開發(fā)中的過濾器Filter,用于對處理器 進(jìn)行預(yù)處理和后處理
應(yīng)用場景:
日志記錄、權(quán)限檢查、性能檢測
攔截器的使用:
繼承HandlerInterceptor

package com.example.demo.interceptor;

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

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

public class ParamInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("攔截到請求url:" + request.getRequestURL());
        return true;
    }

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

    }

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

    }
}

配置攔截器

package com.example.demo.config;

import com.example.demo.interceptor.ParamInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        InterceptorRegistration interceptorRegistration = registry.addInterceptor(new ParamInterceptor());
        interceptorRegistration.addPathPatterns("/*");
    }
}

Controller:

package com.example.demo.controller;


import com.example.demo.bean.Car;
import com.example.demo.bean.Cat;
import com.example.demo.model.Person;
import com.fasterxml.jackson.annotation.JacksonInject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PostConstruct;
import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

@RestController
public class DemoController {

    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }

    @GetMapping("/filter")
    public String filter(){
        return "filter";
    }

}

控制臺輸出結(jié)果:

url:http://localhost:8082/ paramFilter time:2019-01-21T15:26:29.335
攔截到請求url:http://localhost:8082/
攔截到請求url:http://localhost:8082/error
url:http://localhost:8082/hello paramFilter time:2019-01-21T15:26:46.916
攔截到請求url:http://localhost:8082/hello

過濾器與攔截器的異同:

  • Filter是依賴于Servlet容器,屬于Servlet規(guī)范的一部分,而攔截器則是獨立存在的,可以在任何情況下使用。
  • Filter的執(zhí)行由Servlet容器回調(diào)完成,而攔截器通常通過動態(tài)代理的方式來執(zhí)行。
  • Filter的生命周期由Servlet容器管理,而攔截器則可以通過IoC容器來管理,因此可以通過注入等方式來獲取其他Bean的實例,因此使用會更方便。

3.監(jiān)聽器

eg.
ServletContextListener、HttpSessionListener
分別監(jiān)聽severletContext和httpSession的創(chuàng)建與銷毀

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容