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>