首页 > 学院 > 开发设计 > 正文

spring MVC拦截器

2019-11-14 20:51:34
字体:
来源:转载
供稿:网友
sPRing MVC拦截器

Spring为我们提供了:

org.springframework.web.servlet.HandlerInterceptor接口,

org.springframework.web.servlet.handler.HandlerInterceptorAdapter适配器,

实现这个接口或继承此类,可以非常方便的实现自己的拦截器。

例如:

public class HelloWorldInterceptor implements HandlerInterceptor  {  @Override  public boolean preHandle(HttpServletRequest request,          HttpServletResponse response, Object handler) throws Exception {            System.out.println("Pre-handle");            return false;  }    @Override  public void postHandle(HttpServletRequest request,          HttpServletResponse response, Object handler,          ModelAndView modelAndView) throws Exception {      System.out.println("Post-handle");  }    @Override  public void afterCompletion(HttpServletRequest request,          HttpServletResponse response, Object handler, Exception ex)          throws Exception {      System.out.println("After completion handle");  }  

有以下三个方法:

Action之前执行:

public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler);生成视图之前执行

public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView);最后执行,可用于释放资源

public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面)

在preHandle中,可以进行编码、安全控制等处理;

在postHandle中,有机会修改ModelAndView;

在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。

参数中的Object handler是下一个拦截器。

在spring MVC的配置文件中配置有三种方法:

方案一,(近似)总拦截器,拦截所有url

  如果是REST风格的URL,静态资源也会被拦截。

<mvc:interceptors>      <bean class="com.app.mvc.MyInteceptor" />  </mvc:interceptors>  

方案二, 拦截匹配的URL。

  如果是REST风格的URL,静态资源也会被拦截。

<mvc:interceptors >      <mvc:interceptor>            <mvc:mapping path="/user/*" /> <!-- /user/*  -->            <bean class="com.mvc.MyInteceptor"></bean>        </mvc:interceptor>    </mvc:interceptors>    

方案三,HandlerMappint上的拦截器。

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">        <property name="interceptors">            <list>                <bean class="com.mvc.MyInteceptor"></bean>           </list>        </property>       </bean>  

如果使用了<mvc:annotation-driven />,它会自动注册DefaultAnnotationHandlerMapping 与AnnotationMethodHandlerAdapter 这两个bean,所以就没有机会再给它注入interceptors属性,就无法指定拦截器。

我们可以通过人工配置上面的两个Bean,不使用<mvc:annotation-driven />,就可以给interceptors属性注入拦截器了。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表