springMVC4(16)拦截器解析与登陆拦截模拟
来源:互联网 发布:linux 翻译软件 编辑:程序博客网 时间:2024/04/29 09:32
在SpringMVC中,我们会经常使用到拦截器,虽然SpringAOP也能帮我们实现强大的拦截器功能,但在Web资源供给上,却没有SpringMVC来得方便快捷。
使用SpringMVC拦截器的核心应用场景是根据我们的实际需求,个性化定制拦截器,再对特定url进行拦截处理。
而自定义拦截器,首先需要我们实现HandlerInterceptor拦截器接口,下面是它的定义:
package org.springframework.web.servlet; public interface HandlerInterceptor { //在控制器方法调用前执行 //返回值为是否中断,true,表示继续执行(下一个拦截器或处理器) //false则会中断后续的所有操作,所以我们需要使用response来响应请求 boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; //在控制器方法调用后,解析视图前调用,我们可以对视图和模型做进一步渲染或修改 void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception; //整个请求完成,即视图渲染结束后调用,这个时候可以做些资源清理工作,或日志记录等 void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception; }
很多时候,我们只需要实现以上三个方法的任意一个或两个,这个时候我们可以选择继承HandlerInterceptorAdapter。它实现了AsyncHandlerInterceptor接口,为每个方法提供了空实现,这样,我们就可以根据需求重写自己用到的拦截方法即可。具体定义如下:
public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } @Override public void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } @Override public void afterConcurrentHandlingStarted( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { }}
相对于HandlerInterceptor,HandlerInterceptorAdapter多了一个实现方法afterConcurrentHandlingStarted(),它来自HandlerInterceptorAdapter的直接实现类AsyncHandlerInterceptor,AsyncHandlerInterceptor接口直接继承了HandlerInterceptor,并新添了afterConcurrentHandlingStarted()方法用于处理异步请求,当Controller中有异步请求方法的时候会触发该方法时,异步请求先支持preHandle、然后执行afterConcurrentHandlingStarted。异步线程完成之后执行preHandle、postHandle、afterCompletion。
下面我们以登陆请求为例,编写我们的自定义拦截器:
public class LoginInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception { // 获得请求路径的uri String uri = request.getRequestURI(); // 进入登录页面,判断session中是否有key,有的话重定向到首页,否则进入登录界面 if(uri.contains("login")) { if(request.getSession().getAttribute("user") != null) { response.sendRedirect(request.getContextPath());//默认跟路径为首页 } else { return true;//继续登陆请求 } } // 其他情况判断session中是否有key,有的话继续用户的操作 if(request.getSession().getAttribute("user") != null) { return true; } // 最后的情况就是进入登录页面 response.sendRedirect(request.getContextPath() + "/login"); return false; }}
下面是我们的拦截器配置:
<mvc:interceptors> <mvc:interceptor><!--配置局部拦截器,需要满足下列路径条件--> <mvc:exclude-mapping path="/user/logout"/><!--注销--> <mvc:exclude-mapping path="/home/"/><!--在home中定义了无须登陆的方法请求,直接过滤拦截--> <mvc:mapping path="/**"/> <bean class="com.mvc.interceptor..LoginInterceptor"/><!--自定义拦截器注册--> </mvc:interceptor> <!-- 我们可以直接在者注册自定义拦截器Bean来配置全局拦截器,会对所有请求拦截--></mvc:interceptors>
在我们的拦截中,如果配置了多个拦截器,会形成一条拦截器链,执行顺序类似于AOP,前置拦截先定义的先执行,后置拦截和完结拦截(afterCompletion)后注册的后执行,关于拦截器的执行顺序的深入理解可参考我的另一篇文章《 spring学习笔记(12)@AspectJ研磨分析[3]增强织入顺序实例详解》
- springMVC4(16)拦截器解析与登陆拦截模拟
- SpringMvc4拦截器
- SpringMVC4拦截器的使用
- 登陆拦截器与登陆过滤器
- Struts2 登陆拦截器
- struts2登陆拦截器
- strust2拦截器--登陆
- 登陆拦截器
- springMVC登陆拦截器
- 登陆拦截 filter() , 字符编码拦截器
- 登陆拦截 filter() , 字符编码拦截器
- Struts2拦截器之使用拦截器模拟实现登陆校验
- 登陆拦截
- 拦截器模拟
- 模拟struts拦截器
- 登陆检查设置拦截器
- sturts配置登陆拦截器
- java WEB 登陆拦截器
- Quartus 13.0安装教程
- C++引用详解
- 联编-迟后联编-先期联编
- BZOJ 3141: [Hnoi2013]旅行
- Bootstrap学习笔记—学习制作轮播
- springMVC4(16)拦截器解析与登陆拦截模拟
- HDU 1069 Monkey and Banana 基础DP
- 移动APP的开发需求分析
- 安装memcache
- 2004: [Hnoi2010]Bus 公交线路
- ionic入门教程第五课-举例子说明异步回调$q及$q在项目中的用法
- jsp 处理表单数据
- 第六章 第一节
- ActiveMQ进阶配置