在Spring Boot中,拦截器(Interceptor)是一种强大的工具,它允许你在请求处理链中插入自定义逻辑,从而实现如权限校验、日志记录、性能监控等功能。通过合理地使用拦截器,你可以提升Web应用的安全性和效率。以下是如何轻松使用Spring Boot拦截器注入的详细指南。
1. 创建拦截器
首先,你需要创建一个拦截器类,并实现HandlerInterceptor接口。这个接口定义了三个方法:preHandle、postHandle和afterCompletion。
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在请求处理之前执行
System.out.println("Before handling request");
return true; // 返回true表示继续处理请求,返回false则中断请求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在请求处理之后,视图渲染之前执行
System.out.println("After handling request but before view rendering");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 在整个请求结束之后执行,也就是在DispatcherServlet渲染了对应的视图之后执行
System.out.println("After request is completely handled");
}
}
2. 注册拦截器
创建拦截器之后,你需要将其注册到Spring Boot的拦截器注册表中。这可以通过实现WebMvcConfigurer接口来完成。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor)
.addPathPatterns("/**") // 拦截所有请求
.excludePathPatterns("/resources/**"); // 排除静态资源请求
}
}
3. 拦截器参数处理
拦截器可以接收请求参数、请求头等,这有助于你进行更复杂的逻辑处理。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String userId = request.getParameter("userId");
if (userId == null || !isValidUserId(userId)) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.getWriter().write("Unauthorized");
return false;
}
return true;
}
4. 提升安全性与效率
通过拦截器,你可以实现以下安全性和效率提升:
- 安全性:进行权限校验、防SQL注入、XSS攻击等。
- 效率:缓存处理结果、压缩响应数据、减少数据库访问等。
5. 示例:日志记录
以下是一个简单的日志记录拦截器示例:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
String method = request.getMethod();
String IP = request.getRemoteAddr();
System.out.println("Request URI: " + requestURI);
System.out.println("Method: " + method);
System.out.println("IP: " + IP);
return true;
}
通过这种方式,你可以轻松地将拦截器注入到Spring Boot应用中,从而提升Web应用的安全性和效率。记住,合理设计拦截器逻辑,避免过度使用,以免影响应用性能。