4、拦截器
依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,拦截器可以调用IOC容器中的各种依赖,而过滤器不能,因此可以使用Spring的依赖注入进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。主要应用于登陆校验、权限验证、乱码解决、性能监控和异常处理等功能,但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。
在 Spring Boot 项目中,使用拦截器功能通常需要以下 3 步:
-
带入相关依赖:spring-boot-starter-web 启动器会引入相关依赖
-
创建一个登录拦截器实现 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("======在视图渲染完之后执行,用于资源清理等等======="); } }
-
注册拦截器,指定拦截规则(如果是拦截所有,静态资源也会被拦截)。
@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