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

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