一、springMVC拦截器的实现一般有两种方式
第一种方式是要定义的Interceptor类要实现Spring的HandlerInterceptor 接口
第二种方式是继承实现了抽象类HandlerInterceptorAdapter
二、实例
1、编写拦截器
public class UserInterceptor implements HandlerInterceptor{ /** * 该方法在整个请求完成后执行,主要用来清理资源 * 该方法只能在当前interceptor的preHandler方法的返回值是true时才会执行 */ @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { } /** * 该方法在Controller的方法调用后执行,在视图被渲染以前被调用,所以可以用来对ModelAndView对象进行操作 * 该方法只能在当前interceptor的preHandler方法的返回值是true时才会执行 */ @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { } /** * 该方法在请求之前被调用 * 该方法返回为true时拦截器才会继续往下执行 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //用于判断用户是否登录 boolean flag = false; User user = (User) request.getSession().getAttribute("user"); if(user==null){ request.setAttribute("message", "请先登录"); request.getRequestDispatcher("loginPage.jsp").forward(request, response); }else{ flag = true; } return flag; } }
2、配置springmvc-config.xml,在里面配置拦截器,
<mvc:mapping path=""/>配置拦截路径
<mvc:exclude-mapping path=""/>配置不进行拦截的路径。
<!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <!-- 拦截路径 --> <mvc:mapping path="/*"/> <!-- 不拦截的路径 --> <mvc:exclude-mapping path="/login"/> <mvc:exclude-mapping path="/loginPage"/> <bean class="com.dj.interceptor.UserInterceptor"></bean> </mvc:interceptor> <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 --> </mvc:interceptors>
3、编写controller
@Controller public class UserController { @RequestMapping(value="/{pagename}") public String pageName(@PathVariable String pagename){ return pagename; } @RequestMapping("login") public ModelAndView login(String username,String password ,ModelAndView mv,HttpSession session){ if(username!=null&&username.equals("aaa")&&password!=null&&password.equals("111")){ User user = new User(); user.setUsername(username); user.setPassword(password); session.setAttribute("user", user); mv.setViewName("success"); }else{ mv.addObject("message", "账号或密码错误"); mv.setViewName("loginPage"); } return mv; } @RequestMapping("success") public String success(){ return "success"; } }
4、编写登录页面和显示登录成功的页面,显示登录成功的页面只有在登录后才能访问,如果没有登录就访问将会被拦截。
<form action="login" method="post"> <!-- 提示信息 --> <font color="red">${requestScope.message }</font><br> 用户名:<input type="text" name="username" /><br> 密码:<input type="password" name="password"/> <input type="submit" value="登录"/> </form>
<body> 登陆成功! </body>
5、测试
直接访问success页面被拦截
访问登录页面,因为配置了不进行拦截的路径,所以显示如下
输入账号密码登录成功