Java学习之SpringMVC 拦截器
0x00 前言
继续 Spring MVC最后一点小内容,后面就该学习如何整合SSM框架了。
0x01 拦截器
拦截器和前面提到的一个过滤器类似,但是他们还是有些区别的。
拦截器和过滤器区别:
1.过滤器在任何框架都可以使用,而拦截器是Spring MVC独有的。
2.过滤器配置/ * 拦截所有资源,所有静态资源都会被拦截,而拦截器只会拦截控制器的方法。
拦截器可以用在权限验证,比如在访问后台资源的时候,经过拦截器看请求有没有进行身份验证,身份验证通过后放行,否则跳转会后台登陆页面。
0x02 自定义拦截器
如果我们需要定义拦截器必须实现HandlerInterceptor接口。
HandlerInterceptor接口中三个方法的作用:
1. preHandle方法是controller方法执行前拦截的方法
1.1 可以使用request或者response跳转到指定的页面
1.2 return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。
1.3. return false不放行,不会执行controller中的方法。
2. postHandle是controller方法执行后执行的方法,在JSP视图执行前。
2.1 可以使用request或者response跳转到指定的页面
2.2 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
3.afterCompletion方法是在JSP执行后执行
3.1 request或者response不能再@R_576_404@面了
实现preHandle方法
首先还是的写一个控制器
HelloContraoller代码:
@Controller
@RequestMapping(path = "/user")
public class HelloContraoller {
@RequestMapping(path = "/lanjieqi")
public String submit(){
return "success";
}
}
然后就可以自定义我们的拦截器了,让我们继承的类继承HandlerInterceptor接口,重写preHandle方法,该方法会在控制器执行前执行的方法。
MyInterceptor代码:
public class MyInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception {
System.out.println("拦截器执行");
request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
return false;
}
}
最后只需要把自定义的拦截器在springmvc.xml的配置文件里面配置好就行了。
springmvc.xml:
<mvc:interceptors>
<mvc:interceptor>
<!-- 配置拦截器拦截路径-->
<mvc:mapping path="/user/*"/>
<!-- 注入自定义拦截器-->
<bean class="com.test.domain.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
postHandle方法实现
public class MyInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request,response);
return true;
}
public void postHandle(HttpServletRequest request,Object handler,ModelAndView modelAndView) throws Exception {
System.out.println("控制器执行后执行");
}
}
postHandle 该方法会在Controller控制器执行后进行执行。
afterCompletion 方法实现
public class MyInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request,ModelAndView modelAndView) throws Exception {
System.out.println("控制器执行后执行");
}
public void afterCompletion(HttpServletRequest request,Exception ex) throws Exception {
System.out.println("jsp页面执行后执行");
}
}
该方法会在jsp执行后进行执行。
配置多个拦截器
<mvc:interceptors>
<mvc:interceptor>
<!-- 配置拦截器拦截路径-->
<mvc:mapping path="/user/*"/>
<!-- 注入自定义拦截器-->
<bean class="com.test.domain.MyInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<!-- 配置拦截器拦截路径-->
<mvc:mapping path="/user/*"/>
<!-- 注入自定义拦截器-->
<bean class="com.test.domain.MyInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>