Java 火花在过滤器前运行两次

Java 火花在过滤器前运行两次,java,spark-java,Java,Spark Java,我正在映射一个过滤器,以便在登录前检查一些必填字段。我的代码如下所示: before("/login", (req, res) -> { // do some things LOGGER.debug("before /login"); LOGGER.debug("Request -> " + req); LOGGER.degub("body " + req.body()); } 当我的应用程序运行时,会调用两次之前的过滤器 在每种情况下,req是不同

我正在映射一个过滤器,以便在登录前检查一些必填字段。我的代码如下所示:

before("/login", (req, res) -> {
    // do some things
    LOGGER.debug("before /login");
    LOGGER.debug("Request -> " + req);
    LOGGER.degub("body " + req.body());
}
当我的应用程序运行时,会调用两次
之前的
过滤器

在每种情况下,
req
是不同的实例。在第一个示例中,
req.body()
的内容是一个空字符串。在第二个示例中,内容正是我从客户端应用程序发送的内容

在调试过程中,我发现一个过滤器的路径被描述为类中声明的
+/*路径

有两个问题:

  • 如何禁用该行为
  • 声明为
    +/*路径的筛选器的用途是什么

  • 我相信过滤器被调用两次的原因是因为我已经按照所描述的步骤启用了CORS。无论如何,我需要使用CORS,但是在我的场景中,两次调用过滤器是一个问题。

    我认为您不需要使用过滤器。在不同情况下,当您需要检查某些内容时,会使用过滤器

    在您的情况下,您需要在POST请求时检查正文(例如,我不知道您的具体情况)

    正如您所提到的,由于选项和POST请求,该筛选器被调用了两次

    您应该做的是将验证移动到接收请求的方法。例如:

    Spark.post("/login", (req, res) -> {
        // validate..
        // do action..
    });
    

    如果您确实需要保留筛选器,另一个选项是检查筛选器中的请求方法,并将验证仅应用于POST方法,而不是选项方法。

    我按照您的建议做了,检查是否使用
    if(HttpMethod.POST.name().equalsIgnoreCase(req.requestMethod())
    。我不确定它是否优雅,但它解决了问题。@josivan是的,它会起作用,但如果你问我,我个人认为它不优雅