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");
Смотрите также:
- Выполнение аутентификации пользователя в Java EE / JSF с использованием j_security_check - показывает, как на самом деле использовать управляемую контейнером аутентификацию
Не связанный с конкретным вопросом: я очень сомневаюсь в полезности этого скрытого поля ввода и этого фрагмента JS. Почему вы передаете переменную, которая уже присутствует на стороне сервера, обратно на сторону сервера? Вы уверены, что вам действительно нужно сделать это таким образом?