前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >​Spring拦截器

​Spring拦截器

作者头像
石的三次方
发布2021-01-05 22:23:28
发布2021-01-05 22:23:28
75400
代码可运行
举报
文章被收录于专栏:石的三次方石的三次方
运行总次数:0
代码可运行

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实现类中添加自定义的拦截器,并定义拦截路径和排除路径

代码语言:javascript
代码运行次数:0
复制
//自定义的拦截器,未登陆的用户直接转发到登陆界面
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 {

    }
}

添加到容器中

代码语言:javascript
代码运行次数:0
复制
@Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptorResolve()).addPathPatterns("/**").excludePathPatterns("/index","" +
                "/index.html","/login.html","/user/login","/main");
    }
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 石的三次方 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring拦截器
    • 1.拦截器与过滤器的区别
      • 1.1 JavaWeb三大组件
      • 1.2 Spring拦截器
      • 1.3区别
      • 1.4过滤器和拦截器的执行步骤
  • 2.SpringBoot使用拦截器
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档