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

  • 相关阅读:
    关于栈部分知识点
    面向对象--四则运算
    转型第一步
    输入输出文件版本——计算题
    作业二
    2017《面向对象程序设计》课程作业一
    第四次作业
    light oj 1079
    Light oj 1080
    Codeforces 486B OR in Matrix【水题】
  • 原文地址:https://www.cnblogs.com/xingele0917/p/4318008.html
Copyright © 2020-2023  润新知