分享

Spring MVC 中 HandlerInterceptorAdapter的使用

 笙歌谢孤城 2017-06-16

概述

第1 部分 拦截器类

第2 部分 拦截器配置

第3 部分 实例

参考

第1 部分 拦截器类

一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可以实现Bean预处理、后处理。 
Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。 

Spring为我们提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类,可以非常方便的实现自己的拦截器。他有三个方法:

复制代码
 1 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)  
 2         throws Exception {  
 3         return true;  
 4     }  
 5     public void postHandle(  
 6             HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)  
 7             throws Exception {  
 8     }  
 9     public void afterCompletion(  
10             HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)  
11             throws Exception {  
12     }  
复制代码

 

分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面) 
在preHandle中,可以进行编码、安全控制等处理; 
在postHandle中,有机会修改ModelAndView; 
在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。 

 

第2 部分 拦截器配置

如果基于xml配置使用Spring MVC,
可以利用SimpleUrlHandlerMapping、BeanNameUrlHandlerMapping进行Url映射(相当于struts的path映射)和拦截请求(注入interceptors),
如果基于注解使用Spring MVC,可以使用DefaultAnnotationHandlerMapping注入interceptors。
注意无论基于xml还是基于注解,HandlerMapping bean都是需要在xml中配置的。 

 

基于注解的配置如下:

<mvc:interceptors>        
        <bean class="com.Common.action.PurviewInterceptTest" />
    </mvc:interceptors>

 

第3 部分 实例

复制代码
/**
 * 拦截器测试
 * 
 * @ClassName: PurviewInterceptTest
 * @author xingle
 * @date 2015-3-6 下午12:02:08
 */
public class PurviewInterceptTest extends HandlerInterceptorAdapter {

    private UrlPathHelper urlPathHelper = new UrlPathHelper();

    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {

        // 获取访问url
        String url = urlPathHelper.getLookupPathForRequest(request);

        String queryString = urlPathHelper.getOriginatingQueryString(request);
        String redirectURL = url;
        if (!StringHelperTools.isEmpty(queryString)) {
            redirectURL = redirectURL + "?" + queryString;
        }
        if (true) {// 测试跳转到其他页面
            response.sendRedirect(request.getContextPath() + "/Login1.html");
            return true;
        }

        return super.preHandle(request, response, handler);

    }

    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            org.springframework.web.servlet.ModelAndView modelAndView)
            throws Exception {
        // 你自己的业务逻辑

        //下面这句话不要动,就这样放着。你在处理你的业务逻辑之后,spring会将你的请求和响应继续往容器传或者往客户端进行传递
        super.postHandle(request, response, handler, modelAndView);
    }

    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // 你自己的业务逻辑

        //下面这句话不要动,就这样放着。你在处理你的业务逻辑之后,spring会将你的请求和响应继续往容器传或者往客户端进行传递
        super.afterCompletion(request, response, handler, ex);
    }

}
复制代码

 

 


参考:

1.spring mvc拦截器和<mvc:annotation-driven />的详解

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多