SpringBoot的過濾器和攔截器和全局異常處理


  • 過濾器是攔截所有請求
  • 攔截器是攔截在進入到前端控制器之后的請求

過濾器

第一種方式: 利用Servlet3.0的WebFilter注解配置(推薦

  @WebFilter是Servlet3.0新增加的注解,在servlet3.0之前,我們需要在web.xml文件中進行過濾器的配置,

而現在可以通過此注解進行配置,當項目啟動時,會自動掃描自動注冊

1、創建一個過濾器:

// 相當於在web.xml文件中配置過濾器 @WebFilter(value = "/*",filterName ="AFilter" ) public class AFilter implements Filter{
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
          System.out.println("AFilter 攔截....");
          //放行
          chain.doFilter(request, response);
    }

2、注解以外,我們還需在配置類中加另外一個注解:@ServletComponetScan,指定掃描的Filter包。

@SpringBootApplication
@ServletComponentScan("com.zl.app.filter") public class SpringBoot05ThymeleafDemo2Application {
    public static void main(String[] args) {
        SpringApplication.run(SpringBoot05ThymeleafDemo2Application.class, args);
    }

第二種方式: 利用SpringBoot的配置類來添加過濾器

1、創建一個過濾器:(我們對上面的過濾器不進行任何改變, 而且也不需要添加@WebFilter注解)

public class AFilter implements Filter{
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
          System.out.println("AFilter 攔截....");
          //放行
          chain.doFilter(request, response);
    }

2、創建一個配置類:我們可以使用SpringBoot提供的FilterRegistrationBean來對Filter進行配置:

@Configuration
public class FilterConfig  {
    /*過濾器注解bean:  FilterRegistrationBean,  注冊過濾器, 添加過濾器*/
    @Bean
    public FilterRegistrationBean<AFilter> createFilterRegistrationBean() {
        //1.創建FilterRegistrationBean這個對象, 一個過濾器注冊器,注冊一個過濾器
        FilterRegistrationBean<AFilter> filterRegistrationBean  = new FilterRegistrationBean<>();
        //注冊一個過濾器
        filterRegistrationBean.setFilter(new AFilter());
        //過濾器的配置, 設置攔截的url
        filterRegistrationBean.addUrlPatterns("/*");
        //給過濾器起名字
        filterRegistrationBean.setName("AFilter");
        //設置過濾器的執行順序
        filterRegistrationBean.setOrder(1);
        return filterRegistrationBean;
    }

3、不需要在啟動類中添加掃描注解

這樣配置就完成了,需要配置的選項主要包括實例化Filter類,然后指定url的匹配模式,設置過濾器名稱和執行順序,這個過程和在web.xml中配置其實沒什么區別,只是形式不同而已

攔截器

1、創建一個攔截器

public class AInterceptor implements  HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("AInterceptor...");
        return true;
    }
}

2、攔截器配置類:

方法一:

@Configuration
public class InterceptorConfig{
   @Bean public InterceptorRegistry createInterceptorRegistry() { //創建攔截器注冊器
   InterceptorRegistry interceptorRegistry = new InterceptorRegistry(); //添加攔截器
   interceptorRegistry.addInterceptor(new AInterceptor()).addPathPatterns("/**");
   return interceptorRegistry; }
}

方法二:(推薦

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
  @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注冊攔截器
        registry.addInterceptor(new AInterceptor()).addPathPatterns("/**");
    }
}

全局異常處理(處理controller的異常)

  • 1.新建一個全局的異常類
  • 2.在class上添加注解,@ControllerAdvice
  • 3.在class中添加一個方法
  • 4.在方法上添加@ExceptionHandler攔截相應的異常
  • 5.如果返回的是View   ---方法的返回值是ModelAndView
  • 6.如果返回的是String或者是JSON數據,那么需要在方法上添加@ResponseBody注解

1、新建一個自定義異常類

package com.zl.app.exception;

public class MyException extends Exception {
    private static final long serialVersionUID = 5161867006794112122L;

    public MyException() {
        super();
    }

    public MyException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }

    public MyException(String message, Throwable cause) {
        super(message, cause);
    }

    public MyException(String message) {
        super(message);
    }

    public MyException(Throwable cause) {
        super(cause);
    }

}
View Code

2、創建一個異常處理類(存放於Exception文件夾下)

  在其class上注解@ControllerAdvice,在其方法上加上注解@ExceptionHandler(value=Exception.class) 

@ControllerAdvice public class GlobalDefaultExceptionHandler {
    
    //編寫一個方法處理異常   表示這個方法處理所有異常 注解中的value可以省略   
    @ExceptionHandler(Exception.class) 
    @ResponseBody
    public String allExceptionHandler(Exception e) {
        if(e instanceof MyException) {
            return  e.getMessage();
        }
        return  "系統忙,請稍后再試!!";
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM