过滤器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