Spring MVC拦截器开发实例讲解
来源:网络整理时间:2024-04-27 14:14:52
摘要:Spring MVC拦截器开发实例讲解
Spring MVC拦截器开发实例讲解,以下是小编整理的详细信息,因信息具有时效性,仅供参考。
一、什么是拦截器
Java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是否登陆,统一处理系统日志等。
二、拦截器的开发
1、创建一个测试拦截器类,并实现HandlerInterceptor接口的几个方法
在idea中,快速实现接口方法的快捷键是 Ctrl+I
接口实现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、拦截器的测试
编写两个简单的拦截器,输出当前执行的方法名称,并且全部方向,测试执行结果。
当拦截器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、拦截器开发
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、运行测试
访问静态页面
点击列表,拦截器生效,并跳转到login视图,点击登录调用@RequestMapping("/login")
进入列表页面
调用logout和logout.action都可以访问到@RequestMapping("/logout"),完成注销,因为系统使用了两个前端控制器,详情可以参考关于RESTfull的开发实例
【微语】爱的重点不是要求和依赖别人对自己好,而是先让自己值得别人为你付出。爱你,爱得舒服自在。
- 热门推荐
- zhongshan.safetree。com.cn中山市学校安全教育平台04-18
- 为生存辍学走上写作之路 阅读答案04-16
- http;//www.jje.cn/九江教育网中考查分04-23
- 韩愈《乌氏庙碑铭》阅读答案04-16
- ningxia.safetree.com.cn宁夏学校安全教育平台登录入口04-23
- 住房城乡建设部《住房公积金管理条例(修订送审稿)》说明04-16
- http;//218.65.113.61/贵州自学考试报名系统04-23
- heze.safetree.com.cn菏泽学校安全教育04-16
- http;//gkzy.gzszk.com/贵州省高考成绩查询系统04-23
- linyi.safetree.com.cn04-18