【SpringMVC整合MyBatis】springmvc拦截器-定义和配置

来源:互联网 发布:手机版商城源码 编辑:程序博客网 时间:2024/06/07 05:20
拦截器
1.拦截定义

定义拦截器,实现HandlerInterceptor接口。接口中提供三个方法。
package cn.edu.hpu.ssm.interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;//测试拦截器1public class HandlerInterceptor1 implements HandlerInterceptor{//执行Handler方法之前执行//用于身份认证、身份授权//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception {//return false表示拦截,不向下执行//return true表示放行 return false;}//进入Handler方法之后,返回modelAndView之前执行//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里//传到视图,也可以在这里统一指定视图@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response,Object handler, ModelAndView modelAndView) throws Exception { }//执行Handler完成执行此方法//应用场景:统一异常处理,统一日志处理@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response,Object handler, Exception ex)throws Exception { }}

2.拦截器配置
2.1针对HandlerMapping配置
springmvc拦截器针对HandlerMapping进行拦截设置,如果在某个HandlerMapping中配置拦截,经过该 HandlerMapping映射成功的handler最终使用该拦截器。
<beanclass="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"><property name="interceptors"><list><ref bean="handlerInterceptor1"/><ref bean="handlerInterceptor2"/></list></property></bean><bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1"/><bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2"/>
一般不推荐使用。


