SpringMVC拦截器

Spring MVC中的拦截器(Interceptor )类似于Servlet 中的过滤器(Filter) ,它主要用于拦截用户请求并做相应的处理。 例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。

要使用SpringMVC中的拦截器,就需要对拦截器类进行定义和配置。 通常拦截器类可以通过两种方式来定义。 一种是通过实现Handlerlnterceptor接口,或继承Handlerlnterceptor接口的实现类来定义;另一种是通过实现WebRequestlnterceptor接口,或继承WebRequestlnterceptor接口的实现类来定义。这里我以HandleInterceptor为例:

/**
 * 登录拦截器
 * @author CHRISTMASY
 *
 */
public class LoginInterceptor implements HandlerInterceptor{
	//实现Handlerlnterceptor接口

	//afterCompletion:在整个请求完成,即视图渲染结束之后执行
	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object arg2, Exception arg3)
			throws Exception {
	}

	//postHandle:在控制器方法调用之后,且解析视图之前执行
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response,
			Object arg2, ModelAndView arg3) throws Exception {
	}
	
	//	preHandler:在控制器方法前执行
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
			Object arg2) throws Exception {
		return false;
	}
}

LoginInterceptor类实现了Handlerlnterceptor接口,以下是Handlerlnterceptor接口中的三个方法:

  • preHandler()方法:该方法会在控制器方法前执行,其返回值表示是否中断后续操作。 当其返回值为true时,表示继续向下执行;当其返回值为false时,会中断后续的所有操作(包括调用下一个拦截器和控制器类中的方法执行等)。

  • postHandle()方法:该方法会在控制器方法调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改。

  • afterCompletion()方法: 该方法会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。

要使我们自定义的拦截器生效,还需要在spring核心配置文件中配置

<!-- 配置拦截器 -->
	<mvc:interceptors>
		<mvc:interceptor>
			<!-- 配置拦截器作用的路径 -->
			<mvc:mapping path="/**"/>
			<!-- 定义在<mvc:interceptor>下面的表示匹配指定路径的请求才进行拦截的 -->
			<bean class="com.itheima.interceptor.LoginInterceptor"/>
		</mvc:interceptor>
	</mvc:interceptors>

接下来我们验证拦截器是否生效,在LoginInterceptor拦截器的preHandle()方法中编写判断语句来对访问者的用户进行区分

@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
			Object arg2) throws Exception {
		String url = request.getRequestURI();//获取请求路径
		if(url.indexOf("/login")>=0){
			return true;//return true 则进入下一个流程
		}
		HttpSession session = request.getSession();
		User user = (User) session.getAttribute("USER_SESSION");
		//通过session判断用户是否登录
		if(user!=null){
			return true;
		}
		request.setAttribute("msg", "您还没有登录,请先登录!");
		request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
		return false;//未登录则重定向到login页面,并return false 
	}

在浏览器中直接访问mian页面时,拦截器在preHandle()方法中识别到请求路径中不包含login,那么就对其进行判断,当session中没有用户信息时,则重定向到login页面,并且返回true,不执行后面的操作流程。

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值