JSF - метод Java: getCurrentUserName

Я могу передать имя пользователя из JSF в управляемый компонент, например, так:

<script type="text/javascript" >
  function onLoad(){
    document.getElementById("form:user").value = "#{sessionScope['username']}";}
  window.onload = onLoad;
</script>

<h:inputHidden id="user" value="#{bean.username}"/>

Можно ли получить его напрямую, используя метод Java? Я пробовал что-то вроде:

public String getCurrentUserName()
{
  String name = "";
  FacesContext facesContext = FacesContext.getCurrentInstance();
  ExternalContext externalContext = facesContext.getExternalContext();

  if (externalContext.getUserPrincipal() != null) {
    name = externalContext.getUserPrincipal().getName(); // null
  }
  return name;
}

или же:

facesContext.getExternalContext().getRemoteUser();       // null
facesContext.getExternalContext().isUserInRole("pps");   // null

Но пользователь всегда нулевой.. что я делаю не так?

ОБНОВЛЕНИЕ (создание контейнера сеанса):

public String login() {
  ...
  FacesContext context = FacesContext.getCurrentInstance();
  session = (HttpSession) context.getExternalContext().getSession(true);
  session.setAttribute("id", user.getId());
  session.setAttribute("username", user.getName());
  ...

1 ответ

Решение
#{sessionScope['username']}

Это в основном печатает атрибут сеанса с именем "username", Что-то вроде следующего в сыром Java-коде (если вы знакомы с базовым Servlet API):

response.getWriter().print(session.getAttribute("username"));

Если эта часть работает, то вы определенно не используете управляемую контейнером аутентификацию вообще, и, таким образом, получатель роли, управляемый контейнером, и получатель роли пользователя определенно не будут возвращать ничего.

Вы можете получить доступ к атрибуту сеанса точно так же, как вы обращаетесь к управляемому компоненту JSF в области сеанса (они находятся под крышками, а именно, хранятся как атрибуты сеанса!):

@ManagedProperty("#{username}")
private String username; // +setter

или, конечно же, неуклюжим образом

String username = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("username");

Смотрите также:


Не связанный с конкретным вопросом: я очень сомневаюсь в полезности этого скрытого поля ввода и этого фрагмента JS. Почему вы передаете переменную, которая уже присутствует на стороне сервера, обратно на сторону сервера? Вы уверены, что вам действительно нужно сделать это таким образом?

Другие вопросы по тегам