【问题标题】:Modify Request in Sparkweb framework using RequestWrappers使用 RequestWrappers 在 Sparkweb 框架中修改请求
【发布时间】:2018-04-14 02:38:30
【问题描述】:

在我的应用程序中,我想添加一个使用 spark.Spark.before 进行验证的过滤器,如果请求被授予,那么我想向请求本身添加一些信息,所以在我的 spark.Route 实现中可以访问这个信息。

但我不知道该怎么做

例如:

// RequestFilter
before((request, response) -> {
    if (isGrantedRequest()) {
        // modify request adding params, etc
        // maybe using some kind of RequestWrapper
    }
})

.....

post("/", this::handle);

.....

// Request handler
Object handle(Request request, Response response) throws Exception {
    // access to information added in request
}

【问题讨论】:

  • 您想在请求中添加什么信息?你的用例是什么?
  • 例如添加一些从请求中的 access_token 计算的参数,所以如果请求来自外部计算机,我使用他的 access_token 为该客户端放置信息,例如它的 user_id,否则请求从内部网络假设始终发送带有 user_id 的参数
  • 您可以使用会话。

标签: spark-java


【解决方案1】:

看看这个answer

您可以使用属性。与会话不同,这不会使您的应用程序状态变满。更多属性是请求的本地属性,并且与会话不同,即使在同时请求的情况下,它们也会对每个请求具有唯一值。

在前置过滤器中设置属性。

before((req, res) -> {
    req.attribute("key", "value");
});

并在处理程序中读取它。

post((req, res) -> {
    String value = req.attribute("key");
});

【讨论】:

    【解决方案2】:

    您可以为此目的使用 session。这是请求中用于设置您想要的数据的位置。

    before 代码中,您将根据isGrantedRequest() 方法的结果创建一个会话并在其中设置一些属性:

    Spark.before("/somePath", (req, res) -> {
        Session ses = req.session(true);
        if (isGrantedRequest()) {
            ses.attribute("attr1", "valA");
            ses.attribute("attr2", "valB");
        } else {
            ses.attribute("attr1", "valX");
            ses.attribute("attr2", "valY");
        }
    });
    

    get/post 代码中,您将检索会话属性:

    Spark.get("/somePath", (req, res) -> {
        Session ses = req.session();
        if (ses != null) {
            String val1 = ses.attribute("attr1");
            String val2 = ses.attribute("attr2");
            System.out.println(val1 + " " + val2);
        }
        return "";
    });
    

    查看Spark's sessions API 以查看更多选项。

    【讨论】:

    • 这个解决方案有效,但我认为是一种变通方法而不是优雅,我想使用无状态请求并且只使用过滤器来拦截,如 javax.servlet.Filter.doFilter。这样,代码只使用请求中的信息而不创建会话,但似乎我不能,也许是框架的限制:(
    • @AndrésMargalef 您可以在过滤器中修改的唯一内容是响应(即设置标题/正文、更改类型、重定向它)。但我不确定这是否符合您的需求。
    • 我使用内部线程本地的解决方法,其中包含请求所需的信息,并不优雅,但我不修改响应。还是谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    相关资源
    最近更新 更多