如何避免过滤器后在dispatcherServlet中关闭输入流

我需要持久保存有关为应用程序发送的请求/响应的所有信息,例如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()。还有没有那么简单的解决方案?


慕运维8079593
浏览 156回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java