1. 程式人生 > >Spring mvc中的攔截器Interceptor

Spring mvc中的攔截器Interceptor

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>

至此,簡單攔截器學習完成。