SpringMVC 中的 Interceptor 拦截器也是相当重要和相当有用的,它的次要作用是拦挡用户的申请并进行相应的解决。比方通过它来进行权限验证,或者是来判断用户是否登陆等操作。
SpringMVC 拦截器的定义形式
- 实现接口
- 继承适配器
案例实操
实现接口
实现 HandlerInterceptor 接口方式定义咱们的拦截器代码如下:
public class MyInterceptor implements HandlerInterceptor{ /** * preHandle 在申请办法拦挡前执行 * 返回 true 代表对以后申请进行放行解决 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("action 之前执行!!!"); return true; //继续执行 action } /** * 申请执行后,生成视图前执行 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("Action 执行之后,生成视图之前执行!!"); } /** * 在申请办法执行后进行拦挡 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("办法执行后进行拦挡。。开释资源。。。"); } }
对应配置有两种形式:
配置形式一(拦挡所有申请配置形式):
<mvc:interceptors> <!-- 应用 bean 定义一个 Interceptor 间接定义在 mvc:interceptors 根上面的 Interceptor 将拦挡所有的申请 --> <bean class="com.xxx.interceptors.MyInterceptor" /> </mvc:interceptors>
配置形式二(拦挡指定申请配置形式)
mvc:interceptors
<mvc:interceptor> <mvc:mapping path="/test/*.do" /> <bean class="com.xxx.interceptors.MyInterceptor" /> </mvc:interceptor> </mvc:interceptors>
成果:
申请地址: http://localhost:8080/springmvc03/test/hello.do
控制台打印后果信息:
多个拦截器配置(多个拦截器组成一个拦截器链 ,栈式构造 123 321 退出):
<mvc:interceptors> <mvc:interceptor> <!-- 拦挡所有申请 --> <mvc:mapping path="/**" /> <bean class="com.xxx.interceptors.MyInterceptor" /> </mvc:interceptor> <mvc:interceptor> <!-- 拦挡所有申请 --> <mvc:mapping path="/**" /> <bean class="com.xxx.interceptors.MyInterceptor2" /> </mvc:interceptor> </mvc:interceptors>
继承适配器
继承 HandlerInterceptorAdapter 形式定义拦截器(实际上最终还是 HandlerInterceptor 接口实现)
public class MyInterceptor2 extends HandlerInterceptorAdapter{ /** * 重写 preHandle 申请执行前执行 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("申请前执行。。。"); return true; } }
扩大
应用拦截器实现用户是否登录申请验证拦截器定义:
public class LoginInterceptor implements HandlerInterceptor{ /** * 办法拦挡前执行 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { User user= (User) request.getSession().getAttribute("user"); /** * 判断 uri 是否蕴含门路 * 蕴含就放行 */ if(request.getRequestURI().indexOf("userLogin.do")>-1){ return true; } /** * 判断 session user 是否为空 */ if(null==user){ response.sendRedirect(request.getContextPath()+"/login.jsp"); return false; } return true; //继续执行 action } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("Action 执行之后,生成视图之前执行!!"); } /** * 在办法执行后进行拦挡 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("办法执行后进行拦挡。。开释资源。。。"); } }
UserController 类
/** * * @author Administrator * 模仿 用户操作 */ @Controller @RequestMapping("/user") public class UserLoginController { @RequestMapping("/userLogin") public ModelAndView userLogin(HttpServletRequest request){ ModelAndView mv=new ModelAndView(); User user=new User(); user.setUserName("xxx"); user.setUserPwd("123456"); request.getSession().setAttribute("user", user); mv.setViewName("success"); return mv; } @RequestMapping("/addUser") public ModelAndView addUser(){ System.out.println("增加用户记录。。。"); ModelAndView mv=new ModelAndView(); mv.setViewName("success"); return mv; } @RequestMapping("/delUser") public ModelAndView delUser(){ ModelAndView mv=new ModelAndView(); mv.setViewName("success"); return mv; } @RequestMapping("/updateUser") public ModelAndView updateUser(){ ModelAndView mv=new ModelAndView(); mv.setViewName("success"); return mv; }}
拦截器 xml 配置
<!-- 拦挡所有申请 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="com.xxx.interceptors.LoginInterceptor" /> </mvc:interceptor> </mvc:interceptors>