• 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  "系统忙,请稍后再试!!";
        }
    }
  • 相关阅读:
    VisualStudio 2012中的单元测试
    基于.Net 写我自己的Ajax后台框架AjaxFramework
    MongoDB的真正性能实战百万用户
    基于MMSeg算法的中文分词类库
    Visual Studio 2012的新插件Code Digger (类似Pex)
    Visual Studio 2010 单元测试之一普通单元测试
    Django系列教程:一、Django的安装和入门
    Cocos2dx 入门调研总结
    教程:建立自己的私有云
    如何让你的作业在Hadoop集群中真正实现分布式运行
  • 原文地址:https://www.cnblogs.com/64Byte/p/13257156.html
Copyright © 2020-2023  润新知