SpringMVC拦截器原理及实现

1、拦截器概念

Spring MVC 的拦截器类似于Servlet 开发中的过滤器Filter,用于对Controller进行预处理和后处理。
在这里插入图片描述

2、使用SpringMVC拦截器步骤:

2.1 新建拦截器类

功能:定义处理逻辑,拦截到之后如何处理
拦截器方法的执行时机:
1):preHandle:控制器方法执行之前执行,返回结果为true表示放行,如果返回为false,表示拦截(可以做权限拦截,登录检查拦截).
2):postHandle:控制器方法执行后,视图渲染之前执行(可以加入统一的响应信息).
3):afterCompletion:视图渲染之后执行(处理Controller异常信息,记录操作日志,清理资源等)

方式一:实现HandlerInterceptor接口(推荐)

实现接口 org.springframework.web.servlet.HandlerInterceptor

public class MyInterceptor implements HandlerInterceptor{


    @Override
    //前置拦截(一般情况下只配置前置拦截即可)
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
     HttpSession session = request.getSession();
        Object user = session.getAttribute("usersession");
        if(user == null) {
            response.sendRedirect("/login.html");
            return false;
        }
        return true;

    }
    @Override
    //后置拦截
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor.postHandle..");
    }

    @Override
    //最终拦截(视图渲染之后)
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor.afterCompletion..");
    }
}
方式二:继承适配器HandlerInterceptorAdapter(了解)

org.springframework.web.servlet.handler.HandlerInterceptorAdapter

public class MyInterceptor2 extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor2.preHandle");
        return super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor2.postHandle");
        super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor2.afterCompletion");
        super.afterCompletion(request, response, handler, ex);
    }
}

2.2 在SpringMVC配置文件中配置拦截器

功能:用于配置拦截哪些资源

<!--配置拦截器(只能拦截请求,不能拦截具体页面)-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--拦截什么样的路径
                /*:表示拦截所有的一级路径
                /**:拦截任意多级路径    /student/get/list/query
            -->
            <mvc:mapping path="/**"/>
            
            <!--直接放行此请求或页面-->
            <mvc:exclude-mapping path="/logincheck"/>   <!--登录请求放行-->
            <mvc:exclude-mapping path="/login.html"/>   <!--登录页面放行-->
            <mvc:exclude-mapping path="/static/**"/>  <!--静态资源存放位置直接放行(css、js、html)-->

            <!--拦截器类的全限定名-->
            <bean class="com.project.Spring02.lanjieqi.MyInterceptor"/>
        </mvc:interceptor>

    </mvc:interceptors>

在这里插入图片描述

3、小结

1.定义拦截器有两种方式,可以实现HandlerInterceptor接口,也可以实现HandlerInterceptorAdapter类.
2.拦截器只能在访问controller 的方法时进行拦截(只能拦截请求).
3.拦截器可以在访问controller的方法前,访问controller方法之后,和视图渲染完成之后三个时机进行功能的增强.
4./和/**的区别
/
:只能匹配一级路径
/**:匹配多级路径

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值