Spring MVC 可以使用攔截器對請求進行攔截處理,用戶可以自定義攔截器來實現特定的功能,自定義的攔截器必須實現HandlerInterceptor接口。
HandlerInterceptor接口的代碼如下:
- package org.springframework.web.servlet;
- import Javax.servlet.http.HttpServletRequest;
- import Javax.servlet.http.HttpServletResponse;
- public interface HandlerInterceptor {
- // preHandle()方法在業務處理器處理請求之前被調用
- boolean preHandle(HttpServletRequest request,
- HttpServletResponse response,
- Object handler)
- throws Exception;
- // postHandle()方法在業務處理器處理請求之後被調用
- void postHandle(
- HttpServletRequest request, HttpServletResponse
- response, Object
- handler, ModelAndView modelAndView)
- throws Exception;
- // afterCompletion()方法在DispatcherServlet完全處理完請求後被調用
- void afterCompletion(
- HttpServletRequest request, HttpServletResponse
- response, Object
- handler, Exception ex)
- throws Exception;
- }
preHandle():這個方法在業務處理器處理請求之前被調用,在該方法中對用戶請求request進行處理。如果程序員決定該攔截器對請求進行攔截處理後還要調用其他的攔截器,或者是業務處理器去進行處理,則返回true;如果程序員決定不需要再調用其他的組件去處理請求,則返回false。
postHandle():這個方法在業務處理器處理完請求後,但是DispatcherServlet向客戶端返回請求前被調用,在該方法中對用戶請求request進行處理。
afterCompletion():這個方法在DispatcherServlet完全處理完請求後被調用,可以在該方法中進行一些資源清理的操作。
首先編寫TimeInterceptor.Java,代碼如下:
- package com.yjde.web.interceptor;
- import java.util.Calendar;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.springframework.web.servlet.ModelAndView;
- import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
- public class TimeInterceptor extends HandlerInterceptorAdapter {
- // 繼承HandlerInterceptorAdapter類
- private String outsideOfficeHoursPage;// outsideOfficeHoursPage屬性指定錯誤提示頁面的URL
- // 重寫 preHandle()方法,在業務處理器處理請求之前對該請求進行攔截處理
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler) throws Exception {
- User user = (User)requset.getSession("key");
- if(user == null){
- response.sendRedirect(outsideOfficeHoursPage); // 返回提示頁面
- return false;
- }
- return true;
- }
- public void postHandle(HttpServletRequest request,
- HttpServletResponse response, Object o, ModelAndView mav)
- throws Exception {
- System.out.println("postHandle");
- }
- public void afterCompletion(HttpServletRequest request,
- HttpServletResponse response, Object o, Exception excptn)
- throws Exception {
- System.out.println("afterCompletion");
- }
- public String getOutsideOfficeHoursPage() {
- return outsideOfficeHoursPage;
- }
- public void setOutsideOfficeHoursPage(String outsideOfficeHoursPage) {
- this.outsideOfficeHoursPage = outsideOfficeHoursPage;
- }
- }
- 可以看出,上面的代碼重寫了preHandle()方法,該方法在業務處理器處理請求之前被調用。在該方法中,首先獲得 user對象,判斷其是否在
- 如果在,返回true,這樣纔會調用業務控制器去處理該請求;否則直接轉向一個頁面,返回false,這樣該請求就不會被處理。
-
-
下面是在dispatcher-servlet.xml中對攔截器進行的配置,代碼如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
- xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
- xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd">
- <!--
- 使Spring支持自動檢測組件,如註解的Controller
- -->
- <context:component-scan base-package="com.yjde.web.controller" />
- <bean id="viewResolver"
- class="org.springframework.web.servlet.view.InternalResourceViewResolver"
- p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
- <mvc:interceptors>
- <mvc:interceptor>
- <!--設置攔截的路徑-->
- <mvc:mapping path="/main.htm" />
- <bean class="com.yjde.web.interceptor.TimeInterceptor">
- <!--outsideOfficeHoursPage屬性指定提示頁面的URL-->
- <property name="outsideOfficeHoursPage">
- <value>/login.html
- </value>
- </property>
- </bean>
- </mvc:interceptor>
- </mvc:interceptors>
- <bean id="messageSource"
- class="org.springframework.context.support.ResourceBundleMessageSource"
- p:basename="message">
- </bean>
- </beans>
控制反轉是Spring框架的核心思想,即用一個接口去定義一些操作,在接口的實現類中去重寫這些操作,然後在Spring的配置 文件中去把該接口的實現類注入到應有框架中,這樣就可以通過調用接口去調用接口的實現類。此次講的攔截器就體現了這種思想,即實現 HandlerInterceptorAdapter接口,重寫preHandle()方法並在配置文件中實現TimeInterceptor的注入。這 樣當框架調用HandlerInterceptorAdapter時,就可以調用到TimeInterceptor類的preHandle()方法。