下面我将为你详细讲解“SpringBoot之HandlerInterceptor拦截器的使用详解”的完整攻略。
一、HandlerInterceptor简介
HandlerInterceptor 是 SpringMVC 拦截器,主要作用是拦截请求并获取请求相关的信息,对请求进行拦截和处理,对响应进行后处理和响应处理。
既然是一个拦截器,那必然就是针对请求进行操作,那么在 springmvc 中,我们的请求是什么呢?在 springmvc 中,请求的处理情况是由 HandlerMethod 对象来维护的,也就是说我们只要能获取到 HandlerMethod 对象,就能对请求进行一系列操作。
二、HandlerInterceptor 拦截器使用方法
HandlerInterceptor 接口中包含了三个方法,分别是 preHandle、postHandle、afterCompletion,这三个方法在处理请求的不同阶段进行调用。具体说明如下:
1、preHandle
该方法在请求处理前进行调用,主要作用是进行拦截操作,返回值为 boolean 类型,当返回值为 true 时,表示拦截器放行,继续执行下一个拦截器或请求处理逻辑;当返回值为 false 时,拦截器拦截请求并进行处理,不再执行下一个拦截器或请求处理逻辑。通常这个方法可以用来做登录验证、Xss 防护等。
2、postHandle
该方法在请求处理后进行调用,主要作用是对返回数据进行处理和包装,在此方法中修改 modelAndView 是无效的,因为这个请求已经执行完毕,要修改返回数据就要使用 HttpServletResponse 对象进行修改。在该方法中可以进行一些资源的回收,例如关闭流。
3、afterCompletion
该方法在请求处理完成后进行调用,主要作用是进行资源的释放操作,以及 完成日志记录等。此时不可以修改响应内容。
如上三个方法的执行顺序就是 preHandle、postHandle、afterCompletion。在执行完请求处理逻辑后,这三个方法按照相反的顺序执行。
三、示例1:拦截未登录用户的请求
下面我们使用一个示例来说明使用 HandlerInterceptor 拦截未登录用户的请求:
首先,我们需要编写一个 LoginInterceptor 来实现拦截逻辑。它继承自 HandlerInterceptorAdapter 父类,并实现 preHandle 方法。
LoginInterceptor.java
public class LoginInterceptor extends HandlerInterceptorAdapter {
private static final String[] EXCLUDE_URLS = { "/login", "/register", "/error" };
//重写拦截器的 preHandle 方法
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
//如果请求的 URL 没有被排除,则进行拦截
String requestURI = request.getRequestURI();
for (String url:EXCLUDE_URLS) {
if (requestURI.contains(url)) {
//放行
return true;
}
}
//如果没有登录,则进行拦截操作
User loginUser = (User)request.getSession().getAttribute("loginUser");
if (loginUser != null) {
return true;
} else {
response.sendRedirect(request.getContextPath() + "/login");
return false;
}
}
}
上述代码中,我们要拦截的 URL 被存储在 EXCLUDE_URLS 数组中,如果请求的 URL 包含在排除的列表中,则直接放行。如果请求的 URL 不包含在排除的列表中,则会判断是否有登录,如果登录了则进行放行,反之则进行拦截操作跳转到登录页面。
接着,我们在 WebMvcConfigurerAdapter 子类中重写 addInterceptors 方法来进行自定义拦截器的注册。
MyWebMvcConfig.java
@Configuration
public class MyWebMvcConfig extends WebMvcConfigurerAdapter{
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor);
}
}
上述代码中,我们从容器中获取了 LoginInterceptor 并进行了注册。也就是说在服务器启动的时候就注册了一个 LoginInterceptor 拦截器,这个拦截器会进行拦截功能的开启。
四、示例2:拦截指定访问地址的请求
下面我们使用一个示例来说明使用 HandlerInterceptor 拦截指定访问地址的请求:
LoginInterceptor.java
public class AccessInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("AccessInterceptor 进入 preHandle");
//判断是否为指定访问地址
String requestURI = request.getRequestURI();
if ("/admin".equals(requestURI)) {
//拦截请求并进行处理
response.getWriter().println("拒绝访问!");
return false;
}
return true;
}
}
上述代码中,我们在 preHandle 方法中对请求进行处理,如果请求的地址为 /admin,则拒绝访问。注意,我们在这里对响应进行了相应的修改,因为这个请求还没有开始处理,所以在请求处理完毕后,无法再次修改回应内容。
接着,我们在 WebMvcConfigurerAdapter 子类中重写 addInterceptors 方法来进行自定义拦截器的注册。
MyWebMvcConfig.java
@Configuration
public class MyWebMvcConfig extends WebMvcConfigurerAdapter {
@Autowired
private AccessInterceptor accessInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//指定拦截器的过滤路径,按顺序进行拦截
registry.addInterceptor(accessInterceptor).addPathPatterns("/admin/**");
}
}
上述代码中,我们只对 /admin 开头的请求进行了拦截器过滤。在请求处理的时候,所有的拦截器会按顺序进行拦截,如果没有访问地址匹配,就不会有拦截操作。
五、总结
通过上述示例,我相信你已经很好的了解了如何使用 HandlerInterceptor 拦截器来进行请求拦截的功能开发,在实际项目的开发中,可以按照业务需求,不断调整拦截器的日志、注解、路径、配置等功能,以满足专业的系统功能需求。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot之HandlerInterceptor拦截器的使用详解 - Python技术站