概述
Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter)。主要用于拦截用户的请求并作出相应的处理。
拦截器定义
Spring MVC中有两种方法实现拦截器的功能
- 实现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()方法:视图渲染结束之后执行。
- 实现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 />。否则会报错。
拦截器执行流程
- 拦截器拦截了相应的请求后
- 执行拦截器的preHandler()方法,返回true则继续执行下一步,否则,直接中断。
- HandlerAdapter类找到对应的处理方法,执行,尚未返回视图。
- 拦截器的postHandler()方法
- 返回前端控制器,解析视图
- 拦截器的afterCompletion()方法
多个拦截器执行流程
类型与递归的形式
- 执行第一个拦截器的preHandler()方法,返回true则继续执行下一步,否则,直接中断。
- 执行第二个拦截器的preHandler()方法,返回true则继续执行下一步,否则,直接中断。
- HandlerAdapter类找到对应的处理方法,执行,尚未返回视图。
- 执行第二个拦截器的postHandler()方法
- 执行第一个拦截器的postHandler()方法
- 返回前端控制器,解析视图
- 执行第二个拦截器的afterCompletion()方法
- 执行第一个拦截器的afterCompletion()方法
案例——用户登录权限验证
- request.getRequestURI():以字符串形式返回URL
- url.indexOf(“xxx”):判断url字符串里是否有关键字,有则返回正整数。
- 创建chapter15项目,导入相关JAR包
- 配置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>
- 配置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>
- 创建com.syl.po包,User类。
- 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";
}
}
- 创建拦截器类
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;
}
}
- springmvc-config.xml配置拦截器信息
- 登陆界面,login.jsp
- 系统主页面,信息显示页面main.jsp
- view
- 登陆界面
- 主界面
@syl 2021/08/27 周五 16:43 阴 快开学了。。。