Spring MVC(六) 拦截器

        在学习Servlet的时候,其中有一部分内容,应用也很广泛,那就是过滤器。过滤器经常用在对请求的处理操作,比如常用的字符编码处理,登录验证,权限操作等等。在Spring MVC中要处理这些问题,也同样可以使用过滤器,不过Spring MVC提供了自己的一套处理机制,就是拦截器。

        Spring MVC的拦截器又被称为处理器拦截器,用于对处理器进行预处理和后处理。主要应用在日志记录、目标检查、权限控制等等操作,功能和过滤器差不多。

        实现Spring MVC的拦截器非常简单,只需要创建一个类实现HandlerInterceptor接口,然后在Spring MVC配置文件中添加配置即可。接下来我们通过一个简单的例子,讲述Spring MVC拦截器的基本操作。首先创建一个类HelloInterceptor让其实现HandlerInterceptor接口,代码如下。

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

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

public class HelloInterceptor implements HandlerInterceptor {
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		// TODO Auto-generated method stub
		return false;
	}
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub
		
	}
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub
		
	}
}

        HandlerInterceptor接口中包含三个方法,分别是:preHandle、postHandle和afterCompletion。

        preHandle方法是boolean返回类型,默认是返回false,preHandle方法类似过滤器中的doFilter方法。实际开发中要把返回值设置为true,让程序继续执行,类似于过滤器中的chain.doFilter(request, response)操作。preHandle方法和过滤器中的doFilter方法一样,都是在目标方法执行之前调用,因此,可以在preHandle方法中做相应的操作,比如权限控制,日志操作,事务处理等操作。

        postHandle方法是在调用目标方法之后,渲染页面之前调用。postHandle方法中包含HttpServletRequest参数和ModelAndView参数,因此可以在postHandle方法中做请求域或者视图里的数据做修改。

        afterCompletion方法是在整个请求处理完毕后的回调方法,即在视图渲染完毕后调用afterCompletion方法,如性能监控中我们可以在此记录结束时间并输出消耗时间。afterCompletion方法还可以进行一些资源清理,类似于try-catch-finally中的finally。

        修改HelloInterceptor中的代码,进行测试,代码如下。

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

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

public class HelloInterceptor implements HandlerInterceptor {
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		System.out.println("preHandle");
		return true;
	}
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("postHandle");
	}
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("afterCompletion");
	}
}

        创建完成拦截器类之后,并不能马上起作用,和过滤以一样需要配置之后才可以。接下来在Spring MVC配置文件中添加配置,代码如下。

<mvc:interceptors>
	<bean class="com.tuwei.interceptor.HelloInterceptor"/>
</mvc:interceptors>

        此时拦截器就可以正常使用了。

        拦截器可以配置多个,只需要继续在<mvc:interceptors>中继续添加配置即可。有的时候需要专门制定要拦截的资源,可以通过以下配置完成,代码如下。

<mvc:interceptors>
	<mvc:interceptor>
		<mvc:mapping path="/employee"/>
		<bean class="com.tuwei.interceptor.HelloInterceptor"/>
	</mvc:interceptor>
</mvc:interceptors>

        添加完配置以后,该拦截器只会作用于employee资源,其他的内容不会得到拦截。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangyan_1010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值