SpringMVC 学习笔记(九) 自定义拦截器

本文详细介绍了Spring MVC框架中自定义拦截器的使用,包括preHandle、postHandle和afterCompletion三个方法的执行顺序及具体作用。通过示例代码展示了如何在控制器前后进行权限、日志和事务等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Spring MVC</span><span style="font-family: 宋体; background-color: rgb(255, 255, 255);">也可以使用拦截器对请求进行拦截处理,用户 可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现</span><span style="font-family: Arial, Helvetica, sans-serif; color: rgb(255, 0, 0); background-color: rgb(255, 255, 255);">HandlerInterceptor</span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">接口</span>

① preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求 request 进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false

② postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet 向客户端返回响应前被调用,在该方法中对用户请求request进行处理。

③ afterCompletion():这个方法在 DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。

1.1. 执行顺序



1.2. 示例

InterceptorController.java

package com.ibigsea.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class InterceptorController {
	
	@RequestMapping("/interceptor")
	public String interceptor(){
		System.out.println("controller interceptor");
		return "helloworld";
	}
	
}

OneInterceptor.java

package com.ibigsea.springmvc.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 OneInterceptor implements HandlerInterceptor {

	/**
	 * 该方法在执行目标方法之前被调用.
	 * 
	 * 若返回值为 true, 则继续调用后续的拦截器和目标方法. 
	 * 若返回值为 false, 则不会再调用后续的拦截器和目标方法. 
	 * 并执行 当前拦截器 前面执行过  preHandle 拦截器的 afterCompletion()方法
	 * 
	 * 可以  做权限,日志,事务等操作. 
	 */
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		System.out.println("one interceptor preHandle");
		return true;
	}
	
	/**
	 * 执行目标方法之后, 在渲染视图之前,
	 * 并且 preHandle 返回为true ,调用该方法 
	 * 
	 * 可以对请求域中的属性或视图做出修改. 
	 * 可以 添加一些公共的信息 比如当前时间 之类
	 */
	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("one interceptor postHandle");
	}

	/**
	 * 渲染视图之后 被调用该方法,可以做释放资源等操作
	 */
	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("one interceptor afterCompletion");
	}

}

TwoInterceptor.java

package com.ibigsea.springmvc.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 TwoInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		System.out.println("two interceptor preHandle");
		return true;
	}

	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("two interceptor preHandle");
	}

	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("two interceptor afterCompletion");
	}

}

Spring-mvc.xml:

<mvc:interceptors>
		<!-- 配置自定义的拦截器 -->
		<bean id="oneInterceptor" class="com.ibigsea.springmvc.interceptor.OneInterceptor"/>
		<bean id="twoInterceptor" class="com.ibigsea.springmvc.interceptor.TwoInterceptor"/>
	</mvc:interceptors>

运行结果:


one interceptor preHandle
two interceptor preHandle
controller interceptor
two interceptor preHandle
one interceptor postHandle
two interceptor afterCompletion
one interceptor afterCompletion
one interceptor preHandle
two interceptor preHandle

1.3. 源码分析








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值