下面是 Spring Boot 如何利用拦截器拦截请求信息收集到日志的攻略:
1. 什么是拦截器?
拦截器(Interceptor)是 Spring 框架提供的一种机制,用于在请求前后对请求进行预处理和后处理。在 Spring Boot 中,可以使用拦截器实现对请求的统一拦截,常见的应用场景包括日志记录、权限控制等。
2. 如何创建一个拦截器?
创建一个拦截器,需要先实现 HandlerInterceptor
接口,并重写其中的方法,默认情况下只需要重写其中一个方法 preHandle()
即可。
public class LogInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 实现拦截前的业务逻辑
return true; // 返回值表示是否将请求继续转发处理
}
}
3. 如何在 Spring Boot 中应用拦截器?
首先,在 Spring Boot 中需要将拦截器注册到项目中,可以通过继承 WebMvcConfigurerAdapter
并重写 addInterceptors()
方法实现:
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurerAdapter {
@Bean
public LogInterceptor getLogInterceptor() {
return new LogInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getLogInterceptor()).addPathPatterns("/**"); // 将拦截器注册到请求地址为 / 的路径下面
}
}
上述代码中,我们创建了一个 LogInterceptor
的实例,并将其注册到请求路径为 /
的路径下面。
接下来,在 preHandle()
方法中,可以获取请求的信息,包括请求参数、请求 URL 等,然后将这些信息记录到日志里:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 获取请求的参数
Map<String, String[]> paramMap = request.getParameterMap();
String params = "";
if (paramMap != null && paramMap.size() > 0) {
for (Map.Entry<String, String[]> entry : paramMap.entrySet()) {
params += entry.getKey() + "=" + Arrays.toString(entry.getValue()) + "&";
}
if (params.length() > 0) {
params = params.substring(0, params.length() - 1);
}
}
// 获取请求的 URL
String requestUrl = request.getRequestURL().toString();
// 输出日志信息
Logger logger = LoggerFactory.getLogger(getClass());
logger.debug("Interceptor Request: url={}, params={}", requestUrl, params);
return true;
}
通过调用 getLogger()
方法获取到日志记录器的实例,并使用 debug()
方法记录日志信息。
4. 示例说明
示例1:拦截请求并记录日志
以下示例是一个拦截器,在接口请求时捕获请求中的参数并将其记录到日志中:
public class LoggingInterceptor implements HandlerInterceptor {
private static final Logger log = LoggerFactory.getLogger(LoggingInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String url = request.getRequestURI().toString();
log.info("Request URL[{}]: {} Paramters: {}", request.getMethod(), url, getParameterMap(request));
return true;
}
private String getParameterMap(HttpServletRequest request) {
Map<String, String[]> parmsMap = request.getParameterMap();
if (parmsMap == null) {
return "";
}
String jsonObject = JSONObject.toJSONString(parmsMap);
return jsonObject;
}
}
在 Spring Boot web 应用的启动类中注册该拦截器:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 记录请求日志
registry.addInterceptor(new LoggingInterceptor()).addPathPatterns("/**");
}
...
}
示例2:拦截请求并进行用户权限校验
以下示例是一个拦截器,实现了基本的用户权限校验功能:
public class AuthenticationInterceptor extends HandlerInterceptorAdapter {
private static final Logger log = LoggerFactory.getLogger(AuthenticationInterceptor.class);
@Autowired
private UserService userService;
private static final String HEADER_AUTHORIZATION = "Authorization";
private static final String AUTHORIZATION_PREFIX = "Bearer ";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = getTokenFromHeader(request);
if (StringUtils.isBlank(token)) {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
return false;
}
User user = userService.getUserFromToken(token);
if (user == null) {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
return false;
}
request.setAttribute("currentUser", user);
return true;
}
private String getTokenFromHeader(HttpServletRequest request) {
String authorizationHeader = request.getHeader(HEADER_AUTHORIZATION);
if (StringUtils.isBlank(authorizationHeader)) {
return null;
}
if (!authorizationHeader.startsWith(AUTHORIZATION_PREFIX)) {
return null;
}
return authorizationHeader.replace(AUTHORIZATION_PREFIX, "");
}
}
在业务控制器中通过 @PreAuthorize
注解进行权限校验:
@RestController
@RequestMapping("/api")
public class UserController {
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
@GetMapping("/users")
public ResponseEntity<List<User>> getUsers() {
List<User> users = userService.findAll();
return ResponseEntity.ok(users);
}
...
}
同样地,要在 Spring Boot web 应用的启动类中注册该拦截器:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 鉴权
registry.addInterceptor(new AuthenticationInterceptor()).addPathPatterns("/api/**");
}
...
}
以上两个示例,分别演示了如何通过拦截器记录请求日志和进行用户权限校验。具体实现方式有所不同,但都可以通过继承 HandlerInterceptor
接口实现。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Springboot如何利用拦截器拦截请求信息收集到日志详解 - Python技术站