我需要持久保存有关为应用程序发送的请求/响应的所有信息,例如http状态,当前时间,令牌,请求URI等。这是一个API,资源是:
POST本地主机:8080 / v1 / auth / login,其中包含电子邮件和密码,以请求身份验证。响应是一个JWT令牌。
GET localhost:8080 / v1 / auth / rules在请求标头中带有令牌。响应是包含有关令牌所有者的信息(例如电子邮件和名称)的正文。
为此,我的方法重写了doDispatch方法:
LogDispatcherServlet
@Component
public class LogDispatcherServlet extends DispatcherServlet {
@Autowired
private LogRepository logRepository;
private static final Logger logger = LoggerFactory.getLogger(LogDispatcherServlet.class);
@Override
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
if (!(request instanceof ContentCachingRequestWrapper)) {
request = new ContentCachingRequestWrapper(request);
}
if (!(response instanceof ContentCachingResponseWrapper)) {
response = new ContentCachingResponseWrapper(response);
}
HandlerExecutionChain handler = getHandler(request);
try {
super.doDispatch(request, response);
} finally {
try {
ApiLog log = ApiLog.build(request, response, handler, null);
logRepository.save(log);
updateResponse(response);
} catch (UncheckedIOException e) {
logger.error("UncheckedIOException", e);
} catch (Exception e) {
logger.error("an error in auth", e);
}
}
}
ApiLog.build负责获取有关请求的示例信息,并且 LogDispatcherServlet对于localhost:8080 / v1 / auth / rules中的GET可以正常工作。
我最大的问题是:我正在使用Spring Security生成JWT令牌,因此发送到/ v1 / auth / login的所有请求都将重定向到过滤器。
成功通过身份验证后,筛选器必须调用LogDispatcherServlet来持久保存请求和响应。有没有控制器用于/登录,只是JWTLoginFilter。
但这不适用于/ login。当ApiLog尝试在getRequestPayload中获取请求正文时,我得到一个java.io.IOException:流已关闭
为了避免这种情况我该怎么办?JWTLoginFilter也需要知道身份验证请求主体和LogDispatcherServlet,但在tryAuthentication中会调用request.getInputStream()。还有没有那么简单的解决方案?
相关分类