sprngMVC的拦截器实现

一、拦截器

Spring web MVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器 进行预处理和后处理。Filter可以拦截任何请求,但是拦截器只能拦截控制器。它与AOP的差别是aop主要在特定方法前后进行处理,而拦截器主要针对的是控制器方法。
常用于

  1. 日志记录 :记录请求信息的日志
  2. 权限检查,如登录检查
  3. 性能检测:检测方法的执行时间

二、实现自定义拦截器

新建类实现HandlerInterceptor

接口HandlerInterceptor有三个方法:

  1. preHandle 在控制器执行之前执行,最后只有返回true才能进入控制器方法。
  2. postHandle 在控制器执行完后才执行,但该方法执行条件为preHandle方法返回true的时候
  3. afterCompletion 整个请求中最后才执行的方法,也就是在DispatcherServlet 渲染了对应的视图之后执行。执行的前提条件为preHandle方法返回true
package hu.ordersystem.interceptors;

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

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

public class AdminLoginInterceptors implements HandlerInterceptor {
	
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
			//在请求进入控制器之前执行
		String uri=request.getRequestURI();
	
		System.out.println(uri);
		if(uri.equals("/ordersystem/login")) {
			return true;
		}
		
		if(uri.equals("/ordersystem/checkAdmin")) {
			return true;
		}else {
			Object admin = request.getSession().getAttribute("admin");
			if(admin!=null) {
				return true;
			}else {
				response.sendRedirect("/ordersystem/index.jsp");
				return false;
			}
		}	
	}
	
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable ModelAndView modelAndView) throws Exception {
			//在控制器执行完后执行
	}
	
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable Exception ex) throws Exception {
			//在整个请求结束之后执行
	}
}

配置拦截器

在xml配置文件配置拦截器,在这仅用一个拦截器做示范

	<mvc:interceptors>
		<!--全局拦截-->
		<bean class="hu.ordersystem.interceptors.AdminLoginInterceptors"></bean>

		<!--配置特定的拦截器来拦截特定的请求-->
		<mvc:interceptor>
			<!--拦截/ordersystem/login的请求-->
			<mvc:mapping path="/ordersystem/login"/>
			<!--不拦截/admin下的请求-->
			<mvc:exclude-mapping path="/admin/**"/>
			<bean class="hu.ordersystem.interceptors.AdminLoginInterceptors"></bean>
		</mvc:interceptor>
		<mvc:interceptor>
			<mvc:mapping path="/ordersystem/checkAdmin"/>
			<bean class="hu.ordersystem.interceptors.AdminLoginInterceptors"></bean>
		</mvc:interceptor>
		
	</mvc:interceptors>

拦截器栈

当有多个拦截器生效时就生成了拦截器栈,此时拦截器执行的顺序为先进后出,它的执行顺序与xml配置文件中拦截器的配置顺序有关。

例如:

在xml里的 拦截器配置顺序为:先拦截器A,再拦截器B

程序中拦截器执行顺序:
preHandle(A)——>preHandle (B)——>控制器——>
postHandle (B)——>postHandle (A)——>JSP页面——>
afterCompletion (B)——>afterCompletion (A)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值