Spring拦截器配置详解(如何定义一个拦截器)

本文详述了在SSM项目中如何自定义拦截器,包括实现HandlerInterceptor接口,重写preHandle、postHandle和afterCompletion方法的具体步骤,以及在springmvc.xml中配置拦截器的方法。

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

一、前言

Spring和SpringBoot的拦截器也是对请求进行的系列验证或处理,关于拦截器和过滤器的区别此文不做介绍,之前我看到过一篇相关系列的文章,讲述的还比较详细,给大家参考参考:拦截器与过滤器的区别,下面说一下SSM项目中自定义拦截器的实现。

二、自定义拦截器

自定义拦截器类,写一个类实现 HandlerInterceptor 接口,然后重写 里面的 preHandle()、postHandle()、afterCompletion()方法

// return  true表示放行,  return false表示拦截,不向下执行
public class Interceptor1 implements HandlerInterceptor{

	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
	
		log.info("preHandle:请求前调用");
           //返回 false 则请求中断
		//判断用户是否登陆  如果没有登陆  重定向到登陆页面   不放行   如果登陆了  就放行了
		String requestURI = request.getRequestURI();
		if(!requestURI.contains("/login")){
			String username = (String) request.getSession().getAttribute("USER_SESSION");
			if(null == username){
				response.sendRedirect(request.getContextPath() + "/login.action");
				return false;
			}
		}
		return true;
	}

          /** 
          * 在业务处理器处理请求执行完成后,生成视图之前执行的动作    
          * 可在modelAndView中加入数据,比如当前时间 
          */  
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView modelAndView)
			throws Exception {
		  if(modelAndView != null){  //加入当前时间    
            modelAndView.addObject("var", "测试postHandle");    
          }  
		log.info("postHandle:请求后调用");	
	}
      
       /**  
       * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等   
       *   
       * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()  
       */    
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		 log.info("afterCompletion:请求调用完成后回调方法,即在视图渲染完成后回调");
	}

}

 preHandle
预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如具体的Controller实现); 
返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;

postHandle
后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。

afterCompletion
整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。

preHandle

  • 调用时间:Controller方法处理之前
  • 执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行
  • 若返回false,则中断执行,注意:不会进入afterCompletion

 

postHandle

  • 调用前提:preHandle返回true
  • 调用时间:Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这个方法中你可以对ModelAndView进行操作
  • 执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序倒着执行
  • 备注:postHandle虽然post打头,但post、get方法都能处理

afterCompletion

  • 调用前提:preHandle返回true
  • 调用时间:DispatcherServlet进行视图的渲染之后
  • 多用于清理资源

 

 

三、springmvc.xml装在拦截器配置

  在springmvc的xml配置文件中, 来构建拦截器, 拦截上面的controller

     <!-- Springmvc的拦截器 -->
	<mvc:interceptors>
		<!-- 多个拦截器 -->
		<mvc:interceptor>  
                 <!-- 具体匹配原则可以百度 -->
                 <!-- 对controller的请求url路径进行拦截,匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->   
				   /**的意思是所有文件夹及里面的子文件夹 
				   /*是所有文件夹,不含子文件夹
				   /是web项目的根目录 -->
		      <mvc:mapping path="/**"/>
		      <!-- 自定义的拦截器类 -->
		      <bean class="com.iss.springmvc.interceptor.Interceptor1"/>
		</mvc:interceptor>
	</mvc:interceptors>

四、更多好文

SpringMVC拦截器的使用详解:https://blog.youkuaiyun.com/xiaokang123456kao/article/details/72831049
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thinkingcao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值