作用:
拦截器只能拦截controller中的方法
一 编写拦截器(可以编写多个拦截器,链式嵌套执行)必须实现HandlerInterceptor并ctor+o 重写三个方法
package cn.lgy.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** *自定义拦截器 */ public class MyInterceptor implements HandlerInterceptor { /** * 拦截器预处理,在controller方法之前处理 * 如果为ture则执行下一个拦截器,如果没有下一个拦截器,就执行controller方法 * 如果为false,则被拦截,不执行controller方法,直接用request或response跳转页面,提示没有访问权限
* 在于处理中进行逻辑判断,比如判断有没有登录. * @param request * @param response * @param handler * @return * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("预处理执行"); // 如果预处理返回为fals则自定义转发响应页面,不执行controller方法 // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response); return true; } /** * 这是拦截器后处理,在conroller方法执行后执行 * @param request * @param response * @param handler * @param modelAndView * @throws Exception */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("后处理页面执行了"); // 执行完controller方法后可以自定义跳转页面,这样就不会跳转到controller方法的路径, // 但controller方法执行了. request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response); } /** * 该方法在请求处理完成,页面响应之后执行 * @param request * @param response * @param handler * @param ex * @throws Exception */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("最后执行了"); } }
二 配置拦截器(在springmvc.xml中配置),有多个自定义拦截器,就配置多个
<!--配置拦截器,可配置多个--> <mvc:interceptors> <!--配置一个拦截器--> <mvc:interceptor> <!--要拦截的具体方法--> <mvc:mapping path="/user/*"/> <!--不拦截的方法,和<mvc:mapping path=""/>只用配置一个--> <!--<mvc:exclude-mapping path=""/>--> <!--配置拦截器对象,并注入IOC容器--> <bean id="myInterceptor" class="cn.lgy.interceptor.MyInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
controller中的方法如下:
package cn.lgy.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/user") public class UserController { @RequestMapping("/testInterceptor") public String testException()throws Exception{ System.out.println("testInterceptor"); return "success"; } }