欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring mvc中的拦截器Interceptor

程序员文章站 2022-03-03 12:33:36
...

1 功能

Java 里的拦截器是动态拦截 action 调用的对象。它提供了一种机制可以使开发者可以定义在一个 action 执行的前后执行的代码,也可以在一个 action 执行前阻止其执行,同时也提供了一种可以提取 action 中可重用部分的方式。在AOP(Aspect-Oriented Programming,面向切面编程)中拦截器用于在某个方法或字段被访问之前进行拦截,然后在之前或之后加入某些操作。

2 使用

在实际应用中,一般都是通过实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter抽象类,重写preHandle()postHandle()afterCompletion()这 3 个方法来对用户的请求进行拦截处理的。

preHandle():返回值类型为Boolean,当值为 true 时,就会继续调用下一个 Interceptor 的 preHandle 方法,如果已经是最后一个 Interceptor 的时候,就会是调用当前请求的 Controller 中的方法。

postHandle:该方法在当前请求进行处理之后,也就是在 Controller 中的方法调用之后执行,但是它会在 DispatcherServlet 进行视图返回渲染之前被调用,所以咱们可以在这个方法中对 Controller 处理之后的 ModelAndView 对象进行操作;

afterCompletion:该方法将在整个请求结束之后,也就是在 DispatcherServlet 渲染了对应的视图之后执行,这个方法的主要作用是用于进行资源清理的工作;

以下为“注册开放时间拦截器”示例:

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Calendar;
import java.util.Date;

/**
 * Created by wmh on 2018/7/26.
 */
public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter {
    private int openingTime;
    private int closingTime;
    public void setOpeningTime(int openingTime) {
        this.openingTime = openingTime;
    }
    public void setClosingTime(int closingTime) {
        this.closingTime = closingTime;
    }
   
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) throws Exception {
        Calendar c=Calendar.getInstance();
        c.setTime(new Date());
        int now=c.get(Calendar.HOUR_OF_DAY);
        if(now<openingTime || now>closingTime){
            request.setAttribute("msg", "注册开放时间:9:00-24:00");
            request.getRequestDispatcher("/msg.jsp").forward(request, response);
            return false;
        }
        return true;
    }

}

3 配置

    <mvc:interceptors>
		<!-- 使用 bean 定义一个 Interceptor,直接定义在 mvc:interceptors 下面的 Interceptor 将拦截所有的请求 -->
		<!--<bean class="com.hit.interceptor.WrongCodeInterceptor"/>-->
		<mvc:interceptor>
			<!-- 拦截注册请求,这个必须写在前面,也就是写在【不拦截】的上面 -->
			<mvc:mapping path="/user/register"/>
			<mvc:exclude-mapping path="/user/index"/>
			<!-- 定义在 mvc:interceptor 下面的 Interceptor,表示对特定的请求进行拦截 -->
			<bean id="timeBasedAccessInterceptor" class="cn.topcheer.reap.service.interceptor.TimeBasedAccessInterceptor">
				<property name="openingTime" value="9" />
				<property name="closingTime" value="12" />
			</bean>
		</mvc:interceptor>
    </mvc:interceptors>

至此,简单拦截器学习完成。

参考资料:https://blog.csdn.net/qq_35246620/article/details/68487904#commentsedit