一起文库网 懒人学习网 雨竹林中考网 高考报名网 雨竹林文档网 加入收藏 设为首页

雨竹林文档网      懒人考试网|阳光学习网


Spring MVC拦截器开发实例讲解

一起文库网   来源: Spring MVC  2024-04-08     

本站非官方网站,信息完全免费,仅供参考,不收取任何费用,具体请以官网公布为准!
一、什么是拦截器
Java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
 
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是否登陆,统一处理系统日志等。
 
二、拦截器的开发
 
1、创建一个测试拦截器类,并实现HandlerInterceptor接口的几个方法
 
在idea中,快速实现接口方法的快捷键是 Ctrl+I
Image.png
 
接口实现3个方法说明:
 
1)、public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
 
执行时机:在进入handler方法之前执行
 
应用场景:一般用于进行身份认证和身份授权
 
           如果身份认证不通过,要拦截,不向下执行,
           return false表示拦截,return true表示放行
2)、public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
 
执行时机:进入handler方法之后,返回ModelAndView之前
 
应用场景:一般用于将共用的模型数据在这里传入视图(比如菜单导航),也可以在这里统一指定视图。
 
3)、public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
 
执行时机:执行handler完成后
应用场景:统一异常处理、统一日志处理
 
2、在springmvc中配置拦截器
方法一:
springmvc的拦截器不是全局的,针对HandlerMapping进行拦截器的设置,如果在某个HandlerMapping中配置了拦截器,经过该HandlerMapping映射成功的handler最终才使用该拦截器。
这个一般不常用,太麻烦
方法二:
spingmvc配置类似全局拦截器,springmvc框架将配置的拦截器注入到每个HandlerMapping中。
 
在spingmvc.xml中添加拦截器的配置信息,Springmvc支持多拦截器,要注意连接器链的顺序,/**表示支持子目录
 
<!--拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="fred.ssm.interceptor.HandlerInterceptor1"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="fred.ssm.interceptor.HandlerInterceptor2"/>
</mvc:interceptor>
</mvc:interceptors>
这个实例我们测试2个拦截器,验证拦截器的运行时机
 
3、拦截器的测试
 
编写两个简单的拦截器,输出当前执行的方法名称,并且全部方向,测试执行结果。
QQ截图20180118160612.jpg
QQ截图20180118160654.jpg
 
当拦截器1和拦截器2都放行时:
查看日志输出
 
HandlerInterceptor1.preHandle
HandlerInterceptor2.preHandle
HandlerInterceptor2.postHandle
HandlerInterceptor1.postHandle
HandlerInterceptor2.afterCompletion
HandlerInterceptor1.afterCompletion
当拦截器1放行和拦截器2不放行:
 
HandlerInterceptor1.preHandle
HandlerInterceptor2.preHandle
HandlerInterceptor1.afterCompletion
当拦截器1不放行和拦截器2放行:
 
HandlerInterceptor1.preHandle
HandlerInterceptor1.preHandle
当拦截器1不放行和拦截器2不放行:
 
HandlerInterceptor1.preHandle
4、总结:
1)、拦截器中只要有一个不放行,其后面的代码均不执行
2)、一个拦截器的执行顺序是:preHandle、postHandle、afterCompletion
3)、多个拦截器的执行顺序类似堆栈的概念,preHandle可以看成是堆(先进先出),postHandle、afterCompletion可以看成是栈(先进后出)
 
不管多少个拦截器,所有preHandle都是最先执行,而且按拦截器链顺序执行
所有拦截器的preHandle执行完成后,执行postHandle,且是先进后出,先执行最后面拦截器的postHandle
直到第一个拦截器的postHandle执行完成后,开始执行afterCompletion,也是先进后出的顺序,最后执行第一个拦截器的afterCompletion。
 
三、拦截器应用,用户登录
 
1、设计思想:
获取用户请求的url
如果url为公开地址,不需要认证,直接放行,
如果用户session不存在,跳转到登录页面
如果用户session存在,放行
 
2、controller开发
 
@Controller
public class LoginController {
@RequestMapping("/login")
public String login(HttpSession session,String username,String password) throws Exception{
//创建session保存用户登录信息
session.setAttribute("username",username);
return "redirect:/user/queryUserlist.action";
}
 
@RequestMapping("/logout")
public String logout(HttpSession session) throws Exception{
//清楚session
session.invalidate();
return "redirect:/";
}
}
3、拦截器开发
QQ截图20180118160944.jpg
 
4、login视图开发
 
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户登录</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/login.action">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit" value="登录">
</form>
 
</body>
</html>
5、springmvc拦截器配置
 
<!--拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="fred.ssm.interceptor.HandlerInterceptor1"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="fred.ssm.interceptor.HandlerInterceptor2"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="fred.ssm.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
添加拦截器LoginInterceptor
 
6、运行测试
访问静态页面
Image.png
 
点击列表,拦截器生效,并跳转到login视图,点击登录调用@RequestMapping("/login")
Image.png
进入列表页面
Image.png
 
调用logout和logout.action都可以访问到@RequestMapping("/logout"),完成注销,因为系统使用了两个前端控制器,详情可以参考关于RESTfull的开发实例
Image.png
Image.png

懒人学习网   学习文档   news.lazyedu.cn : 懒人学习网,免费分享学习资料。

[责任编辑:文库在线]

懒人学习百事通懒人学习网 懒人考试网

学参学习网,非官方公益学习阅读网!

非官方网站: 本站为网址导航站点,非官方网站,具体以官方网站公布为准.

公益免费: 本站所有信息完全免费,不收取任何费用,谨防上当受骗.

信息仅供参考: 因信息具有时效性,本站所有信息仅供参考,请勿用于非法用途.


郑重声明:本站不开设任何辅导班,谨防上当受骗!完全公益站点,不接受任何赞助!



免费阅读

新免费分享的文档

本站所有信息完全免费,不收取任何费用!

使用必读 |   学习文库 |   阳光学习网 |   山东高考网 |   懒人考试网 |   郑重声明 |   懒人考试网 | 高考频道

(C) 考试专题  学参网手机版  学习专题   版权所有

非官方公益学习网,本站不开设任何辅导班、不收取任何费用!闽ICP备11025842号-4 | 打着本站名义收费的均为冒充的骗子!

Copyright XUECAN, All Rights Reserved.