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>
上一篇:线程池:ThreadPoolExecutor


下一篇:AI历史和哲学基础浅谈