Spring mvc中的攔截器Interceptor
阿新 • • 發佈:2019-02-16
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>
至此,簡單攔截器學習完成。