springmvc 拦截器
springmvc 拦截器 - 哎幽的成长 - CSDN博客
http://blog.csdn.net/u012373815/article/details/47208565
拦截器的机制是属于 AOP的
1.1
定义
Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。
1.2
拦截器定义
实现
HandlerInterceptor
接口,如下:
Public class HandlerInterceptor1 implementsHandlerInterceptor{/*** controller执行前调用此方法
* 返回true表示继续执行,返回false中止执行
* 这里可以加入登录校验、权限拦截等*/@Override
PublicbooleanpreHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)throwsException {//TODO Auto-generated method stub Return false;
}/*** controller执行后但未返回视图前调用此方法
* 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示*/@Override
PublicvoidpostHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView)throwsException {//TODO Auto-generated method stub }/*** controller执行后且视图返回后调用此方法
* 这里可得到执行controller时的异常信息
* 这里可记录操作日志,资源清理等*/@Override
PublicvoidafterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)throwsException {//TODO Auto-generated method stub }
}
1.3
拦截器配置
1.3.1
针对某种
mapping
配置拦截器
<beanclass="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> <propertyname="interceptors"> <list> <refbean="handlerInterceptor1"/> <refbean="handlerInterceptor2"/> </list> </property> </bean> <beanid="handlerInterceptor1"class="springmvc.intercapter.HandlerInterceptor1"/> <beanid="handlerInterceptor2"class="springmvc.intercapter.HandlerInterceptor2"/>
1.3.2
针对所有
mapping
配置全局拦截器
<!--拦截器--> <mvc:interceptors>//类似MVC注解驱动的标签<!--多个拦截器,顺序执行--> <!--登陆认证拦截器--> <mvc:interceptor> <mvc:mappingpath="/**"/> <beanclass="cn.itcast.ssm.interceptor.LoginInterceptor"></bean> </mvc:interceptor> <mvc:interceptor> <!--/**表示所有url包括子url路径--> <mvc:mappingpath="/**"/>//如果只有一个 /*只会执行最根的那层url<beanclass="cn.itcast.ssm.interceptor.HandlerInterceptor1"></bean> </mvc:interceptor> <mvc:interceptor> <mvc:mappingpath="/**"/> <beanclass="cn.itcast.ssm.interceptor.HandlerInterceptor2"></bean> </mvc:interceptor> </mvc:interceptors>
正常流程测试
1.1.1
代码:
定义两个拦截器分别为:
HandlerInterceptor1
和
HandlerInteptor2
,每个拦截器的
preHandler
方法
都返回
true
。
1.1.2
运行流程
HandlerInterceptor1..preHandle..
HandlerInterceptor2..preHandle..
HandlerInterceptor2..postHandle..
HandlerInterceptor1..postHandle..
HandlerInterceptor2..afterCompletion..
HandlerInterceptor1..afterCompletion..
1.2
中断流程
测试
1.2.1
代码:
定义两个拦截器分别为:
HandlerInterceptor1
和
HandlerInteptor2
。
1.2.2
运行流程
HandlerInterceptor1
的
preHandler
方法返回
false
,
HandlerInterceptor2
返回
true
,
运行流程如下
:
HandlerInterceptor1..preHandle..
从日志看出第一个拦截器的
preHandler
方法返回
false
后第一个拦截器只执行了
preHandler
方法,其它两个方法没有执行,第二个拦截器的所有方法不执行,且
controller
也不执行了。
HandlerInterceptor1
的
preHandler
方法返回
true
,
HandlerInterceptor2
返回
false
,
运行流程如下
:
HandlerInterceptor1..preHandle..
HandlerInterceptor2..preHandle..
HandlerInterceptor1..afterCompletion..
从日志看出第二个拦截器的
preHandler
方法返回
false
后第一个拦截器的
postHandler
没有执行,第二个拦截器的
postHandler
和
afterCompletion
没有执行,且
controller
也不执行了。
总结:
preHandle按拦截器定义顺序调用
postHandler按拦截器定义逆序调用
afterCompletion按拦截器定义逆序调用
postHandler在拦截器链内所有拦截器返成功调用
afterCompletion只有preHandle返回true才调用
1.3
拦截器应用
1.3.1
用户身份认证
Public class LoginInterceptor implementsHandlerInterceptor{
@Override
PublicbooleanpreHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)throwsException {//如果是登录页面则放行
if(request.getRequestURI().indexOf("login.action")>=0){return true;
}
HttpSession session=request.getSession();//如果用户已登录也放行
if(session.getAttribute("user")!=null){return true;
}//用户没有登录挑战到登录页面
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);return false;
}
1.3.2
用户登陆
controller
//登陆提交//userid:用户账号,pwd:密码
@RequestMapping("/login")public String loginsubmit(HttpSession session,String userid,String pwd)throwsException{//向session记录用户身份信息
session.setAttribute("activeUser", userid);return "redirect:item/queryItem.action";
}//退出
@RequestMapping("/logout")public String logout(HttpSession session)throwsException{//session过期
session.invalidate();return "redirect:item/queryItem.action";
}
《17springmvc拦截器-实现登陆认证.avi》课程的18分处 处理中文乱码,提交为什么改成post就不会有乱码了呢??