SpringBoot中的拦截器和过滤器

Java知识点总结:想看的可以从这里进入

4、拦截器


依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,拦截器可以调用IOC容器中的各种依赖,而过滤器不能,因此可以使用Spring的依赖注入进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。主要应用于登陆校验、权限验证、乱码解决、性能监控和异常处理等功能,但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。

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

  1. 带入相关依赖:spring-boot-starter-web 启动器会引入相关依赖

  2. 创建一个登录拦截器实现 HandlerInterceptor接口,让在访问规定页面时用户必须登录

    返回值类型方法声明描述
    booleanpreHandle®在控制器处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。
    voidpostHandle()在控制器处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步修改。
    voidafterCompletion()该方法在视图渲染结束后执行,可以通过此方法实现资源清理、记录日志信息等工作。
    @Slf4j
    public class MyLoginInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
           	Object loginUser = request.getSession().getAttribute("loginUser");
            if (loginUser == null) {
                //未登录,返回登陆页
                request.setAttribute("msg", "您没有权限进行此操作,请先登陆!");
                request.getRequestDispatcher("/login.html").forward(request, response);
                return false;
            } else {
                //放行
                return true;
            }
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            log.info("======在方法处理完逻辑,渲染视图之前执行========");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            log.info("======在视图渲染完之后执行,用于资源清理等等=======");
        }
    }
    
  3. 注册拦截器,指定拦截规则(如果是拦截所有,静态资源也会被拦截)。

    @Configuration
    @Slf4j
    public class InterseptorConfig implements WebMvcConfigurer {
    
        @Bean
        public  MyLoginInterceptor myLoginInterceptor(){
            return new MyLoginInterceptor();
        }
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            log.info("注册拦截器");
            registry.addInterceptor(myInterseptor())
                    .addPathPatterns(      //拦截的路径,
                		//拦截所有请求,包括静态资源文件
                		new LoginInterceptor()).addPathPatterns("/**") 
            		)
                    .excludePathPatterns(       //不拦截的路径,静态资源、登录等
                       "/", "/login", "/index.html", "/user/login", "/css/**", "/images/**", "/js/**", "/fonts/**"
                    );
        }
    }
    

5、过滤器


5.1、介绍

Filter:过滤器,JavaWeb 的三大组件之一。属于JavaEE 的规范,是javax.servlet.Filter接口。
过滤器的主要作用是:拦截请求、过滤响应。常见的应用场景为:权限检查、日记操作、处理不合法数据,统一进行编码设置…等。

SpringBoot是利用@WebFilter配置Filter

  • @WebFilter常用属性

    属性类型是否必需说明
    asyncSupportedboolean指定Filter是否支持异步模式
    dispatcherTypesDispatcherType[]指定Filter对哪种方式的请求进行过滤。 支持的属性:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST; 默认过滤所有方式的请求
    filterNameStringFilter名称
    initParamsWebInitParam[]配置参数
    displayNameStringFilter显示名
    servletNamesString[]指定对哪些Servlet进行过滤
    urlPatterns/valueString[]两个属性作用相同,指定拦截的路径

    过滤器的urlPatterns的过滤路径规则:

    1.全路径匹配: /abc/myServlet1.do

    2.部分路径匹配: /abc/*

    3.通配符匹配 :/*

    4.后缀名匹配 :*.do

  • @Order(1) //指定过滤器的执行顺序,值越大越靠后执行

5.2、使用

  • 创建过滤器

    @Slf4j
    //声明是一个过滤器,需要过滤"/login/* 下的所有接口"
    @WebFilter(urlPatterns = "/login/*",filterName = "MyFilter")
    @Order(1)   //指定过滤器的执行顺序,值越大越靠后执行
    public class MyFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            log.info("=====Filter初始化=====");
        }
    
        //执行过滤的规则
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            //过滤编码
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
    
            //获取请求的一些参数
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            String uri = httpServletRequest.getRequestURI();
            String method = httpServletRequest.getMethod();
            log.info("请求的接口{},请求的方式{}",uri,method);
    
            //放行的作用,如果没有,程序会卡在这步,不能继续执行
            chain.doFilter(request,response);
        }
        @Override
        public void destroy() {
            log.info("=====Filter被销毁=====");
        }
    }
    
  • 在springboot启动类上添加注解:@ServletComponentScan

    @SpringBootApplication
    @EnableScheduling   //开启对定时任务的支持
    @ServletComponentScan  //Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码。
    public class SpringbootdemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(SpringbootdemoApplication.class, args);
        }
    }
    
  • 先进入filter

    image-20210908122639458
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰 羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值