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  "系统忙,请稍后再试!!";
    }
}

 

posted @ 2020-07-06 20:05  64Byte  阅读(4974)  评论(2编辑  收藏  举报