Проблема с cookies в JSF (Java Server Faces)

164
27 августа 2018, 05:50

Есть JSF приложение, в котором по нажатию на кнопку логин:

<h:commandButton  styleClass="btn btn-danger"  action="${authBean.doLogin()}" value="Войти">
                                <f:ajax event="keyup" render="fail"/>
</h:commandButton>

В методе authBean doLogin() проверяется методом check() ести ли данный пользователь в бд вот он:

public String doLogin() {
   if(check(this.login, this.password)){
       if(createCookie) addCookieWithLP(this.login, this.password);
       return "feed";
   }else{
       return "";
   }
}

Далее если пользователь поставил галочку "Запомнить меня" создаются куки в следующем методе

public void addCookieWithLP(String log, String pass){
    HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
    Cookie cookieLog = new Cookie("login", log);
    cookieLog.setHttpOnly(true);
    cookieLog.setMaxAge(60 * 60 * 24 * 365);
    cookieLog.setPath("/");
    response.addCookie(cookieLog);
    Cookie cookiePass = new Cookie("password", pass);
    cookiePass.setHttpOnly(true);
    cookiePass.setMaxAge(60 * 60 * 24 * 365);
    cookiePass.setPath("/");
    response.addCookie(cookiePass);
}

Проблема состоит в том, что, когда пользователь успешно вошёл, и к нему добавились Cookie, то он попадает на страницу, где в меню есть следующая кнопка:

<h:outputLink value="/login" onclick="${authBean.removeCookies()}"  styleClass="dropdown-item ">Выход</h:outputLink>

Которая ссылается на метод удаления куков:

public void removeCookies(){
    FacesContext context = FacesContext.getCurrentInstance();
    if(context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
        HttpServletRequest request = (HttpServletRequest) context.getCurrentInstance().getExternalContext().getRequest();
        response.setStatus(HttpServletResponse.SC_OK);
        request.getSession().invalidate();
        for (Cookie cookie : request.getCookies()) {
            cookie.setMaxAge(0);
            response.addCookie(cookie);
        }
    }
}

И вот, пользователь, получивший свои законные куки, попав на следующую страницу сразу теряет их)) Я смотрел в хранилище браузера, они появляются и сразу исчезают.

Можно ли как-то решить данную проблему, чтобы Cookie сохранялись, а при нажатии на кнопку уничтожались. Заранее спасибо за любую помощь.

EDIT.

p:commandButton от фреймфорка PrimeFaces работает прекрасно, но у нёё свой стиль и она сильно отделяется от других, притом стиль не меняется. Заработало, если вместо h:outputLink сделать h:commandButton и обернуть его в h:form:

<h:form>
 <h:commandButton value="Выйти" action="${authBean.removeCookie()}" />
</h:form>
READ ALSO
Не получается изменить цвет NavBar (Android)

Не получается изменить цвет NavBar (Android)

Никак не получается изменить цвет NavBar'a в андроид приложенииПробовал прописывать в resources/style:

202
Android studio - edittext

Android studio - edittext

Нужно сделать EditText таким, чтобы он был многострочным, но при этом в длину был "бесконечным"

178
android = Подскажите почему при использование TextView закрывается приложение

android = Подскажите почему при использование TextView закрывается приложение

При использовании in и out в классе MainActivity приложение закрываетсяЕсли использовать их напрямую в методе OnCreate () всё работает, но когда используется...

170