Interceptor拦截器

介绍

Interceptor: 拦截器,作用类似 Filter, 主要作用是拦截用户请求, 在 Action 执行的前后各执行一段代码, 进行相应的业务处理.

作用

权限认证
统一逻辑处理
日志监控等

使用方式及方法介绍

使用方式分为两种, 一种为: 实现HandlerInterceptor接口或者是继承实现了HandlerInterceptor接口的类, 另一种为: 实现Spring的WebRequestInterceptor接口, 或者是继承实现了WebRequestInterceptor的类.
1.HandlerInterceptor 介绍

package org.springframework.web.servlet;

import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface HandlerInterceptor {

    /**
     * 请求处理之前调用 链式 会按照声明顺序依次执行
     * 返回 true 则继续执行下一个 Interceptor 无则执行 Controller
     * 返回 false 请求结束
     */
    boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

    /**
     * 在请求处理之后,DispatcherServlet进行视图返回渲染之前进行调用,可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。
     * 调度程序Servlet在执行链中处理一个处理程序,由任意数量的拦截器组成,处理器本身在最后。 使用这种方法,每个拦截器可以后处理一个执行,并按照执行链的相反顺序进行应用
     */
    void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;

    /**
     * 请求处理完成后的回调,即渲染视图后的回调。 将被调用处理程序执行的任何结果,从而允许适当的资源清理。
     * 注意:只有当这个拦截器的预处理方法已经成功完成并返回时才会被调用
     * 与postHandle方法一样,该方法将以相反的顺序在链中的每个拦截器上调用,因此第一个拦截器将成为最后被调用的拦截器
     */
    void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;

}

2.WebRequestInterceptor 介绍

package org.springframework.web.context.request;

import org.springframework.ui.ModelMap;
import org.springframework.web.context.request.WebRequest;


public interface WebRequestInterceptor {

    /**
     * 在调用之前拦截请求处理程序的执行。 允许准备上下文资源(如Hibernate Session)并将它们公开为请求属性或线程本地对象.
     * 即 准备一些需要的资源, 例如, 将请求属性放置到 WebRequest 中
     * 无返回对象
     */
    void preHandle(WebRequest request) throws Exception;

    /**
     * 在视图呈现前(如果有的话)在成功调用之后拦截请求处理程序的执行。
     * 允许在成功处理程序执行后修改上下文资源(例如,刷新休眠会话)
     * 可以通过修改 ModelMap 的属性来改变你返回的试图模型
     */
    void postHandle(WebRequest request, ModelMap model) throws Exception;

    /**
     * 求处理完成后的回调,即渲染视图后的回调。 将被调用处理程序执行的任何结果,从而允许适当的资源清理。
     * 注意:只有在拦截器的预处理方法成功完成时才会调用
     */
    void afterCompletion(WebRequest request, Exception ex) throws Exception;

}

xml 配置

1.在 *-servlet.xml 中添加 MVC schema

    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation=" http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"

2.配置 mvc:interceptors 标签

    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 拦截路径 -->
            <mvc:mapping path="/**"/>
            <!-- 指定拦截器 -->
            <bean class="com.liuzhihang.myprojext.controller.interceptor.RequestInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

使用示例

package com.liuzhihang.myprojext.controller.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class RequestInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 处理逻辑
        return true;
    }

    @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 {

    }
}

   转载规则


《Interceptor拦截器》 liuzhihang 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录