2.2类似全局的拦截器
springmvc配置类似全局的拦截器,springmvc框架将配置的类似全局的拦截器注入到每个HandlerMapping中。
<!-- 拦截器 --><mvc:interceptors><!-- 多个拦截器,顺序执行 --><mvc:interceptor><!-- /**表示所有url包括子url路径 --><mvc:mapping path="/**"/><bean class="cn.edu.hpu.ssm.interceptor.HandlerInterceptor1"/></mvc:interceptor><mvc:interceptor><mvc:mapping path="/**"/><bean class="cn.edu.hpu.ssm.interceptor.HandlerInterceptor2"/></mvc:interceptor></mvc:interceptors>

3.拦截测试
3.1测试需求
测试多个拦截器各各方法执行时机。

3.2编写两个拦截
HandlerInterceptor1.java:
package cn.edu.hpu.ssm.interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;//测试拦截器1public class HandlerInterceptor1 implements HandlerInterceptor{//执行Handler方法之前执行//用于身份认证、身份授权//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception {System.out.println("HandlerInterceptor1......preHandle");//return false表示拦截,不向下执行//return true表示放行 return false;}//进入Handler方法之后,返回modelAndView之前执行//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里//传到视图,也可以在这里统一指定视图@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response,Object handler, ModelAndView modelAndView) throws Exception {System.out.println("HandlerInterceptor1......postHandle");}//执行Handler完成执行此方法//应用场景:统一异常处理,统一日志处理@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response,Object handler, Exception ex)throws Exception {System.out.println("HandlerInterceptor1......afterHandle");}}

HandlerInterceptor2.java:
package cn.edu.hpu.ssm.interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;//测试拦截器2public class HandlerInterceptor2 implements HandlerInterceptor{//执行Handler方法之前执行//用于身份认证、身份授权//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception {System.out.println("HandlerInterceptor2......preHandle");//return false表示拦截,不向下执行//return true表示放行 return false;}//进入Handler方法之后,返回modelAndView之前执行//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里//传到视图,也可以在这里统一指定视图@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response,Object handler, ModelAndView modelAndView) throws Exception {System.out.println("HandlerInterceptor2......postHandle");}//执行Handler完成执行此方法//应用场景:统一异常处理,统一日志处理@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response,Object handler, Exception ex)throws Exception {System.out.println("HandlerInterceptor2......afterHandle");}}

3.3两个拦截器都放行
将preHandle方法的返回值设为true,然后随便访问一个controller,控制台打印一下结果:
HandlerInterceptor1...preHandleHandlerInterceptor2...preHandleHandlerInterceptor2...postHandleHandlerInterceptor1...postHandleHandlerInterceptor2...afterCompletionHandlerInterceptor1...afterCompletion

总结:
preHandle方法按顺序执行,
postHandle和afterCompletion按拦截器配置的逆向顺序执行。

3.4拦截器1放行,拦截器2不放行
HandlerInterceptor1...preHandleHandlerInterceptor2...preHandleHandlerInterceptor1...afterCompletion

总结:
拦截器1放行,拦截器2 preHandle才会执行。
拦截器2 preHandle不放行,拦截器2 postHandle和afterCompletion不会执行。
只要有一个拦截器不放行,postHandle不会执行。

3.5拦截器1不放行,拦截器2不放行
HandlerInterceptor1...preHandle

拦截器1 preHandle不放行,postHandle和afterCompletion不会执行。
拦截器1 preHandle不放行,拦截器2不执行。

4.根据测试结果,对拦截器应用。

比如:统一日志处理拦截器,需要该拦截器preHandle一定要放行,且将它放在拦截器链接中第一个位置。

比如:登陆认证拦截器,放在拦截器链接中第一个位置。权限校验拦截器,放在登陆认证拦截器之后。(因为登陆通过后才校验权限)

5拦截器应用(实现登陆认证)

5.1需求

(1)用户请求url
(2)拦截器进行拦截校验
如果请求的url是公开地址(无需登陆即可访问的url),让放行
如果用户session 不存在跳转到登陆页面
如果用户session存在放行,继续操作。

5.2登陆controller方法
package cn.edu.hpu.ssm.controller;import javax.servlet.http.HttpSession;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controllerpublic class LoginController {//登录@RequestMapping("/login")public String login(HttpSession session,String username,String password)throws Exception{//调用serivce进行用户身份验证//...//在session中保存用户身份信息session.setAttribute("username", username);//重定向到商品列表界面return "redirect:/items/queryItems.action";}//退出@RequestMapping("/logout")public String logout(HttpSession session)throws Exception{//清除sessionsession.invalidate();//重定向到商品列表界面return "redirect:items/queryItems.action";}}

登录页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">        <title>系统登录</title>  </head>    <body>   <form action="${pageContext.request.contextPath }/login.action" method="post">   用户账号:<input type="text" name="username"/><br/>   用户密码:<input type="password" name="password"/><br/>   <input type="submit" value="登录"/>   </form>  </body></html>

在商品列表那里加入:
当前用户:${username }|<c:if test="${username!=null }"><a href="${pageContext.request.contextPath }/logout.action">退出</a></c:if>

5.3登陆认证拦截实现

5.3.1代码实现
package cn.edu.hpu.ssm.interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;//登录认证的拦截器public class LoginInterceptor implements HandlerInterceptor{//执行Handler方法之前执行//用于身份认证、身份授权//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception {//获取请求的urlString url=request.getRequestURI();//判断url是否是公开地址(实际使用时将公开地址配置到配置文件中)if(url.indexOf("login.action")>=0){//如果要进行登录提交,放行return true;}//判断sessionHttpSession session=request.getSession();//从session中取出用户份信息String username=(String)session.getAttribute("username");if(username!=null){//身份存在,放行return true;}//执行这里表示用户身份需要验证,跳转到登录界面request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);//return false表示拦截,不向下执行//return true表示放行 return false;}//进入Handler方法之后,返回modelAndView之前执行//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里//传到视图,也可以在这里统一指定视图@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response,Object handler, ModelAndView modelAndView) throws Exception {System.out.println("HandlerInterceptor1......postHandle");}//执行Handler完成执行此方法//应用场景:统一异常处理,统一日志处理@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response,Object handler, Exception ex)throws Exception {System.out.println("HandlerInterceptor1......afterHandle");}}

5.3.2拦截器配置
springmvc.xml中配置:
<!-- 拦截器 --><mvc:interceptors><!-- 多个拦截器,顺序执行 --><!-- 登录认证拦截器 --><mvc:interceptor><mvc:mapping path="/**"/><bean class="cn.edu.hpu.ssm.interceptor.LoginInterceptor"/></mvc:interceptor></mvc:interceptors>

测试:
输入商品列表的网址,结果发现被拦截在登录界面(原因:拦截器没有检测到登录用户的session,所以判定用户没有登录,没有权限查看商品列表)


我们输入账号(王五)密码(随便),发现登录进去,并且看到了用户名


点击退出再次退回登录界面,再次输入商品列表的网址,结果发现依旧被拦截在登录界面,原因是session已经被清除。

转载请注明出处:http://blog.csdn.net/acmman/article/details/47680517

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 媳妇一再触碰我的底线怎么办 发票商品编码好多选错了分类怎么办 吃了用福尔马林泡的食物怎么办 没大没小说话不尊重人的孩子怎么办 升级安卓8.0后app闪退怎么办 业主装门占用消防通道物业怎么办? 想改名字派出所不给改怎么办 物业不给地热打压影响装修怎么办 pos机pin效码验证错误怎么办 苹果下载东西要发验证码怎么办 接口断在了丝扣里面怎么办 政府下了一张关停取缔单怎么办 微信运动数据不刷新了怎么办 邻居霸占我的土地不还我该怎么办 双层水浴式杀菌锅阀门坏了怎么办 通下水管的钢丝断水管里了怎么办 塑料水管与水阀连接处漏水怎么办 介质流向标识管道温度太高怎么办 雪碧里气体太多瓶子涨得要炸怎么办 餐厅不清洗油烟管道物业该怎么办 用完权健洁净宝后奇痒的厉害怎么办 老房子铸铁暖气管从外锈蚀了怎么办 德意壁挂炉补水多了水压过高怎么办 新空调的散热片铜管漏了怎么办 猪舍被别人推掉漏电电到人怎么办? 网上买的燃气灶连接用软管怎么办 哈弗h3后减振器上支架坏了怎么办 汽车用收录机电机皮带断了怎么办 大便太粗把马桶堵了怎么办 大便过粗把马桶堵了怎么办 大便硬的像石头拉不出来怎么办 家里埋在地下的水管漏水怎么办 埋在墙里的水管漏水怎么办 开发商暗埋水管热熔接头漏水怎么办 钻墙把水管钻破了怎么办 钻墙时不小心把水管钻破了怎么办 孩子把同桌的铅笔盒弄坏了怎么办 水管伐坏了物业不给修怎么办 卫生间埋在地下的水管漏水怎么办 埋在地下的水管冻住了怎么办 洗脸盆下水管有眉笔掉堵了怎么办