過濾器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