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("\n");
            sb.append("Method    : ").append(h.getMethod().getName()).append("\n");
            sb.append("Params    : ").append(getParamString(request.getParameterMap())).append("\n");
            sb.append("URI       : ").append(request.getRequestURI()).append("\n");
            
            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("\t");
                }else{
                    sb.append(Arrays.toString(value)).append("\t");
                }
        }
        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>

 

posted @ 2016-12-22 13:50  新手娃娃菜  阅读(240)  评论(0)    收藏  举报