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; //测试拦截器1 public class HandlerInterceptor1 implements HandlerInterceptor{ //执行Handler方法之前执行 //用于身份认证、身份授权 //比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //return false表示拦截,不向下执行 //return true表示放行 return false; } //进入Handler方法之后,返回modelAndView之前执行 //应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里 //传到视图,也可以在这里统一指定视图 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } //执行Handler完成执行此方法 //应用场景:统一异常处理,统一日志处理 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
<bean class="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"/>一般不推荐使用。
<!-- 拦截器 --> <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>
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; //测试拦截器1 public class HandlerInterceptor1 implements HandlerInterceptor{ //执行Handler方法之前执行 //用于身份认证、身份授权 //比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("HandlerInterceptor1......preHandle"); //return false表示拦截,不向下执行 //return true表示放行 return false; } //进入Handler方法之后,返回modelAndView之前执行 //应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里 //传到视图,也可以在这里统一指定视图 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("HandlerInterceptor1......postHandle"); } //执行Handler完成执行此方法 //应用场景:统一异常处理,统一日志处理 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("HandlerInterceptor1......afterHandle"); } }
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; //测试拦截器2 public class HandlerInterceptor2 implements HandlerInterceptor{ //执行Handler方法之前执行 //用于身份认证、身份授权 //比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("HandlerInterceptor2......preHandle"); //return false表示拦截,不向下执行 //return true表示放行 return false; } //进入Handler方法之后,返回modelAndView之前执行 //应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里 //传到视图,也可以在这里统一指定视图 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("HandlerInterceptor2......postHandle"); } //执行Handler完成执行此方法 //应用场景:统一异常处理,统一日志处理 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("HandlerInterceptor2......afterHandle"); } }
HandlerInterceptor1...preHandle HandlerInterceptor2...preHandle HandlerInterceptor2...postHandle HandlerInterceptor1...postHandle HandlerInterceptor2...afterCompletion HandlerInterceptor1...afterCompletion
HandlerInterceptor1...preHandle HandlerInterceptor2...preHandle HandlerInterceptor1...afterCompletion
HandlerInterceptor1...preHandle
package cn.edu.hpu.ssm.controller; import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public 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{ //清除session session.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>
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方法之前执行 //用于身份认证、身份授权 //比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //获取请求的url String url=request.getRequestURI(); //判断url是否是公开地址(实际使用时将公开地址配置到配置文件中) if(url.indexOf("login.action")>=0){ //如果要进行登录提交,放行 return true; } //判断session HttpSession 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出发:将公用的模型数据(比如菜单导航)在这里 //传到视图,也可以在这里统一指定视图 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("HandlerInterceptor1......postHandle"); } //执行Handler完成执行此方法 //应用场景:统一异常处理,统一日志处理 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("HandlerInterceptor1......afterHandle"); } }
<!-- 拦截器 --> <mvc:interceptors> <!-- 多个拦截器,顺序执行 --> <!-- 登录认证拦截器 --> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="cn.edu.hpu.ssm.interceptor.LoginInterceptor"/> </mvc:interceptor> </mvc:interceptors>
我们输入账号(王五)密码(随便),发现登录进去,并且看到了用户名
点击退出再次退回登录界面,再次输入商品列表的网址,结果发现依旧被拦截在登录界面,原因是session已经被清除。
转载请注明出处:http://blog.csdn.net/acmman/article/details/47680517