Spring拦截器

HappyHeng 2020-02-01

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区别

场景FilterInterceptor
执行机制函数回调Java反射
执行场景几乎所有的servlet请求都可使用只能使用在spring定义的controller中
环境依赖依赖servlet环境依赖spring环境
是否可以使用Bean不可以可以

1.4过滤器和拦截器的执行步骤

Spring拦截器

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");
    }

相关推荐