Как получить значения из объекта запроса?

#playframework-2.0

#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());
}
  

Ответ №1:

Здесь значение request.username() устанавливается в игре.

Итак, в контроллерах, которые вы хотите защитить, вы добавляете @Security.Authenticated(Security.class) аннотацию? Вот так

В основном он использует 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());
  }

  ...
}
  

Следуйте этому образцу проекта для получения дополнительной информации.

Ответ №2:

Итак, похоже, что вы можете использовать session().get("email") вместо request().username() хотя, я следил за документацией play, и здесь используется последнее:

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