如何从请求对象中获取值?

时间:2014-06-30 15:41:03

标签: playframework-2.0

我试图使用request().username()获取会话用户名。在我的安全课程中,我覆盖了getUsername()以获取如下的电子邮件密钥:

 public class Secured extends Security.Authenticator {

@Override
public String getUsername(Context ctx){
    return ctx.session().get("email");
}

@Override
public Result onUnauthorized(Context ctx){
    return redirect(routes.Application.login());
}

登录时,我设置会话:

    public static Result authenticate(){
    Form<Login> loginForm = Form.form(Login.class).bindFromRequest();

    if(loginForm.hasErrors()){
        return badRequest(login.render(loginForm));
    }
    else{
        session().clear();
        session("email",loginForm.get().email);
        return redirect(routes.Application.problems());
    }

}

我可以看到这个有效,因为在我的浏览器中,当我登录时,我有这个:

""37fbf73f635e5f6a37323396add131da2b7cbcf6-email=bob@example.com""

但是,当我在这里使用request()。username()时,我得到一个空值。

public static Result addProblem(){


    create("new", "new", "new", "new", "new", request().username());
    return redirect(routes.Application.problems());
}

2 个答案:

答案 0 :(得分:0)

所以看来您可以使用session().get("email")而不是request().username(),但是,我正在关注播放文档并在此处使用后者:

public static Result add() {
Project newProject = Project.create(
    "New project",
    form().bindFromRequest().get("group"),
    **request().username()**
);
return ok(item.render(newProject));
}

答案 1 :(得分:0)

This is where request.username()的值在Play中设置。

因此,在您想要保护的控制器中,您是否添加了@Security.Authenticated(Security.class)注释? Like this

基本上它是使用action composition在每次请求控制器操作之前在request()上设置用户名。在您的示例中,以下内容应该有效:

@Security.Authenticated(Secured.class)
public class Problems extends Controller {

  public static Result addProblem() { 
    create("new", "new", "new", "new", "new", request().username());
    return redirect(routes.Application.problems());
  }

  ...
}

关注this sample project了解更多信息。