Изменение значения JSF SessionScoped Bean для выхода из системы - PullRequest
1 голос
/ 07 марта 2020

Я делаю небольшой сайт для школьного проекта, но немного борюсь с тем, как выйти из системы. Я обращаюсь с тем, чтобы войти в систему, просто записав его имя пользователя в бин @SessionScoped и используя его для доступа к остальной его информации. Мой план их выхода - просто вернуть имя пользователя на ноль.

UserBean. java

@Data
@Named
@SessionScoped
public class UserBean implements Serializable {

    private String username;

    public boolean isLoggedIn() {
        return username != null;
    }

}

LoginController. java

@Named
@RequestScoped
public class LoginController {

    @Inject
    private UserBean userBean;

    @EJB
    private AccountDAO accountDAO;

    @Inject
    private LoginBackingBean loginBackingBean;


    public void validateEmailAndPassword() {

        if (accountDAO.usernameExist(userBean.getUsername())) {
            if (!(accountDAO.getAccountByUsername(userBean.getUsername())).getPassword().equals(loginBackingBean.getPassword())) {
                String msg = "Username or Password is incorrect";
                throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "", msg));
            }
        }
    }

    public void login() {
        userBean.setUsername(loginBackingBean.getUsername());
    }

}

LogoutController. java

@Named
@RequestScoped
public class LogoutController {

    @Inject
    private UserBean userBean;

    public void logout() {
        userBean.setUsername(null);
    }

}

x html вставить, что его вид вызывается из (menuDropdown.x html):

<html xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets" 
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      >

    <h:body>
        <ui:composition>
            <button class="btn btn-outline-dark" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                menu
            </button>
            <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
                <p:link class="dropdown-item" href="#">

                </p:link>
                <div class="dropdown-divider"></div>
                <div class="dropdown-item">
                    <h:commandButton class="btn btn-primary" value="Sign out" action="#{logoutController.logout}"></h:commandButton>
                </div>
            </div>
        </ui:composition>
    </h:body>
</html>

И вот как я вызываю logoutController:

<h:commandButton class="btn btn-primary" value="Sign out" action="#{logoutController.logout()}"></h:commandButton>

Прямо сейчас метод входа в систему работает отлично, и я могу получить имя пользователя из бина, написав #{userBean.username}. Однако по какой-то причине ничего не происходит, когда я нажимаю commandButton, чтобы выйти из системы. Я неправильно это называю или здесь что-то еще происходит?

1 Ответ

1 голос
/ 07 марта 2020

Для эффективного выхода пользователя из системы сеанс должен быть уничтожен, и при этом все возможности остаются в системе (удаление файлов cookie и т. Д. c.). Чтобы уничтожить сеанс, метод выхода должен содержать следующее:

FacesContext.getCurrentInstance().getExternalContext().invalidateSession();

Это делает недействительным (уничтожает) текущий сеанс, и все значения будут сброшены, и если пользователь останется на стороне, новый сеанс с именем по умолчанию и новым идентификатором будут созданы значения.

Также хорошей идеей будет перенаправление на представление c публикации, поэтому пользователь не видит страницу 403. Затем просто верните:

return "/index?faces-redirect=true";

Некоторые лекции:

Жизнь JSF после выхода из системы

Как создать, получить доступ и уничтожить сеанс в управляемом компоненте JSF?

Выполнение аутентификации пользователя в Java EE / JSF с использованием j_security_check

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...