首页 > 其他分享 >【Springboot】拦截器

【Springboot】拦截器

时间:2022-08-18 00:01:18浏览次数:85  
标签:拦截器 请求 request sb 方法 public Springboot

Springboot 拦截器

1.什么是拦截器?
拦截器可以根据 URL 对请求进行拦截,主要应用于登陆校验、权限验证、乱码解决、性能监控和异常处理等功能。

2.定义拦截器步骤
在 Spring Boot 项目中,使用拦截器功能通常需要以下 3 步:

  • 1.定义拦截器;
  • 2.注册拦截器;

定义拦截器

在 Spring Boot中定义拦截器十分的简单,只需要创建一个拦截器类,并实现 HandlerInterceptor 接口,重写以下三个方法。

@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {

    
    private static final Pattern SHOULD_NOT_FILTER_URL_PATTERN;

    static {
        List<String> urlList = new ArrayList<>();
        // 将不走拦截器的请求存放到Pattern
        urlList.add("(socket/.*)");
        urlList.add("(user/*)");
        StringBuilder sb = new StringBuilder();
        for (String url : urlList) {
            sb.append(url);
            sb.append("|");
        }
        sb.setLength(sb.length() - 1);
        SHOULD_NOT_FILTER_URL_PATTERN = Pattern.compile(sb.toString());
    }
    
    
    /**
     * 目标方法执行前 (Controller方法调用之前)
     * 该方法在控制器处理请求方法前执行,其返回值表示是否中断后续操作
     * 返回 true 表示继续向下执行,返回 false 表示中断后续操作
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();
        // 获取访问的url
        String servletPath = request.getServletPath();
        // 排除特定请求
        if (SHOULD_NOT_FILTER_URL_PATTERN.matcher(servletPath).find()) {
            return true;
        }
        if (session.getAttribute("user") != null) {
            // 可能有的项目在校验完session,还会校验token
            String token = request.getHeader("access_token");
            // 此处业务省略。。。
            return true;
        }
        return false;
    }
    /**
     * 目标方法执行后
     * 该方法在控制器处理请求方法调用之后、解析视图之前执行
     * 可以通过此方法对请求域中的模型和视图做进一步修改
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("postHandle执行{}", modelAndView);
    }
    /**
     * 页面渲染后
     * 该方法在视图渲染结束后执行
     * 可以通过此方法实现资源清理、记录日志信息等工作
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("afterCompletion执行异常{}", ex);
    }
}

注册拦截器

创建一个实现了 WebMvcConfigurer 接口的配置类(使用了 @Configuration 注解的类),重写 addInterceptors() 方法,
并在该方法中调用 registry.addInterceptor() 方法将自定义的拦截器注册到容器中。

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    @Resource
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //可以多个拦截器
        //InterceptorRegistration interceptorDemoRegistration = registry.addInterceptor(new InterceptorDemo());
        //interceptorDemoRegistration.addPathPatterns("/..");
        //interceptorDemoRegistration.addPathPatterns("/..");
        
        //注册自己的拦截器,并设置拦截的请求路径
        //addPathPatterns为拦截此请求路径的请求
        //excludePathPatterns为不拦截此路径的请求
		registry.addInterceptor(loginInterceptor)
                //可以设置多个路径拦截
                .addPathPatterns("/admin/*")
                .excludePathPatterns("/admin/oldLogin");
    }
}

标签:拦截器,请求,request,sb,方法,public,Springboot
From: https://www.cnblogs.com/HelloWxl/p/16597273.html

相关文章

  • SpringBoot的Druid数据源不生效
    问题描述:在SpringBoot中yaml文件的数据源不生效使用数据源:Druid报错:FailedtoconfigureaDataSource:‘url‘attributeisnotspecifiedandnoem...改错:删......
  • 【Springboot】项目启动后执行特定方法
    Springboot项目启动后执行特定方法Springboot给我们提供了两种“开机启动”方式:ApplicationRunner和CommandLineRunner。这两种方法提供的目的是为了满足,在项目启动的时......
  • SpringBoot 多线程
    关于SpringBoot中多线程的两个注解:@Async是spring为了方便开发人员进行异步调用而出现的。在方法上加入这个注解,spring会从线程池中获取一个新的线程来执行方法,实现异步调......
  • SpringBoot使用Log4J2
    一、常用日志框架Log4j:Apache的一个开源项目,可以控制日志信息输送的目的地是控制台、文件、GUI组件等,可以控制每一条日志的输出格式,这些可以通过一个配置文件来灵活地进......
  • 全局异常处理及参数校验-SpringBoot 2.7 实战基础 (建议收藏)
    优雅哥SpringBoot2.7实战基础-08-全局异常处理及参数校验前后端分离开发非常普遍,后端处理业务,为前端提供接口。服务中总会出现很多运行时异常和业务异常,本文主要讲......
  • springboot~用正则表达式提取bearer token
    前后一体的应用,是这样进行认证的用户向服务端发送验证信息(用户名、密码);服务端验证成功就向用户返回一个sessionid;服务端保存了这个session_id对应的信息,并写入用户......
  • SpringBoot+Lombok+Builder实现任意个数属性的对象构造
    场景某个类有多个属性,在不同的业务场景下需要对不同对象赋值不同的属性。如果使用原始构造方法赋值,需要有几种情况的参数赋值,就在实体类中声明对应参数的构造方法。可以......
  • SpringBoot 之 事务管理
    我们在开发企业应用时,由于数据操作在顺序执行的过程中,线上可能有各种无法预知的问题,任何一步操作都有可能发生异常,异常则会导致后续的操作无法完成。此时由于业务逻辑......
  • SpringBoot:Configuration Annotation Processor not configured&在Spring Boot中读取a
    您在使用@ConfigurationProperties注解时可以使用spring-boot-configuration-processorjar轻松地从带有注释的项目中生成自己的配置元数据文件。该jar包含一个Java注释处......
  • SpringBoot连接redis报错:exception is io.lettuce.core.RedisException: java.io.IOE
    一、解决思路(1).检查redis的配置是否正确springredis:host:localhostport:6379password:123456database:0......