Spring MVC拦截器

 

Spring MVC实现拦截器的方法有两种:即实现HandlerInterceptor接口和继承此接口的实现类HandlerInterceptorAdapter

一、通过实现HandlerInterceptor接口的方式设置拦截器

1.1 定义拦截器TimeInterceptor 并继承HandlerInterceptor接口

package com.jt.common.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class TimeInterceptor implements HandlerInterceptor {
	/**
	 * 该方法会在控制器方法前执行,其返回值表示是否中断后续操作。当其返回值为true时,表示继续向下执行;
	 * 当其返回值为false时,会中断后续的所有操作 (包括调用下一个拦截器和控制器类中的方法执行等)
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		return false;
	}

	/** 该方法会在控制器方法调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改。 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {

	}

	/** 该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {

	}
}

1.2 为拦截器添加功能代码

package com.jt.common.interceptor;

import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.jt.common.annotation.HandlerMonitor;

@Component
public class TimeInterceptor implements HandlerInterceptor {

	public TimeInterceptor() {
		System.out.println("TimeInterceptor.TimeInterceptor()");
	}

	/**
	 * 该方法会在控制器方法前执行,其返回值表示是否中断后续操作。当其返回值为true时,表示继续向下执行;
	 * 当其返回值为false时,会中断后续的所有操作 (包括调用下一个拦截器和控制器类中的方法执行等)
	 */

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		HandlerMethod hMethod = (HandlerMethod) handler;
		Method method = hMethod.getMethod();
		if (method.isAnnotationPresent(HandlerMonitor.class)) {
			String methodName = method.getName();
			/* 不要讲此变量以属性的方式写到外面,线程不安全 */
			long startTime = System.nanoTime();
			System.out.println(methodName + " start time is " + startTime);
			request.setAttribute("startTime", startTime);
		}
		System.out.println("preHandle");
		return true;// true 放行
	}

	/** 该方法会在控制器方法调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改。 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("postHandle()");
	}

	/** 该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("afterCompletion");
		Method method = ((HandlerMethod) handler).getMethod();
		String methodName = method.getName();
		if (method.isAnnotationPresent(HandlerMonitor.class)) {
			long endTime = System.nanoTime();
			System.out.println(methodName + " end time is " + endTime);
			long startTime = (Long) request.getAttribute("startTime");
			System.out.println("totalTime=" + (endTime - startTime));
		}
	}

}

1.3 在Spring配置文件中进行拦截目标配置

<!-- 配置拦截器 -->
<mvc:interceptors>
	<!-- 系统运维监控(只能在某个限定时间之内限定) -->
	<mvc:interceptor>
		<mvc:mapping path="/**"/>
		<ref bean="systemIntercoptor"/>
	</mvc:interceptor>
	
	<!-- 控制层方法执行时长监控 -->
	<mvc:interceptor>	<!-- 配置如下元素时要注意顺序 -->
		<!-- 配置拦截那些路径 -->
		<mvc:mapping path="/**"/>
		<!-- 配置那些路径不进行拦截 -->
		<mvc:exclude-mapping path="/doLogin.do"/>
		<!-- 拦截到请求以后由哪个拦截器进行处理 -->
		<ref bean="timeInterceptor"/>
	</mvc:interceptor>
</mvc:interceptors>

二、通过继承实现类HandlerInterceptorAdapter设置拦截器

2.1 定义拦截器SystemIntercoptor并继承实现类HandlerInterceptorAdapter

package com.jt.common.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class SystemIntercoptor extends HandlerInterceptorAdapter {

	/** 在业务处理器处理请求之前被调用,预处理,可以进行编码、安全控制等处理 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		return super.preHandle(request, response, handler);
	}

	/** 在业务处理器处理请求执行完成后,生成视图之前执行 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		super.postHandle(request, response, handler, modelAndView);
	}

	/** 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面),可以根据ex是否为null判断是否发生了异常,进行日志记录 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		super.afterCompletion(request, response, handler, ex);
	}
}

2.2 继承父类相应的方法,进行功能实现

package com.jt.common.interceptor;
import java.util.Calendar;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

@Component
public class SystemIntercoptor extends HandlerInterceptorAdapter {

	/**
	 * 此方法中基于请求时间,决定请求是被拦截还是放行
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		//获取当前时间以后和9点和17点进行比较
		
		/*获取日历对象*/
		Calendar c = Calendar.getInstance();
		long t = c.getTimeInMillis();
		c.set(Calendar.HOUR_OF_DAY, 6);
		c.set(Calendar.HOUR, 0);
		c.set(Calendar.MINUTE, 0);
		c.set(Calendar.SECOND, 0);
		c.set(Calendar.MILLISECOND, 0);
		long time9 = c.getTimeInMillis();
		
		c.set(Calendar.HOUR_OF_DAY, 22);
		long time17 = c.getTimeInMillis();
		
		if(t<time9||t>time17){
			System.out.println("系统维护时间...");
			return false;
		}
		return true;//放行
	}
}

2.3 在Spring配置文件中进行拦截目标配置

<!-- 配置拦截器 -->
<mvc:interceptors>
	<!-- 系统运维监控(只能在某个限定时间之内限定) -->
	<mvc:interceptor>
		<mvc:mapping path="/**"/>
		<ref bean="systemIntercoptor"/>
	</mvc:interceptor>
	
	<!-- 控制层方法执行时长监控 -->
	<mvc:interceptor>	<!-- 配置如下元素时要注意顺序 -->
		<!-- 配置拦截那些路径 -->
		<mvc:mapping path="/**"/>
		<!-- 配置那些路径不进行拦截 -->
		<mvc:exclude-mapping path="/doLogin.do"/>
		<!-- 拦截到请求以后由哪个拦截器进行处理 -->
		<ref bean="timeInterceptor"/>
	</mvc:interceptor>
</mvc:interceptors>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值