Spring MVC的拦截器

概述

Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter)。主要用于拦截用户的请求并作出相应的处理。

拦截器定义

Spring MVC中有两种方法实现拦截器的功能

  1. 实现HandlerInterceptor接口或继承HandlerInterceptor接口的实现类(HandlerInterceptorAdapter)来定义。
	public class CutomInterceptor implements HandlerInterceptor{
		@Override
		public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler)throws Exception{
			//返回true,表示放行。否则,反之。
			return false;
		}
		public void postHandle(HttpServletRequest request,HttpServletResponse response,Object handler,ModelAndView modelAndView)throws Exception{
		}
		public void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex)throws Exception{
		}
	}
  • preHandler()方法:控制器方法前执行,返回false时,会中断后续的所有操作。包括下一个拦截器和控制器类中的方法
  • postHandler()方法:调用控制器方法之后执行,解析视图之前执行。
  • afterCompletion()方法:视图渲染结束之后执行。
  1. 实现WebRequestInterceptor接口或继承WebRequestInterceptor接口的实现类来定义

拦截器配置

拦截器的配置需要在Spring MVC配置文件中进行配置。

	<!--配置拦截器-->
	<mvc:interceptors>
		<!--使用Bean直接定义在此处,拦截所有请求-->
		<bean class="com.syl.interceptor.CutomInterceptor">
		<!--拦截器1-->
		<mvc:interceptor>
			<!--拦截器作用的路径-->
			<mvc:mapping path="/**"/>
			<!--哪些路径不需要拦截-->
			<mvc:exclude-mapping path=""/>
			<!--定义在此处,表示对匹配路径下的请求进行拦截-->
			<bean class="com.syl.interceptor.Interceptor1">
		</mvc:interceptor>
		<!--拦截器2-->
		<mvc:interceptor>
			<!--拦截器/hello的请求-->
			<mvc:mapping path="/hello"/>
			<!--定义在此处,表示对匹配路径下的请求进行拦截-->
			<bean class="com.syl.interceptor.Interceptor2">
		</mvc:interceptor>
		....
		....
	</mvc:interceptors>

上述配置需要按照此顺序进行配置,即:< mvc:mapping/>——< mvc:exclude-mapping />——< bean />。否则会报错。

拦截器执行流程

  1. 拦截器拦截了相应的请求后
  2. 执行拦截器的preHandler()方法,返回true则继续执行下一步,否则,直接中断。
  3. HandlerAdapter类找到对应的处理方法,执行,尚未返回视图。
  4. 拦截器的postHandler()方法
  5. 返回前端控制器,解析视图
  6. 拦截器的afterCompletion()方法

多个拦截器执行流程

类型与递归的形式

  1. 执行第一个拦截器的preHandler()方法,返回true则继续执行下一步,否则,直接中断。
  2. 执行第二个拦截器的preHandler()方法,返回true则继续执行下一步,否则,直接中断。
  3. HandlerAdapter类找到对应的处理方法,执行,尚未返回视图。
  4. 执行第二个拦截器的postHandler()方法
  5. 执行第一个拦截器的postHandler()方法
  6. 返回前端控制器,解析视图
  7. 执行第二个拦截器的afterCompletion()方法
  8. 执行第一个拦截器的afterCompletion()方法

案例——用户登录权限验证

  • request.getRequestURI():以字符串形式返回URL
  • url.indexOf(“xxx”):判断url字符串里是否有关键字,有则返回正整数。
  1. 创建chapter15项目,导入相关JAR包
    在这里插入图片描述
  2. 配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>chapter15</display-name>
  <servlet>
      <servlet-name>springmvc</servlet-name>
      <servlet-class>
          org.springframework.web.servlet.DispatcherServlet
      </servlet-class>
      <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:springmvc-config.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>springmvc</servlet-name>
      <url-pattern>/</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>
  1. 配置Spring MVC配置文件 springmvc-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">
	<!-- 扫描所需要的包 -->
	<context:component-scan base-package="com.syl.controller"/>
	<!-- 配置注解驱动 -->
	<mvc:annotation-driven />
	<!-- 定义视图解析器 -->
	<bean id="viewResolver"
	    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!-- 设置前缀 -->
			<property name="prefix" value="/WEB-INF/jsp/" />
		<!-- 设置后缀 -->
			<property name="suffix" value=".jsp" />
	</bean>
</beans>
	
  1. 创建com.syl.po包,User类。
    在这里插入图片描述
  2. com.syl.controller包创建控制器UserController
@Controller
public class UserController {
	 /*
	  * 向登陆页面跳转
	  */
	@RequestMapping(value="/login",method=RequestMethod.GET)
	public String toLogin() {
		return "login";
	}
	/*
	 * 用户登陆
	 */
	@RequestMapping(value="/login",method=RequestMethod.POST)
	public String login(User user,Model model,HttpSession session) {
		//获取用户名和密码
		String username = user.getUsername();
		String password = user.getPassword();
		//模拟从数据库获取用户名和密码后的判断
		if(username != null && username.equals("xiaoxue")
				&& password != null && password.equals("123456")) {
			//将用户添加到session对象
			session.setAttribute("USER_SESSION", user);
			//跳转到主页面
			return "redirect:main";
		}else {
			model.addAttribute("msg","用户名或密码错误,请重新登陆");
			return "login";
		}
	}
	/*
	 * 向主页面跳转
	 */
	@RequestMapping(value="/main")
	public String toMain() {
		return "main";
	}
	/*
	 * 退出登陆
	 * 
	 */
	@RequestMapping(value="/logout")
	public String logout(HttpSession session) {
		//清除Session
		session.invalidate();
		//重定向到登陆页面
		return "redirect:login";
	}
}

  1. 创建拦截器类
public class LoginInterceptor implements HandlerInterceptor {

	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
	}

	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		// TODO Auto-generated method stub

	}

	@Override
	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
		//获取请求的URL
		String url = arg0.getRequestURI();
		//开放登陆页面
		if(url.indexOf("/login") >= 0) {
			return true;
		}
		//别的页面,查看是否登陆
		HttpSession session = arg0.getSession();
		//获取登陆信息
		User user = (User)session.getAttribute("USER_SESSION");
		//查看是否有数据
		if(user != null) {
			return true;
		}
		//没登陆,转发到登陆页面
		arg0.setAttribute("msg", "你还没有登陆,请登陆");
		arg0.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(arg0, arg1);
		return false;
	}
}

  1. springmvc-config.xml配置拦截器信息
    在这里插入图片描述
  2. 登陆界面,login.jsp
    在这里插入图片描述
  3. 系统主页面,信息显示页面main.jsp
    在这里插入图片描述
  4. view
  • 登陆界面
    在这里插入图片描述
  • 主界面
    在这里插入图片描述
    @syl 2021/08/27 周五 16:43 阴 快开学了。。。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值