Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Play Framework 2.7:如何在Java中更新动作合成中的会话_Java_Playframework - Fatal编程技术网

Play Framework 2.7:如何在Java中更新动作合成中的会话

Play Framework 2.7:如何在Java中更新动作合成中的会话,java,playframework,Java,Playframework,我正在尝试将应用程序从更新为Play 2.7。我发现现在通过Http.Context访问会话对象已被弃用。相反,我必须使用Http.Request对象。此外,在我可以立即更改会话对象之前,现在似乎我必须创建一个新的会话并进行修改。但是,如果我不能访问结果对象,如何在动作合成中实现这一点呢 动作合成可以如下所示: public class VerboseAction extends play.mvc.Action.Simple { public CompletionStage<Resul

我正在尝试将应用程序从更新为Play 2.7。我发现现在通过Http.Context访问会话对象已被弃用。相反,我必须使用Http.Request对象。此外,在我可以立即更改会话对象之前,现在似乎我必须创建一个新的会话并进行修改。但是,如果我不能访问结果对象,如何在动作合成中实现这一点呢

动作合成可以如下所示:

public class VerboseAction extends play.mvc.Action.Simple {
  public CompletionStage<Result> call(Http.Request req) {
    ...
    return delegate.call(req);
  }
}

不过,如果有人对如何直接在动作合成中更改会话有更好的想法,请随时回答。

withNewSession()清除的会话。当您使用addingToSession(…)添加内容时,可能会在登录后创建一个新会话。这是我的完整工作代码:我有两个时间戳:一个用于日志文件,另一个用于应用程序超时

public class ActionCreator implements play.http.ActionCreator {
  private final int msTimeout;

  @Inject
  public ActionCreator(Config config) {
    this.msTimeout = config.getInt("application.msTimeout");
  }

  @Override
  public Action<?> createAction(Http.Request request, Method actionMethod) {
    return new Action.Simple() {

      @Override
      public CompletionStage<Result> call(Http.Request req) {

        // add timestamp for the elapsed time in log
        req.getHeaders().addHeader("x-log-timestamp", "" + System.currentTimeMillis());

        // did a session timeout occur
        boolean timeout = SessionUtils.isTimeout(req, msTimeout);

        // apply current action 
        return delegate.call(req).thenApply(result -> {

          // display some info in log
          Utils.logInfo(req);

          // return final result
          if (timeout) {
            return result.withNewSession();
          } else if (SessionUtils.isOpen(req)) {
            return result.addingToSession(req, "timestamp", "" + System.currentTimeMillis());
          } else {
            return result;
          }
        });
      }

    };
  }

}
公共类ActionCreator实现play.http.ActionCreator{
私有最终整数msTimeout;
@注入
公共操作创建者(配置){
this.msTimeout=config.getInt(“application.msTimeout”);
}
@凌驾
公共操作createAction(Http.Request请求,方法actionMethod){
返回新的Action.Simple(){
@凌驾
公共CompletionStage调用(Http.Request-req){
//在日志中添加已用时间的时间戳
req.getHeaders().addHeader(“x-log-timestamp”,“System.currentTimeMillis());
//是否发生会话超时
布尔超时=SessionUtils.isTimeout(req,msTimeout);
//应用当前操作
返回delegate.call(请求),然后应用(结果->{
//在日志中显示一些信息
Utils.logInfo(请求);
//返回最终结果
如果(超时){
返回结果。withNewSession();
}else if(SessionUtils.isOpen(需要)){
返回result.addingToSession(req,“timestamp”,“System.currentTimeMillis());
}否则{
返回结果;
}
});
}
};
}
}

谢谢,但我想在动作合成中做到这一点——在动作中这是直截了当的。
public class ActionCreator implements play.http.ActionCreator {
  private final int msTimeout;

  @Inject
  public ActionCreator(Config config) {
    this.msTimeout = config.getInt("application.msTimeout");
  }

  @Override
  public Action<?> createAction(Http.Request request, Method actionMethod) {
    return new Action.Simple() {

      @Override
      public CompletionStage<Result> call(Http.Request req) {

        // add timestamp for the elapsed time in log
        req.getHeaders().addHeader("x-log-timestamp", "" + System.currentTimeMillis());

        // did a session timeout occur
        boolean timeout = SessionUtils.isTimeout(req, msTimeout);

        // apply current action 
        return delegate.call(req).thenApply(result -> {

          // display some info in log
          Utils.logInfo(req);

          // return final result
          if (timeout) {
            return result.withNewSession();
          } else if (SessionUtils.isOpen(req)) {
            return result.addingToSession(req, "timestamp", "" + System.currentTimeMillis());
          } else {
            return result;
          }
        });
      }

    };
  }

}