Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.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.X:在Global.java中处理onrequest和重定向_Java_Playframework - Fatal编程技术网

Play Framework 2.X:在Global.java中处理onrequest和重定向

Play Framework 2.X:在Global.java中处理onrequest和重定向,java,playframework,Java,Playframework,我是新手。我正在做一个基础项目,现在正在做身份验证功能。我想将未经授权的用户重定向到/login路由 我发现了Global.java类,它允许我控制项目中的操作,特别是onRequest函数。我正计划用它来做重定向 我在网上搜索了几个解决方案,但找不到一个有效的 我的班级: import play.*; import play.mvc.Action; import play.mvc.*; import play.mvc.Http.*; import play.mvc.Result.*; impo

我是新手。我正在做一个基础项目,现在正在做身份验证功能。我想将未经授权的用户重定向到/login路由

我发现了Global.java类,它允许我控制项目中的操作,特别是onRequest函数。我正计划用它来做重定向

我在网上搜索了几个解决方案,但找不到一个有效的

我的班级:

import play.*;
import play.mvc.Action;
import play.mvc.*;
import play.mvc.Http.*;
import play.mvc.Result.*;
import play.libs.F.*;
import static play.mvc.Results.*;
import play.mvc.Http.Request;
import java.lang.reflect.Method;


public class Global extends GlobalSettings {
    @Override
    public Action onRequest(Request request, Method actionMethod) {

    //Check if the user is connected
    if (request.cookie("PLAY_SESSION") == null && !request.path().startsWith("/login")) {
        System.out.println("UNAUTHORIZED");
        return new Action.Simple() {
            @Override
            public Result call(Context ctx) throws Throwable {
                return redirect(controllers.routes.Application.index());
            }
        };
    }

    return super.onRequest(request, actionMethod);
   }
}
我发现了这个,我不明白为什么要玩!不想编译:

错误:不是抽象的,并且不重写操作中的抽象方法调用(上下文)
错误:方法不重写或实现超类型中的方法


我不是随便玩的,我也不太理解这个问题。有人能帮我吗?谢谢

我已经有一段时间没有使用Play框架了,但我认为问题在于,在2.2中,他们采取了行动来回报承诺,而不仅仅是结果。这就是你的问题

检查Action.Simple.call()的版本是否匹配

Result call(Context ctx) throws Throwable
看到两者的区别了吗

(查看调用方法的返回类型)

编辑

我不确定这是否是最好的办法,但它应该奏效

@Override
public F.Promise<Result> call(Context ctx) throws Throwable {
    return F.Promise.pure(redirect(controllers.routes.Application.index()));
}
@覆盖
公共F.承诺呼叫(上下文ctx)抛出可丢弃{
返回F.Promise.pure(重定向(controllers.routes.Application.index());
}
F.Promise.pure()可用于将结果(或实现它的任何东西,例如Results.Status)转换为承诺

示例,其中ok()返回play.mvc.Results.Status:

F.Promise.pure(ok("[No Preview Available]"));

您需要包含所有的Global.java,以便我们了解发生了什么。我正在使用play2.3.8,我已经检查过了,它似乎是承诺。但是现在redirect()抛出了一个“不兼容类型”错误。是否有其他方法重定向到/login路由?使用F.Promise.pure。好的,它似乎有效,但现在我有一个“ERR\u TOO\u MANY\u REDIRECTS”,但我认为我可以自己解决这个问题。谢谢编辑:我的错误(路线不好),它很好用!谢谢;)仅供参考:
ERR\u TOO\u MANY\u REDIRECTS
表示您创建的重定向可能处于循环中,只有一个重定向转到页面,然后重定向回页面,或者重定向到同一地址(再次重定向),等等。。。