過濾器
過濾器是實現(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);
? ? }
}