HappyHeng 2020-02-01
javaWeb有三大组件,分别是:servlet,Filter,Listener
广义:Servlet是一个运行在web服务器或者应用服务器上的一个应用程序,用来动态处理客户端请求的资源。
狭义:Servlet是一个继承了GenericServlet类的子类。该类中的service方法用来处理相关的资源请求。
在Servlet规范中定义了多种类型的监听器。主要是三种域对象的监听ServletContext
,HttpSession
,HttpRequest
,根据其功能可以划分为两类
Filter和Servlet类似。Servlet用来处理请求,而Filter用来拦截和放行请求。
作用:
Filter存在四种拦截方式
spring拦截器是spring Aop的一种应用,在不修改源码的情况下,执行一段代码,以增强现有方法。
实现方式:
通过实现HandlerInterceptor
接口,重写内部的三个方法
场景 | Filter | Interceptor |
---|---|---|
执行机制 | 函数回调 | Java反射 |
执行场景 | 几乎所有的servlet请求都可使用 | 只能使用在spring定义的controller中 |
环境依赖 | 依赖servlet环境 | 依赖spring环境 |
是否可以使用Bean | 不可以 | 可以 |
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"); }