Springmvc中的拦截器
目录
Springmvc中的拦截器... 1
一、 什么是SpringMVC拦截器... 1
二、 Springmvc中的拦截器... 1
三、 SpringMVC拦截器应用场景... 6
拦截器是一个运行在服务端的程序,主要用于拦截用户的请求并进行相应的处理,即实现对控制器Controller请求的预处理或后处理。通过拦截器可以使得程序在某个动作(action)执行前或执行后,能够先执行或后执行特定的代码逻辑,也可以实现在某个动作(action)执行前阻止某些代码逻辑的执行。
在Spring MVC框架中,拦截器(Interceptor)是一种用于拦截请求和响应处理器。它可以在请求处理前或处理后执行一些自定义逻辑,比如身份验证、日志记录、权限校验等。在Spring MVC中,可以使用注解来定义和配置拦截器。
- 作用
类似于javaweb中的Filter,用来对请求进行拦截,可以将多个Controller中执行的共同代码的放入拦截器中执行,减少Controller类中代码的冗余。
- 特点
- 拦截器只能拦截Controller的请求,不能拦截jsp
- 拦截器可中断用户的请求轨迹
- 请求先经过拦截器,之后还会经过拦截器
- SpringMVC拦截器和Servlet开发中的过滤器的区别
为什么要说它们两个的区别呢,因为它们两个的功能是一样的,非常的相似,面试的时候也经常会问道。
- 案例实现步骤
实现步骤:
1. 新建web项目,导入springmvc jar包依赖并配置
2. 创建Interceptor拦截器类
3. 配置SpringMVC核心配置文件,注册拦截器
4. 创建Controller类
5. 创建index.jsp页面
6. 打开浏览器,进行测试
案例步骤详解:
- 新建web项目,导入springmvcjar包依赖并配置
我们用依赖坐标,在pom.xml中导入相关依赖。
- 创建Interceptor拦截器类:拦截器1
/**
* 以实现接口的方式定义拦截器
*/
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("指定拦截器:MyInterceptor1...preHandle");
return true; // 返回true表示继续处理请求,返回false表示中断请求处理
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
System.out.println("指定拦截器:MyInterceptor1...postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
System.out.println("指定拦截器:MyInterceptor1...afterCompletion");
}
}
- 创建Interceptor拦截器类:拦截器2
/**
* 实现了HandlerInterceptor接口的自定义拦截器类
*/
public class UserInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("全局拦截器:UserInterceptor...preHandle");
//对拦截的请求进行放行处理
return true;// 返回true表示继续处理请求,返回false表示中断请求处理
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
System.out.println("全局拦截器:UserInterceptor...postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
System.out.println("全局拦截器:UserInterceptor...afterCompletion");
}
}
- 配置SpringMVC核心配置文件,注册拦截器,让其生效!
<?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" xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 定义组件扫描器,指定需要扫描的包 -->
<context:component-scan base-package="com.zkj.controller" />
<!--配置拦截器(只能拦截请求,不能拦截具体页面)-->
<mvc:interceptors>
<!--使用bean直接定义全局拦截器,将拦截所有请求-->
<bean class="com.zkj.Interceptor.UserInterceptor"/>
<!-- 拦截器1 -->
<mvc:interceptor>
<!--配置拦截器作用的路径。拦截什么样的路径:
/*:表示拦截所有的一级路径
/**:拦截任意多级路径 /user/get/list/query
-->
<!-- 定义在<mvc:interceptor>下面的表示匹配指定路径的请求才进行拦截的 -->
<mvc:mapping path="/**" />
<!-- 配置不需要拦截器作用的路径 -->
<mvc:exclude-mapping path="/hello1" />
<bean class="com.zkj.Interceptor.MyInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
</beans>
如图所示:
- 创建Interceptor拦截器类
- 创建index.jsp页面
局部拦截器注册:自己指定拦截的路径
<body>
<a href="${pageContext.request.contextPath}/hello">
拦截请求测试(被UserInterceptor和MyInterceptor拦截)
</a>
<a href="${pageContext.request.contextPath}/hello1">
请求放行(被全局拦截器UserInterceptor拦截,指定拦截MyInterceptor放行)
</a>
</body>
- 测试
案例: SpringMVC拦截器模拟用户登录校验(ch7-2) |
(ch7-2)
实现步骤:
1. 新建web项目,导入springmvcjar包依赖并配置web.xml
2. 创建User类
3. 创建index.jsp页面,homejsp和login.jsp页面
4. 创建UserController类
5. 创建Interceptor拦截器类
6. 配置SpringMVC核心配置文件,注册拦截器
7. 打开浏览器,进行测试
案例步骤详解:
- 新建web项目,导入springmvcjar包依赖并配置
我们用依赖坐标,在pom.xml中导入相关依赖。
- 创建User类
public class User {
private Integer id;//id
private String username;//用户名
private String password;//密码
}
- 创建index.jsp页面,home.jsp和login.jsp页面
index.jsp页面:
注意:login.jsp和home.jsp放在/WEB-INF/jsp/下面
login.jsp页面:
${msg}
<form action="${pageContext.request.contextPath}/login" method="post">
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
<input type="submit" value="登录"/>
</form>
home.jsp页面:
- 创建UserController类,com.zkj.controller包下创建类。
- 创建Interceptor拦截器类,在com.zkj.Interceptor包下创建类。
- 配置SpringMVC核心配置文件,注册拦截器
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 定义组件扫描器,指定需要扫描的包 -->
<context:component-scan base-package="com.zkj.controller" />
<!-- 定义视图解析器 -->
<bean id="viewResolver" class=
"org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!--配置拦截器(只能拦截请求,不能拦截具体页面)-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<!-- 配置不需要拦截器作用的路径 -->
<mvc:exclude-mapping path="/loginview" />
<mvc:exclude-mapping path="/login" />
<bean class="com.zkj.interceptor.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
</beans>
- 打开浏览器,进行测试