Spring拦截器
Spring拦截器
1.拦截器与过滤器的区别
1.1 JavaWeb三大组件
javaWeb有三大组件,分别是:servlet,Filter,Listener
1.1.1 Servlet
广义:Servlet是一个运行在web服务器或者应用服务器上的一个应用程序,用来动态处理客户端请求的资源。
狭义:Servlet是一个继承了GenericServlet类的子类。该类中的service方法用来处理相关的资源请求。
1.1.2 Listener
在Servlet规范中定义了多种类型的监听器。主要是三种域对象的监听ServletContext
,HttpSession
,HttpRequest
,根据其功能可以划分为两类
- 三个域对象的销毁与创建
- ServletContextListener
- HttpServletListener
- ServletRequestListener
- 域对象中的属性的变化
- ServletContextAttributeListener
- HttpServletAttributeListener
- ServletRequestAttributeListener
1.1.3 Filter
Filter和Servlet类似。Servlet用来处理请求,而Filter用来拦截和放行请求。
作用:
- 在执行请求之前执行一段代码
- 是否让客户端访问目标资源
- 调用目标资源以后执行一段代码(通过生命周期函数完成)
Filter存在四种拦截方式
- REQUESR 默认值,代表直接访问某个servlet
- ERROR 发生错误时进行跳转
- INCLUDE 包含资源时执行filter
- FORWARD 转发时执行filter
1.2 Spring拦截器
spring拦截器是spring Aop的一种应用,在不修改源码的情况下,执行一段代码,以增强现有方法。
实现方式:
通过实现HandlerInterceptor
接口,重写内部的三个方法
- preHandler。在访问Controller之前执行,可以用来拦截请求
- postHandler。在视图跳转或数据返回之前执行(return之前)
- afterCompletion。在视图加载完成或数据返回完成以后执行
1.3区别
场景 | Filter | Interceptor |
---|---|---|
执行机制 | 函数回调 | Java反射 |
执行场景 | 几乎所有的servlet请求都可使用 | 只能使用在spring定义的controller中 |
环境依赖 | 依赖servlet环境 | 依赖spring环境 |
是否可以使用Bean | 不可以 | 可以 |
1.4过滤器和拦截器的执行步骤
2.SpringBoot使用拦截器
SpringBoot对MVC进行了自动配置,当需要使用拦截器的时候,需要在WebMvcConfigurer实现类中添加自定义的拦截器,并定义拦截路径和排除路径
//自定义的拦截器,未登陆的用户直接转发到登陆界面 public class MyInterceptorResolve implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object loginStatus = request.getSession().getAttribute("loginStatus"); if(loginStatus !=null ){ return true ; }else{ request.setAttribute("msg","权限不足请先登陆"); request.getRequestDispatcher("/index").forward(request,response); return false ; } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
添加到容器中
@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptorResolve()).addPathPatterns("/**").excludePathPatterns("/index","" + "/index.html","/login.html","/user/login","/main"); }
相关推荐
凯哥Java 2020-07-04
smalllove 2020-03-27
melonjj 2020-01-04
smalllove 2019-12-21
秦怀卓 2019-11-12
Julywhj 2019-10-22
meleto 2019-09-07
burning 2019-01-25
industry0 2018-09-06
秦怀卓 2018-08-09
MayMatrix 2019-01-25
LeeEmmmm 2019-07-01
mowengaoboa 2018-08-09
HappyHeng 2017-01-03
binggege 2016-03-18
Julywhj 2015-06-24