zoukankan      html  css  js  c++  java
  • Spring MVC 中 HandlerInterceptorAdapter的使用

    概述

    第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 />的详解

  • 相关阅读:
    开源软件的国内镜像
    ruby学习之路(一)
    VBS正则表达式
    fscanf和feof的组合使用
    计算机产生随机数
    常用:JQ
    unitegallery 测试使用-自动播放关闭
    H5重力感应(转)
    JS中,如何判断一个数是不是小数?如果是小数,如何判断它是几位小数 保留n位小数
    input禁止显示历史输入记录
  • 原文地址:https://www.cnblogs.com/xingele0917/p/4318008.html
Copyright © 2011-2022 走看看