Spring Boot拦截器使用精讲
拦截器是一种常用的技术,可以在请求到达控制器之前或之后执行一些操作。在Spring Boot中,可以使用拦截器来实现一些常见的功能,例如身份验证、日志记录、性能监控等。本文将深入讲解Spring Boot拦截器的使用,包括拦截器的定义、注册和使用,以及两个示例。
定义拦截器
在Spring Boot中,可以通过实现HandlerInterceptor接口来定义拦截器。HandlerInterceptor接口包含三个方法,分别是preHandle()、postHandle()和afterCompletion()。以下是一个示例:
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在请求到达控制器之前执行
return true; // 返回true表示继续执行,返回false表示中断执行
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在请求到达控制器之后,视图渲染之前执行
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 在视图渲染之后执行
}
}
在上面的示例中,我们定义了一个名为MyInterceptor的拦截器,实现了HandlerInterceptor接口,并重写了preHandle()、postHandle()和afterCompletion()方法。在preHandle()方法中,我们可以执行一些操作,例如身份验证、日志记录等。在postHandle()方法中,我们可以修改ModelAndView对象,例如添加一些额外的数据。在afterCompletion()方法中,我们可以执行一些清理操作,例如关闭数据库连接等。
注册拦截器
在Spring Boot中,可以通过实现WebMvcConfigurer接口来注册拦截器。以下是一个示例:
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/login");
}
}
在上面的示例中,我们定义了一个名为MyWebMvcConfigurer的配置类,实现了WebMvcConfigurer接口,并重写了addInterceptors()方法。在addInterceptors()方法中,我们通过registry对象注册了一个MyInterceptor拦截器,并指定了拦截所有请求("/**"),但排除了/login请求。
示例一:身份验证拦截器
以下是一个示例,演示如何使用拦截器实现身份验证:
- 创建一个名为AuthInterceptor的拦截器:
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
if (session.getAttribute("user") == null) {
response.sendRedirect("/login");
return false;
}
return true;
}
}
在上面的示例中,我们创建了一个名为AuthInterceptor的拦截器,实现了HandlerInterceptor接口,并重写了preHandle()方法。在preHandle()方法中,我们获取HttpSession对象,检查是否存在名为"user"的属性。如果不存在,则重定向到/login页面,并返回false,中断执行。如果存在,则返回true,继续执行。
- 在MyWebMvcConfigurer类中注册AuthInterceptor拦截器:
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/login");
}
}
在上面的示例中,我们在addInterceptors()方法中注册了AuthInterceptor拦截器,并指定了拦截所有请求("/**"),但排除了/login请求。
- 创建一个/login请求处理方法:
@Controller
public class LoginController {
@GetMapping("/login")
public String login() {
return "login";
}
@PostMapping("/login")
public String doLogin(@RequestParam String username, @RequestParam String password, HttpSession session) {
if ("admin".equals(username) && "admin".equals(password)) {
session.setAttribute("user", username);
return "redirect:/";
} else {
return "login";
}
}
}
在上面的示例中,我们创建了一个名为LoginController的控制器,使用@GetMapping注解定义了一个GET请求处理方法,使用@PostMapping注解定义了一个POST请求处理方法。在doLogin()方法中,我们检查用户名和密码是否正确。如果正确,则将用户名保存到HttpSession对象中,并重定向到/页面。如果不正确,则返回login页面。
- 创建一个/login页面:
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<form method="post" action="/login">
<label>Username:</label>
<input type="text" name="username"><br>
<label>Password:</label>
<input type="password" name="password"><br>
<input type="submit" value="Login">
</form>
</body>
</html>
在上面的示例中,我们创建了一个名为login的HTML页面,包含一个表单,用于输入用户名和密码。
- 启动应用程序,并访问http://localhost:8080/,可以看到重定向到/login页面。输入正确的用户名和密码,可以看到重定向到/页面。输入错误的用户名和密码,可以看到仍然停留在login页面。
示例二:性能监控拦截器
以下是另一个示例,演示如何使用拦截器实现性能监控:
- 创建一个名为PerformanceInterceptor的拦截器:
public class PerformanceInterceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(PerformanceInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
request.setAttribute("startTime", System.currentTimeMillis());
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
long startTime = (long) request.getAttribute("startTime");
long endTime = System.currentTimeMillis();
long executeTime = endTime - startTime;
logger.info("{} executed in {} ms", request.getRequestURI(), executeTime);
}
}
在上面的示例中,我们创建了一个名为PerformanceInterceptor的拦截器,实现了HandlerInterceptor接口,并重写了preHandle()和afterCompletion()方法。在preHandle()方法中,我们记录了请求开始的时间。在afterCompletion()方法中,我们计算了请求执行的时间,并使用日志记录器记录了请求的URI和执行时间。
- 在MyWebMvcConfigurer类中注册PerformanceInterceptor拦截器:
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new PerformanceInterceptor())
.addPathPatterns("/**");
}
}
在上面的示例中,我们在addInterceptors()方法中注册了PerformanceInterceptor拦截器,并指定了拦截所有请求("/**")。
- 启动应用程序,并访问http://localhost:8080/,可以在日志中看到请求的URI和执行时间。
总结
在本文中,我们深入讲解了Spring Boot拦截器的使用,包括拦截器的定义、注册和使用,以及两个示例。这些技巧可以帮助您实现一些常见的功能,例如身份验证、日志记录、性能监控等。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot拦截器使用精讲 - Python技术站