【问题标题】:Spark is running before filter twiceSpark 在过滤器之前运行两次
【发布时间】:2017-02-14 03:13:37
【问题描述】:

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

before("/login", (req, res) -> {
    // do some things
    LOGGER.debug("before /login");
    LOGGER.debug("Request -> " + req);
    LOGGER.degub("body " + req.body());
}

当我的应用程序运行时,before 过滤器会被调用两次。

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

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

有两个问题:

  1. 如何禁用该行为?
  2. 过滤器声明为+/*paths的目的是什么?

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

【问题讨论】:

    标签: java spark-java


    【解决方案1】:

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

    在你的情况下,当它是 POST 请求时,你需要检查正文(例如,我不知道你的情况到底是什么)

    正如您所提到的,由于 OPTIONS 和 POST 请求,该过滤器被调用了两次。

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

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

    如果您确实需要保留过滤器,另一种选择是检查过滤器中的请求方法,并将验证应用于 POST 方法,而不是 OPTIONS 方法。

    【讨论】:

    • 我按照你的建议做了,检查是否使用if (HttpMethod.post.name().equalsIgnoreCase(req.requestMethod()))。我不确定它是否优雅但可以解决。
    • @josivan 是的,它会起作用,但如果你问我,我个人认为它不优雅
    猜你喜欢
    • 2013-05-01
    • 1970-01-01
    • 2016-08-05
    • 2012-03-25
    • 2019-11-20
    • 2018-08-06
    • 2019-01-21
    • 2017-01-13
    • 1970-01-01
    相关资源
    最近更新 更多