目录

  • 4、拦截器
  • 5、过滤器
  • 5.1、介绍
  • 5.2、使用


4、拦截器


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

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

  1. 带入相关依赖:spring-boot-starter-web 启动器会引入相关依赖
  2. 创建一个登录拦截器实现 HandlerInterceptor接口,让在访问规定页面时用户必须登录

返回值类型

方法声明

描述

boolean

preHandle®

在控制器处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。

void

postHandle()

在控制器处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步修改。

void

afterCompletion()

该方法在视图渲染结束后执行,可以通过此方法实现资源清理、记录日志信息等工作。

@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("======在视图渲染完之后执行,用于资源清理等等=======");
    }
}
  1. 注册拦截器,指定拦截规则(如果是拦截所有,静态资源也会被拦截)。
@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常用属性

属性

类型

是否必需

说明

asyncSupported

boolean


指定Filter是否支持异步模式

dispatcherTypes

DispatcherType[]


指定Filter对哪种方式的请求进行过滤。 支持的属性:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST; 默认过滤所有方式的请求

filterName

String


Filter名称

initParams

WebInitParam[]


配置参数

displayName

String


Filter显示名

servletNames

String[]


指定对哪些Servlet进行过滤

urlPatterns/value

String[]


两个属性作用相同,指定拦截的路径

过滤器的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