1. 拦截器在 mvc 框架中,起到了重要的作用,比如权限的检查,登陆验证等功能。
2. 在springmvc 中拦截器的实现方式有两种:HandlerIntercepted 接口和继承HandleInterceptedAdaptor类。
3. 实现自定义拦截器步骤:
- 自定义拦截器:
/** * 自定义拦截器实现 */ public class MyInterceptor implements HandlerInterceptor{ /** * 在处理器执行前执行,该方法返回true会继续执行下一个拦截器或者执行处理器方法 * 如果返回false将不再往下执行 * 一般进行一些初始化动作 比如 权限检查,登录检查 */ public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception { System.out.println("prehandle"); //resp.sendRedirect("index.jsp"); return true; } /** * preHandler返回true才会执行 * postHandle在处理器执行后, 在数据模型被渲染前执行 * 一般可用于处理数据模型,需要注意的问题是 preHandler先被调用,那么postHandle将会 * 后被调用 */ public void postHandle(HttpServletRequest req, HttpServletResponse resp, Object handler, ModelAndView mv) throws Exception { System.out.println("post-----"); } /** * preHandler返回true才会执行 * 在视图解析器执行后执行,视图被渲染后执行 * 一般用于清理工作 */ public void afterCompletion(HttpServletRequest req, HttpServletResponse resp, Object handler, Exception exception) throws Exception { System.out.println("after completion"); } }
- 配置拦截器
<!-- 拦截器配置 --> <mvc:interceptors> <mvc:interceptor> <!-- 配置映射路径 /hello 表示/hello将会被MyInterceptor拦截 /* 表示根路径下的所有请求都会被拦截 /** 表示根路径及其子路径下的所有请求都会被拦截 --> <mvc:mapping path="/hello"/> <!-- 配置拦截器 --> <bean class="cn.sxt.interceptor.MyInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
- 测试即可。
4. 登陆拦截器的实现:
public class LoginInterceptor extends HandlerInterceptorAdapter{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //判断请求的是否是登录 String url=request.getRequestURI(); if(url.endsWith("toLogin")||url.endsWith("login")){ return true; } //如果用户登录了 if(request.getSession().getAttribute("currentUser")!=null){ return true; } request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response); return false; } }