框架理论深入(六)--拦截器
一、概念
1、拦截器拦截的是controller,类似于AOP;
2、拦截器只会拦截.action,不会去拦截jsp文件,过滤器才会去拦截jsp文件(过滤器拦截的是所有的URL);
二、拦截器的实现
1、创建一个拦截器,实现HandlerInterceptor接口,并且声明它为一个bean;
@Component public class MyInterceptor implements HandlerInterceptor { @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { // 执行Hander完成后执行:统一异常处理,日志操作 System.out.println("afterCompletion:执行Hander完成后执行:统一异常处理,日志操作"); } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { // 进入Hander方法之后,返回ModelAndView之前执行:将公用模型数据传递到视图 System.out.println("postHandle:进入Hander方法之后,返回ModelAndView之前执行:将公用模型数据传递到视图"); } @Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { // 进入Hander方法之前执行,用于权限身份验证 System.out.println("preHandle:进入Hander方法之前执行,用于权限身份验证");return true; } }
2、在SpringMVC配置文件中配置拦截器,给出拦截器类的bean;
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <ref bean="myInterceptor"/> </mvc:interceptor> </mvc:interceptors>
3、测试
三、案例,登录拦截器
1、首先,进行登录权限验证我们需要使用到的拦截器的方法为:preHandle();
@Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { // 进入Hander方法之前执行,用于权限身份验证 System.out.println("preHandle:进入Hander方法之前执行,用于权限身份验证"); return true; }
2、编写登录页面
<body> <form action="login.action" method="post"> 用户名:<input type="text" name="name" /><br> 密码:<input type="text" name="password" /><br> <input type="submit" /> </form> </body>
3、书写登录的controller方法
@Controller public class LoginController { @RequestMapping("/login.action") public String login(User user,HttpSession session,Model model) { if("admin".equals(user.getName()) && "admin".equals(user.getPassword())) { System.out.println("登录成功"); session.setAttribute("login", "suc"); model.addAttribute("result","suc"); }else { model.addAttribute("result","error"); } return "result"; } }
4、在拦截器中书写方法
@Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { // 进入Hander方法之前执行,用于权限身份验证 System.out.println("preHandle:进入Hander方法之前执行,用于权限身份验证"); //判断是否进入的是login.action所对应的方法;如果是,则进入对应的方法;如果不是,则返回登录页;(只能拦截action) String url = arg0.getRequestURI(); if(url.indexOf("login.action")>=0) { return true; } //如果不是进入的login.action方法,则判断是否已经登录成功; HttpSession session=arg0.getSession(); String login=(String) session.getAttribute("login"); if(login!=null && login.equals("suc")) { return true; } arg0.getRequestDispatcher("login.jsp").forward(arg0, arg1); return false; }
(1)、第一个if判断;判断的是是否进入的是登录的controller方法,也就是判断是否是通过登录页进入;
(2)、第二个if判断;判断的是用户是否已经成功登录;
注:因为拦截器也是SpringMVC中的一个bean,所以也可以在拦截器类中注入dao,直接从数据库中读取数据,方便完成拦截的功能;
PS:因作者能力有限,如有误还请谅解;