以前没有好好研究拦截器,今天研究一下,拦截器类似于Servlet 中的Filter,一般用来拦截请求,或者过滤一些东西,进行日志处理,编码等等!
1 SpringMvc拦截器实现机制实现接口HandlerInterceptor 接口中含有三个方法分别是:
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
此方法用在请求进入方法之前,参数request 可以获取一些session,获取请求的一些参数值等!
一般可以用来拦截登录,权限等。
return true 继续往下进行,return false; 不往下面执行,以下两个实现类方法不执行。
void postHandle(
HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception;
表示进入方法之后,返回视图之前执行。modelAndView参数,可以看到返回视图之前视图中的参数。
void afterCompletion(
HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception;
执行请求方法完成之后进行。一般用去异常处理,日志处理。
2 SpringMvc配置:
<!-- 配置拦截器 --> <mvc:interceptors> <!-- 多个拦截器,按顺序执行 --> <mvc:interceptor> <mvc:mapping path="/**"/> <!-- 拦截所有的url --> <bean class="com.udeam.intercepit.LoginIntercepit1"/> </mvc:interceptor> <!-- 其他拦截器 --> </mvc:interceptors>
3 SpringMvc 登陆拦截器
public class LoginIntercepit1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("拦截前1");
if(request.getRequestURI().indexOf("/login") > 0) {
return true;
// 这个 if是判断是否是登录的请求,return true 完成之后会执行请求方法。 执行login请求,完成之后在进行下面代码
}
HttpSession session = request.getSession();
String name = (String) session.getAttribute("name");
if(name != null) {
return true;
}
request.getRequestDispatcher("/login.jsp").forward(request, response);
return false; // false 不放行 , true 放行
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("拦截中1");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("拦截后1");
}
}
UserController
@Controller
public class UserController {
@RequestMapping("login")
public String lgin(String name , String pwd ,HttpServletRequest request) {
if(name.equals("zs") && pwd.equals("zs")) {
request.getSession().setAttribute("name", name);
}
request.setAttribute("name",request.getSession().getAttribute("name"));
return "user";
}
}
多个拦截器:
在定义两个拦截器,配置并且运行:
public class LoginIntercepit2 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("拦截前2");
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("拦截中2");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("拦截后2");
}
}
public class LoginIntercepit2 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("拦截前3");
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("拦截中3");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("拦截后3");
}
}
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 多个拦截器,按顺序执行 -->
<mvc:interceptor>
<mvc:mapping path="/**"/> <!-- 拦截所有的url包括子url路径 -->
<bean class="cn.itvk.intercepit.LoginIntercepit1"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.itvk.intercepit.LoginIntercepit2"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.itvk.intercepit.LoginIntercepit3"/>
</mvc:interceptor>
<!-- 其他拦截器 -->
</mvc:interceptors>
运行结果
preHandle 方法会顺序执行,postHandle 和 afterCompletion 方法会逆向执行
将第二个拦截器 preHandle 返回改为 false, 你会发现后面2个方法不执行;