处理器映射支持的拦截器

Spring 的处理器映射 支持 拦截器, 当想为某些请求提供特殊功能的时候, 他们就可以派上用场了.

首先 处理器映射 中的 拦截器 必须实现 org.springframework.web.servlet 包中的 [color=blue]HandlerInterceptor [/color]接口. 该接口定义了三个方法, 一个在[b]处理器执行前[/b]调用, 一个在[b]处理器执行后[/b]调用, 另一个在[b]整个请求处理完后[/b]调用. 为什么强调,因为在 org.springframework.web.portlet 包中也有个同名的接口, 但跟这里讨论的没关系.

有意思的是 [color=blue]preHandler(...) [/color]方法, 它有一个boolean返回值, 利用这一点, 可以调整 HandlerExecutionChain 的执行 行为. 当它返回 true 时, 处理器执行链将继续执行下去; 当它返回 false 时, DispatcherServlet将认为请求已经被处理完成, 不再继续执行 HandlerExecutionChain 中的其他 处理器 和 拦截器.

下面, 是一个拦截器的例子, 它会拦截所有请求 ( 相对处理器执行而言 ), 只要当前时间不在9:00~12:00和13:00~18:00这两个时间段, 就会把用户重定向到某个特殊的页面去.

首先是Spring配置文件中针对 处理器影射 的这一块 :

[color=brown]<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="officeHoursInterceptor"/>
</list>
</property>
<property name="mappings">
<props>
...
</props>
</property>
</bean>

<bean id="officeHoursInterceptor" class="interceptor.OfficeHoursInterceptor"/>[/color]

下面就是拦截器类了:
[color=blue]package interceptor;

public class OfficeHoursInterceptor extends HandlerInterceptorAdapter {

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {

Calendar cal = Calendar.getInstance();
int hour = cal.get(Calendar.HOUR_OF_DAY);
if ( (hour >= 9 && hour <= 12) || (hour >= 13 && hour <=18) ){
return true;
}else{
String host = request.getHeader("host");
if (host != null && host.trim().length() > 0){
response.sendRedirect("http://"+host+"/sprapp/notime.jsp");
}else{
response.sendRedirect("http://10.5.2.67:8080/sprapp/notime.jsp");
return false;
}
}
}[/color]

//注意啦,没有直接实现 HandlerInterceptor 接口, 而是选择了继承一个更加方便的 抽象类,因为我们自己的拦截器不一定要把接口的每个方法都实现啊! 这个抽象类 HandlerInterceptorAdapter,直接实现了 HandlerInterceptor 接口,但是三个方法都是空实现 (自己的词儿,就是没有方法体啦), 所以等着子类去覆盖呢. :wink:

最后简单介绍另两个方法:

[b][1] postHandler [/b]: 无返回. 这个方法的调用, 发生在 HandlerAdapter 实际调用了处理器之后, 但 DispatcherServlet 还没来得及渲染 视图 的时候. :oops: 这个方法是唯一具有 ModelAndView 参数的, 也就是说,可以利用这个方法, 在处理器返回的ModelAndView的基础上,做点儿小动作 ( 有什么好主意自己一边儿想去吧 ) ,然后再由 DispatcherServlet 去渲染视图. :wink:

[b][2] afterCompletion [/b]: 无返回. 这个方法调用 发生在 请求被处理完毕之后. 也就是视图渲染完成之后. 通常用来做一些资源清理的工作.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值