springmvc 拦截器及过滤器

过滤器的类存放在org.springframework.web.filter里面
<filter>
  <filter-name>encoding</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <!--请求参数-->
  <init-param>
	<param-name>encoding</param-name>
	<param-value>utf8</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>encoding</filter-name>
  <url-pattern>*</url-pattern>
</filter-mapping>

拦截器的实现

1、编写拦截器实现HandlerInterceptor接口

2、将拦截器注册SpringMVC框架中

3、配置拦截器的拦截规则

编写一个拦截器的类。

package com.cc.cyang.model.adpater;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class Test implements HandlerInterceptor{

	//用来做一些资源的销毁此方法不经常用。
	//比如流的销毁,线程的销毁。
	public void afterCompletion(HttpServletRequest arg0,
			HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		System.out.println("执行到了afterCompletion方法");
	}
	
	//可以通过ModelAndView参数来改变显示的视图,或修改发往视图的方法
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
			Object arg2, ModelAndView arg3) throws Exception {
		System.out.println("执行到了postHandle方法");
	}

	//返回值:表示我们是否需要将当前请求拦截下来
	//如果返回false,请求将被终止,请求不会到达控制器。也不会执行postHandle也不会执行afterCompletion
	//如果返回true,请求会被继续执行
	//Object arg2表示的是被拦截的请求的目标的对象
	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
			Object arg2) throws Exception {
		System.out.println("执行到了preHandle方法");
		return false;
	}
	
}

当然编写好一个拦截器之后还要在注册到springMVC中。

在springMVC.xml中注册拦截器

首先在xml中添加mvc的命名空间,然后在后面添加mvc的.xsd文件格式描述符文件

<mvc:interceptors>
	<bean class="com.cc.cyang.model.adpater.Test"></bean>
</mvc:interceptors>
首先是执行

System.out.println("执行到了preHandle方法");

再次执行是到达目标后执行里面方法之后执行的方法

System.out.println("执行到了postHandle方法");

最后在执行完所有的方法之后执行

System.out.println("执行到了afterCompletion方法");

当然拦截器里面可以控制拦截的路径。

之请求提交路径是view.from的进行拦截

<mvc:interceptors>
     <mvc:interceptor>
        <mvc:mapping path = “view.form”/>
	<bean class="com.cc.cyang.model.adpater.Test"></bean>
     </mvc:interceptor>
</mvc:interceptors>
拦截器方法的介绍
1、preHandle方法,在请求处理之前进行拦截

2、postHandle方法,在请求被处理之后进行调用

3、aftterCompletion方法,在请求结束之后才进行调用

在一个应用当中多个拦截器。


拦截器的其它实现方式

package com.cc.cyang.model.adpater;

import org.springframework.ui.ModelMap;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.context.request.WebRequestInterceptor;

public class Test implements WebRequestInterceptor {

	public void afterCompletion(WebRequest arg0, Exception arg1)
			throws Exception {
	}

	public void postHandle(WebRequest arg0, ModelMap arg1) throws Exception {
	}

	public void preHandle(WebRequest arg0) throws Exception {
	}
}
拦截器的类还可以通过实现WebRequestInterceptor接口来编写。

想springMVC框架注册的写法不变。

弊端:preHandle方法没有返回值,不能终止请求。

拦截器的使用场景

使用原则:处理所有请求的共同问题。

1、解决乱码问题

2、解决权限问题

拦截器与过滤器的区别

过滤器Filter依赖于servlet容器,基于回调函数,这个还可以过滤资源一类的,过滤范围大。

拦截器Interceptor依赖于框架容器,基于反射机制,只过滤请求。

总结

拦截器可以处理WEB应用中请求的一些通用性问题。
共性问题在拦截器中处理,可以减少重复代码,便于维护。





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值