• spring mvc的拦截器


    package com.tech.jin.interceptor.method;
    
    import java.util.Arrays;
    import java.util.Map;
    import java.util.Map.Entry;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.log4j.Logger;
    import org.springframework.web.method.HandlerMethod;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    public class MethodHandlerInterceptor implements HandlerInterceptor{
    
        private Logger logger = Logger.getLogger(this.getClass());
        /**
         * 该方法将在请求处理之前进行调用
         * 当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;
         * 当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方法
         * 依据它的声明顺序依次执行
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                Object handler) throws Exception {
            
            if(handler instanceof HandlerMethod){
                StringBuilder sb = new StringBuilder(1000);
    
                HandlerMethod h = (HandlerMethod) handler;
                sb.append("Controller: ").append(h.getBean().getClass().getName()).append("
    ");
                sb.append("Method    : ").append(h.getMethod().getName()).append("
    ");
                sb.append("Params    : ").append(getParamString(request.getParameterMap())).append("
    ");
                sb.append("URI       : ").append(request.getRequestURI()).append("
    ");
                
                logger.info(sb);
            }
            
            
            return true;
        }
        
        /**
         * 在当前所属的Interceptor 的preHandle 方法的返回值为true 时才能被调用
         * 在当前请求进行处理之后,也就是Controller 方法调用之后执行,但是它会在DispatcherServlet 进行视图返回渲染之前被调用
         * 所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作
         * 先声明的Interceptor 的postHandle 方法反而会后执行
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response,
                Object handler, ModelAndView mv) throws Exception {
            // TODO Auto-generated method stub
            
        }
        
        /**
         * 在当前所属的Interceptor 的preHandle 方法的返回值为true 时才能被调用
         * 该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行
         * 这个方法的主要作用是用于进行资源清理工作的
         */
        @Override
        public void afterCompletion(HttpServletRequest request,
                HttpServletResponse response, Object handler, Exception e)
                throws Exception {
            
            if(e!=null){
                logger.error(e);
            }
            
        }
    
    
        
        private String getParamString(Map<String, String[]> paraMap) {
            StringBuilder sb = new StringBuilder();
            for(Entry<String,String[]> e :paraMap.entrySet()){
                    sb.append(e.getKey()).append("=");
                    String[] value = e.getValue();
                    if(value != null && value.length == 1){
                        sb.append(value[0]).append("	");
                    }else{
                        sb.append(Arrays.toString(value)).append("	");
                    }
            }
            return sb.toString();
        }
    
    
    }

    配置文件中加上springmvc的声明:

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.0.xsd
         http://www.springframework.org/schema/mvc
         http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    然后加配置:

        <mvc:interceptors>
            <!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->
            <bean class="com.tech.jin.interceptor.AllInterceptor"/>
            <mvc:interceptor>
                <mvc:mapping path="/test/test1.do"/>
                <!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->
                <bean class="com.tech.jin.interceptor.method.MethodHandlerInterceptor"/>
            </mvc:interceptor>
        </mvc:interceptors>
  • 相关阅读:
    CentOS-Docker安装RabbitMQ集群(rabbitmq:3.7.16-management)
    Xcode Shortcuts
    In App Purchase
    CoreData
    Sandbox 文件存放规则
    在 mac os 上搭建 git server
    Git
    Git and Xcode
    心算技巧
    AppleScript
  • 原文地址:https://www.cnblogs.com/jinzhiming/p/6210927.html
Copyright © 2020-2023  润新知