SpringMVC過濾器Filter與攔截器Interceptor

過濾器Filter

它依賴於servlet容器。在實現上,基於函數回調,它可以對幾乎所有請求進行過濾,但是缺點是一個過濾器實例只能在容器初始化時調用一次
通常用的場景是:在過濾器中修改字符編碼(CharacterEncodingFilter)、在過濾器中修改HttpServletRequest的一些參數
使用SpringMVC則就只需要在web.xml中配置過濾器即可,當然前提需要支持Maven所對應的jar

1.在pom.xml中導入jar

一般搭建SSM項目時候,都會導入spring框架所需的jar ,比如spring-core、spring-web等等

<!-- SpringMVC過濾器在spring-web中 -->
	<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>4.1.1.RELEASE</version>
	</dependency>

2.在web.xml中進行配置

以較爲常用的編碼過濾器爲例,進行web.xml配置

  <!-- 編碼過濾器 -->
  <filter>
  	<filter-name>encoding</filter-name>
  	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  	
  	<init-param>
  	<!-- 過濾編碼格式——utf-8 -->
  		<param-name>encoding</param-name>
  		<param-value>utf-8</param-value>
  	</init-param>
  	
  	<init-param>
  	<!-- 遍歷所有的過濾器 -->
  		<param-name>forceEncoding</param-name>
  		<param-value>true</param-value>
  	</init-param>
  	
  </filter>
  
  <filter-mapping>
  <!-- *表示過濾所有 -->
  	<filter-name>encoding</filter-name>
  	<url-pattern>*</url-pattern>
  </filter-mapping>

設置好編碼過濾器就可以解決大部分中文亂碼問題

攔截器Interceptor

它依賴於web框架,在SSM中就是依賴於SpringMVC框架。在實現上, 基於Java的反射機制,屬於面向切面編程(AOP)的一種運用,在service或者一個方法前,調用一個方法,或者在方法後,調用一個方法,比如動態代理就是攔截器的簡單實現,在調用方法前打印出字符串(或者做其它業務邏輯的操作),也可以在調用方法後打印出字符串,甚至在拋出異常的時候做業務邏輯的操作。 由於攔截器是基於web框架的調用,因此可以使用Spring的依賴注入(DI)進行一些業務操作,同時一個攔截器實例在一個controller生命週期之內可以多次調用。但是缺點是隻能對controller請求進行攔截,對其他的一些比如直接訪問靜態資源的請求則沒辦法進行攔截處理
Springmvc提供了攔截器,類似於過濾器,將在請求傳送之前先做檢查,有權決定接下來是否繼續,對請求進行加工,攔截器處於前臺與後臺服務器之間

注:根據所需要的功能不同,攔截器可以設計多個進行使用

1.在pom.xml中導入jar

<!-- 攔截器HandlerInterceptor -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>4.1.1.RELEASE</version>
		</dependency>

2.創建攔截器類實現HandlerInterceptor接口中的方法

package com.zy.interceptor;

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

import org.springframework.web.servlet.HandlerInterceptor;

public class Interceptor1 implements HandlerInterceptor{

	
	//發送數據前調用
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println("preHandle");
		//可以用session來判斷用戶是否登錄,進行資源的攔截
		
		//返回值爲boolean類型,返回true正常進行攔截,返回false會終止攔截
		//即便是使用多個攔截器,只要有一個攔截器該方法返回false,不會再經過其他攔截器,會直接返回給前臺
		return true;
	}

	
	//返回之前調用   可以處理ModelAndView數據
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("postHandle");
	}

	
	//最後執行   一般用來關閉資源  用的很少
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println("afterCompletion");
	}

}

3.在springContext.xml中配置攔截器

<!-- SpringMVC攔截器 -->
	<mvc:interceptors>
	
		<mvc:interceptor>
			<!--攔截路徑   /**爲攔截全部 -->
			<mvc:mapping path="/**" />
			<!-- 不攔截的請求路徑   可以寫多個 -->
			<mvc:exclude-mapping path="/xxx.do"/>
			<!-- 攔截器1 -->
			<bean class="com.zy.interceptor.Interceptor1"></bean>
		</mvc:interceptor>
		
		<!-- 攔截器2 -->
		<bean class="com.zy.interceptor.Interceptor2"></bean>
		<!-- 攔截器3 -->
		<bean class="com.zy.interceptor.Interceptor3"></bean>
		
	</mvc:interceptors>

使用多個攔截器調用順序是按照springContext.xml中攔截器配置順序進行的,例如上述攔截器調用順序爲:攔截器1——>攔截器2——>攔截器3

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章