我需要持久保存有關(guān)為應(yīng)用程序發(fā)送的請求/響應(yīng)的所有信息,例如http狀態(tài),當(dāng)前時間,令牌,請求URI等。這是一個API,資源是:POST本地主機(jī):8080 / v1 / auth / login,其中包含電子郵件和密碼,以請求身份驗證。響應(yīng)是一個JWT令牌。GET localhost:8080 / v1 / auth / rules在請求標(biāo)頭中帶有令牌。響應(yīng)是包含有關(guān)令牌所有者的信息(例如電子郵件和名稱)的正文。為此,我的方法重寫了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負(fù)責(zé)獲取有關(guān)請求的示例信息,并且 LogDispatcherServlet對于localhost:8080 / v1 / auth / rules中的GET可以正常工作。我最大的問題是:我正在使用Spring Security生成JWT令牌,因此發(fā)送到/ v1 / auth / login的所有請求都將重定向到過濾器。成功通過身份驗證后,篩選器必須調(diào)用LogDispatcherServlet來持久保存請求和響應(yīng)。有沒有控制器用于/登錄,只是JWTLoginFilter。但這不適用于/ login。當(dāng)ApiLog嘗試在getRequestPayload中獲取請求正文時,我得到一個java.io.IOException:流已關(guān)閉為了避免這種情況我該怎么辦?JWTLoginFilter也需要知道身份驗證請求主體和LogDispatcherServlet,但在tryAuthentication中會調(diào)用request.getInputStream()。還有沒有那么簡單的解決方案?
如何避免過濾器后在dispatcherServlet中關(guān)閉輸入流
慕運(yùn)維8079593
2021-04-05 16:13:35