Spring MVC-拦截器
来源:互联网 发布:淘宝为啥不能提交订单 编辑:程序博客网 时间:2024/06/01 21:06
入门案例
定义两个拦截器
public class HandlerInterceptor1 implements HandlerInterceptor { //在执行handler之前来执行的 //用于用户认证校验、用户权限校验 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("HandlerInterceptor1...preHandle"); //如果返回false表示拦截不继续执行handler,如果返回true表示放行 return true; } //在执行handler返回modelAndView之前来执行 //如果需要向页面提供一些公用 的数据或配置一些视图信息,使用此方法实现 从modelAndView入手 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("HandlerInterceptor1...postHandle"); } //执行handler之后执行此方法 //作系统 统一异常处理,进行方法执行性能监控,在preHandle中设置一个时间点,在afterCompletion设置一个时间,两个时间点的差就是执行时长 //实现 系统 统一日志记录 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("HandlerInterceptor1...afterCompletion"); }}
public class HandlerInterceptor2 implements HandlerInterceptor { //在执行handler之前来执行的 //用于用户认证校验、用户权限校验 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("HandlerInterceptor2...preHandle"); //如果返回false表示拦截不继续执行handler,如果返回true表示放行 return true; } //在执行handler返回modelAndView之前来执行 //如果需要向页面提供一些公用 的数据或配置一些视图信息,使用此方法实现 从modelAndView入手 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("HandlerInterceptor2...postHandle"); } //执行handler之后执行此方法 //作系统 统一异常处理,进行方法执行性能监控,在preHandle中设置一个时间点,在afterCompletion设置一个时间,两个时间点的差就是执行时长 //实现 系统 统一日志记录 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("HandlerInterceptor2...afterCompletion"); }}
拦截器要实现HandlerInterceptor 接口,或者继承已经实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter(抽象类中已经将这三个方法实现了,到时候可以需要哪个就写哪个,而不用都写了)。
- preHandle在执行Controller的方法之前调用。可以有多个拦截器,每个拦截器的调用会依据它的声明顺序依次执行。如果该方法的返回值为false,后续的拦截器和Controller都不会再执行,为true,则可以继续执行。
- postHandle:在Controller方法调用之后,DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。
- afterCompletion:在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。
在springmvc.xml中配置
<!--拦截器 --> <mvc:interceptors> <!--多个拦截器,顺序执行 --> <mvc:interceptor> <!-- /**可以拦截所有路径不管多少层 --> <mvc:mapping path="/**" /> <bean class="cn.itcast.springmvc.interceptor.HandlerInterceptor1"></bean> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="cn.itcast.springmvc.interceptor.HandlerInterceptor2"></bean> </mvc:interceptor> </mvc:interceptors
随便在浏览器中访问一个方法
当两个拦截器都为true时,打印结果为
HandlerInterceptor1...preHandleHandlerInterceptor2...preHandleHandlerInterceptor2...postHandleHandlerInterceptor1...postHandleHandlerInterceptor2...afterCompletionHandlerInterceptor1...afterCompletion
当都为false时
HandlerInterceptor1...preHandle
当第一个拦截器为true,第二个拦截器为false时
HandlerInterceptor1...preHandleHandlerInterceptor2...preHandleHandlerInterceptor1...afterCompletion
凡是preHandle返回true,afterCompletion必须执行。
想看原理的可以参看这篇博客,源码解析SpringMVC拦截器详解[附带源码分析] - format丶 - 博客园
http://www.cnblogs.com/fangjian0423/p/springMVC-interceptor.html
拦截器应用-用户认证拦截
public class LoginInterceptor extends HandlerInterceptorAdapter { //在执行handler之前来执行的 //用于用户认证校验、用户权限校验 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //得到请求的url String url = request.getRequestURI(); //判断是否是公开 地址 //实际开发中需要公开 地址配置在配置文件中 //... if(url.indexOf("login.action")>=0){ //如果是公开 地址则放行 return true; } //判断用户身份在session中是否存在 HttpSession session = request.getSession(); String usercode = (String) session.getAttribute("usercode"); //如果用户身份在session中存在放行 if(usercode!=null){ return true; } //执行到这里拦截,跳转到登陆页面,用户进行身份认证 request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response); //如果返回false表示拦截不继续执行handler,如果返回true表示放行 return false; }
<!--拦截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="cn.itcast.springmvc.interceptor.LoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
login.jsp
<form action="${pageContext.request.contextPath }/login.action">用户账号:<input type="text" name="usercode" /><br/>用户密码 :<input type="password" name="password" /><br/><input type="submit" value="登陆"/></form>
success.jsp
<body>用户名:${usercode}密码:${password}<a href="${pageContext.request.contextPath }/logout.action">退出</a></body>
//用户登陆提交方法 @RequestMapping("/login") public String login(HttpSession session, String usercode,String password)throws Exception{ if("admin".equals(usercode)){ session.setAttribute("usercode", usercode); return "/WEB-INF/jsp/success.jsp"; } return "/WEB-INF/jsp/login.jsp"; } //用户退出 @RequestMapping("/logout") public String logout(HttpSession session)throws Exception{ //session失效 session.invalidate(); return "/WEB-INF/jsp/login.jsp"; }
一开始访问Controller中的任何一个方法都会跳转到login.jsp。
当输入用户名admin,登陆后。就会把信息存到session中,就可以访问其他页面了。
阅读全文
0 0
- Spring MVC 拦截器
- Spring MVC 拦截器
- Spring MVC 拦截器
- spring MVC拦截器
- Spring MVC拦截器
- spring mvc 拦截器
- spring mvc 拦截器
- spring mvc 拦截器
- Spring mvc 拦截器
- spring mvc 拦截器
- spring mvc 拦截器
- spring mvc 拦截器
- Spring MVC 拦截器
- spring mvc拦截器
- spring mvc拦截器
- spring mvc拦截器
- spring mvc拦截器
- spring mvc 拦截器
- 每天五分钟linux(6)-rmdir
- Mac上搭建PHP环境
- 单文档(SDI)、多文档(MDI)框架的应用汇总文件.
- osg 3.4.0编译安装
- tomcat 日志分隔 1.2.3
- Spring MVC-拦截器
- EL表达式
- Docker实践快速入门
- 543. Diameter of Binary Tree
- unity3D 鼠标点击游戏物体碰撞 (射线)
- 进入jsp页面自动触发onclick()事件
- 物体检测系列之faster-rcnn原理介绍
- 关于IOS数据持久化
- 出现错误如下:AttributeError: 'module' object has no attribute 'SSL_ST_INIT'