springmvc自定义的拦截器以及拦截器的配置

一、自定义拦截器

Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口。

二、HandlerInterceptor接口的三个方法

1.preHandler():

此方法在业务处理器(Controller)处理请求之前被调用。在此方法中可以对用户请求request进行处理。

若返回值为true,则继续调用后续的拦截器和目标方法。若返回值为false,则不会再调用后续的拦截器和目标方法。

* 常用来做权限。日志,事务等。

2.postHandler():

此方法在业务处理器处理完请求后,在DispatcherServlet向客户端返回响应前(调用目标方法之后,渲染视图之前)被调用,在该方法中对用户请求request进行处理。

* 常用来对请求域中的属性或视图做出修改。

3.afterCompletion():

此方法在DispatcherServlet完全处理完请求后被调用

* 常用来做资源释放

 三、拦截器和过滤器在执行先后顺序图:

 

 

四、拦截器使用举例

用户登录状态检查例子:通过用户发送的请求,判断用户是否登录,若未登录则不允许访问被保护资源

步骤:

1.创建拦截器类

一般拦截器类直接实现HandlerInterceptor接口,重写HandlerInterceptor接口的三个方法就可以了,

但由于此处只需要用到 HandlerInterceptor接口的preHandler()方法,所以我们可以选择继承HandlerInterceptor接口的抽象实现类HandlerInterceptorAdapter,重写其中的preHandler()方法。

在preHandler()方法中我们只需要从session中查询用户信息是否为null,就可以知道用户是否已登录了。

public class LoginInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();
        Admin admin = (Admin) session.getAttribute("loginAdmin");
        if (admin == null){
            throw new AccessForbiddenException("请登录后再访问!");
        }
        return true;
    }
}

2.注册拦截器

在web.xml中注册拦截器,配置需要拦截和不需要拦截的请求

<!--注册拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--mvc:mapping配置要拦截的资源-->
            <!-- /* 对应一层路径,比如:/aaa -->
            <!-- /** 对应多层路径,比如:/aaa/bbb 或 /aaa/bbb/ccc 或 /aaa/bbb/ccc/ddd-->
            <mvc:mapping path="/**"/>
            <!--mvc:exclude- mapping配置不拦截的资源-->
            <!--去登陆页面,不拦截-->
            <mvc:exclude-mapping path="/admin/to/login/page.html"/>
            <!--执行登陆操作,不拦截-->
            <mvc:exclude-mapping path="/admin/do/login.html"/>
            <!--执行退出登录操作,不拦截-->
            <mvc:exclude-mapping path="/admin/do/Logout.html"/>
            <bean id="loginInterceptor" class="com.atguigu.crowd.mvc.interceptor.LoginInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

 

posted @ 2020-07-28 11:36  白熊啊  阅读(1985)  评论(0编辑  收藏  举报