SpringMVC框架|Interceptor拦截器


一、过滤器和拦截器的区别

拦截器在实现上是基于Java的反射机制,属于面向切面编程的一种运用。 可以使用Spring的依赖注入进行业务操作。一个拦截器实例在一个controller生命周期之内可以多次调用。但是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求无法拦截处理。

(1)使用范围不同

  • JavaWeb中学过的过滤器(Filter)是Java EE体系中的组件。
  • 拦截器(Interceptor)是SpringMVC框架中的组件。

(2)执行时机不同

  • 过滤器是运行在所有Servlet之前
  • 拦截器是运行在DispatcherServlet之后

通常在使用Spring MVC框架后,推荐使用拦截器来实现登录的处理。

二、演示使用拦截器

1.单个拦截器的执行顺序

(1)定义一个拦截器

package com.gql.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
 * 类说明:
 *		拦截器1
 * @guoqianliang1998.
 */
public class MyInterceptor1 implements HandlerInterceptor {

	//在handler之前执行
	@Override
	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
		System.out.println("处理器执行前...");
		return true;//放行
	}


	//在handler返回MovelAndView后执行
	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		System.out.println("处理器执行中...");
	}

	//在handler返回MovelAndView后执行 最终执行
	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		System.out.println("处理器执行后...");
	}
}

(2)配置拦截器

在SpringMVC配置中进行如下配置,其中/**表示拦截多级目录

	<!-- 自定义拦截器 -->
	<mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/**"/>
			<bean class="com.gql.interceptor.MyInterceptor1"></bean>
		</mvc:interceptor>
	</mvc:interceptors>

(3)Handler处理器

package com.gql.upload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.gql.ex.MyException;
import com.gql.pojo.User;

@Controller
@RequestMapping("/user")
public class UserController {	
	@RequestMapping("/add")
	public String add(User user) throws MyException{
		System.out.println("添加用户成功");
		return "success";
	}
}

上面的测试执行后,运行顺序如下,
在这里插入图片描述
单个拦截器的执行顺序如下图:
在这里插入图片描述

2.多个拦截器的执行顺序

总结:

  • 拦截器的perHandle()方法顺序执行
  • 拦截器的postHandle()方法afterCompletion方法逆序执行
  • 这里说的顺序和倒序是指SpringMVC配置文件中的拦截器的配置顺序。

在这里插入图片描述

发布了427 篇原创文章 · 获赞 1123 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/weixin_43691058/article/details/104432882