一、概念

  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、测试

  

java 拦截器 拦截没用元标注的网页 拦截器拦截的是jsp代码_java 拦截器 拦截没用元标注的网页

 

三、案例,登录拦截器

  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:因作者能力有限,如有误还请谅解;