微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

【Springboot】拦截器

Springboot 拦截

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

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

定义拦截

在 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");
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