0
点赞
收藏
分享

微信扫一扫

SpringMvc系列笔记九——SpringMVC 拦截器

IT影子 2022-02-28 阅读 65

SpringMVC 拦截器

Spring MVC 的拦截器(Interceptor)与 Servlet 的过滤器(Filter)类似,它主要用于拦 截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上

拦截器和过滤器的区别

  • 拦截器 SpringMVC 组件,而过滤器是 Servlet 组件
  • 拦截器不依赖容器,过滤器依赖容器
  • 拦截器只能对控制器请求起作用,而过滤器则可以对所有的请求起作用
  • 拦截器可以获取 IOC 容器中的各个 bean,而过滤器就不太方便

定义拦截器

在 Spring MVC 中定义一个拦截器需要对拦截器进行创建和配置。创建拦截器时需要实现HandlerInterceptor 接口

拦截器方法介绍

在 HandlerInterceptor 接口中包含了三个抽象方法,分别表示拦截的时间点

  • preHandle 方法:
    该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回true表示继续向下执行,返回 false 表示中断后续操作
  • postHandle 方法:
    该方法在控制器的处理请求方法执行之后、视图解析之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改
  • afterCompletion 方法
    该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作

创建拦截器

public class MyInterceptor implements HandlerInterceptor { 
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
		System.out.println("ProHandle: 在处理请求的目标方法执行之前"); 
		return 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: 为客户端产生响应之前。"); 
	} 
}

配置拦截器

需要在SpringMVC 的配置文件中,通过<mvc:interceptors>标签配置拦截器

<!-- 配置拦截器--> 
<mvc:interceptors> 
	<mvc:interceptor> 
		<!-- mapping:配置拦截器的作用路径--> 
		<mvc:mapping path="/**"/> 
		<!--配置不需要拦截的作用路径--> 
		<mvc:exclude-mapping path="/user/getUsers"/> 
		<bean class="com.lanh.interceptor.MyInterceptor"/>
	</mvc:interceptor> 
</mvc:interceptors>

定义全局拦截器

全局拦截器是指可以拦截所有被控制器所处理 URL。作用等同于/**

创建全局拦截器

public class GlobalInterceptor implements HandlerInterceptor { 
	@Override 
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
		System.out.println("Global PreHandle"); 
		return true; 
	}

	@Override 
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 
		System.out.println("Global PostHandle"); 
	}
	
	@Override 
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 
		System.out.println("Global AfterCompletion"); 
	} 
}

配置全局拦截器

<!-- 配置拦截器--> 
<mvc:interceptors> 
	<!--配置全局拦截器--> 
	<bean class="com.lanh.interceptor.GlobalInterceptor"/>
	<mvc:interceptor> 
		<!-- mapping:配置拦截器的作用路径--> 
		<mvc:mapping path="/**"/> 
		<!--配置不需要拦截的作用路径--> 
		<!--<mvc:exclude-mapping path="/user/getUsers"/>--> 
		<bean class="com.lanh.interceptor.MyInterceptor"/> 
	</mvc:interceptor> 
</mvc:interceptors>

多拦截器执行顺序

如果一个 URL 能够被多个拦截器所拦截,全局拦截器最先执行,其他拦截器根据配置 文件中配置的上下顺序来决定执行顺序的。先配置谁, 谁就先执行

<!-- 配置拦截器--> 
<mvc:interceptors> 
	<!--配置全局拦截器--> 
	<bean class="com.lanh.interceptor.GlobalInterceptor"/> 
	
	<mvc:interceptor> 
		<!-- mapping:配置拦截器的作用路径--> 
		<mvc:mapping path="/**"/> 
		<!--配置不需要拦截的作用路径--> 
		<!--<mvc:exclude-mapping path="/user/getUsers"/>--> 
		<bean class="com.lanh.interceptor.MyInterceptor"/> 
	</mvc:interceptor> 
	
	<mvc:interceptor> 
		<mvc:mapping path="/**"/> 
		<bean class="com.lanh.interceptor.MyInterceptor2"/> 
	</mvc:interceptor> 
</mvc:interceptors>
举报

相关推荐

0 条评论