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