我需要持久保存有关为应用程序发送的请求/响应的所有信息,例如http状态,当前时间,令牌,请求URI等。这是一个API,资源是:POST本地主机:8080 / v1 / auth / login,其中包含电子邮件和密码,以请求身份验证。响应是一个JWT令牌。GET localhost:8080 / v1 / auth / rules在请求标头中带有令牌。响应是包含有关令牌所有者的信息(例如电子邮件和名称)的正文。为此,我的方法重写了doDispatch方法:LogDispatcherServlet@Componentpublic 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()。还有没有那么简单的解决方案?
添加回答
举报
0/150
提交
取消