JSF живот след излизане

Използвам удостоверяване, базирано на формуляр.

Имам връзка за излизане, която изглежда така:

<h:commandLink action="#{loginBean.logout}">
    <h:outputText value="logout" />
</h:commandLink></div>

И съответния метод за излизане:

public String logout() {
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();

    return "/view/index?faces-redirect=true"; // Redirect added as per BalusC's suggestion.
}

След натискане на връзката за излизане се връщам на първа страница, но изглежда без CSS. Когато натисна бутон за стартиране на търсене, получавам следната грешка:

javax.faces.application.ViewExpiredException: viewId:/view/index.jsf - View /view/index.jsf could not be restored.

И все пак CSS всъщност е под /resources, което не би трябвало да изисква удостоверяване, доколкото разбирам моя web.xml:

    <security-constraint>
    <web-resource-collection>
        <web-resource-name>fizio</web-resource-name>
        <url-pattern>/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>*</role-name>
    </auth-constraint>
</security-constraint>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Unprotected area</web-resource-name>
        <url-pattern>/resources/*</url-pattern>
    </web-resource-collection>
</security-constraint>

От това състояние изглежда, че мога да вляза отново и да видя някои данни между случайни грешки при изгледа не може да се възстанови, но без CSS. Всичко е малко счупено наистина. Всякакви предложения ще бъдат оценени.

ETA: Форма за вход:

<form method="POST" action="j_security_check">
    <label for="j_password">Username:</label> <input type="text" name="j_username" />
    <br />
    <label for="j_password">Password:</label> <input type="password" name="j_password" /> <input type="submit" value="Login" />
</form>

person rich    schedule 22.08.2011    source източник


Отговори (1)


Трябва да пренасочите след невалидност. В противен случай страницата се показва в средата на „невалидната“ сесия. Добавете faces-redirect=true към резултата, за да задействате пренасочването.

public String logout() {
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
    return "/index?faces-redirect=true";
}

Пренасочването ще накара уеб браузъра да задейства нова GET заявка след POST отговора и на свой ред ще накара сървъра да създаде чисто нова сесия. По този начин изгледите ще работят по предназначение.

Що се отнася до CSS ресурсите, те очевидно все още се нуждаят от влизане. Ограничението „Незащитена зона“, което имате там, няма да работи. Премахнете го и променете URL шаблона на вашето основно ограничение за сигурност на например /app/* или какъвто и да е общ път на защитената зона.

person BalusC    schedule 22.08.2011
comment
Благодаря. Това изглежда е направило фина разлика - при натискане на излизане сега виждам страницата за вход, пълна със CSS. Но ако наистина натисна влизане, се връщам към приложението си в състояние на невалидна сесия. Може би допълнителен проблем с моята форма за влизане? - person rich; 22.08.2011
comment
Можете ли, моля, да опишете по-подробно проблема, в който се връщам към приложението си в невалидното състояние на сесията? Опитайте се да погледнете на проблема от гледна точка на разработчика, а не от гледна точка на крайния потребител. напр. има ли сесийната бисквитка? Има ли средства за промяна на ID на сесията? и т.н. - person BalusC; 22.08.2011
comment
О, има ли някакъв шанс просто да търсите страница от кеша на браузъра? Опитайте да създадете филтър, както е предложено в следния отговор: stackoverflow.com/questions/3642919/ Можете да проверите с помощта например на Firebug дали търсите страница от кеша на браузъра или не. Друг (непрофесионален) тест е да натиснете Ctrl+F5 след излизане и след това да опитате отново действието. - person BalusC; 22.08.2011
comment
Изглежда, че има бисквитка на сесия, свързана с корена на контекста, който остава след натискане на излизане и отново след натискане на влизане. Тя поддържа същата стойност JSESSIONID през цялото време, освен ако не навигирам ръчно до корена на контекста, когато получа нова стойност на JSESSIONID. - person rich; 22.08.2011
comment
Изключихте ли кеша на браузъра като виновник? Вижте предишния коментар. Определено трябва да получите нова бисквитка за сесия след излизане (но само ако страницата се обслужва от сървър, а не от кеша на браузъра). - person BalusC; 22.08.2011
comment
Сега добавих филтъра. Поставям точка на прекъсване, в която се удря редовно. Но не изглежда да е променило поведението. - person rich; 22.08.2011
comment
Това наистина е странно. Виждате ли заглавка Set-Cookie в отговора на пренасочената заявка? Филтърът задава ли правилното Cache-Control заглавие и други за всички JSF заявки? Изчистихте ли кеша на браузъра преди теста? Какъв сервлет контейнер използвате? Спомням си подобни проблеми със сесийните бисквитки на Resin. - person BalusC; 22.08.2011
comment
Има 302 POST към index.jsf, последван от 200 GET също за index.jsf, който има Set-Cookie със стойност JSESSIONID, която е различна от тази в Cookie за 302. Не изчистих кеша на браузъра, Сега ще го пробвам. Използвам JBoss AS7. - person rich; 22.08.2011
comment
Добре, тази част изглежда добре. Когато подадете формуляр в index.jsf, същият Cookie зададен ли е в заявката, както е получен в Set-Cookie на пренасочения GET отговор? - person BalusC; 22.08.2011
comment
Да, използва стойността Set-Cookie, когато след това изпраща формуляра за вход. Изчистването на кеша на браузъра изглежда не е разрешило нищо. Виждам, че заглавките, свързани с кеша на набора от филтри, се връщат. - person rich; 22.08.2011
comment
Добре, тази част също изглежда добре. Какво точно се случва, когато изпратите данните за вход след това? Казахте, че завършвам в състояние на невалидна сесия, но не описахте точните симптоми и поведение. Влизате ли в системата или получихте ViewExpiredException? Или CSS/JS е повреден? и т.н. - person BalusC; 22.08.2011
comment
Стиловите таблици не са прикачени. Освен това, когато се опитвах да изпълня определени задачи, като търсене, получавах ViewExpiredException, въпреки че изглежда, че нещо направено по-горе е поправило това. Firebug показва, че таблиците със стилове се връщат като страница с формуляр за вход, а не като CSS. Освен това връзката за излизане изглежда няма ефект - не пренасочва. - person rich; 22.08.2011
comment
О, добре, наистина трябваше да го изясните от самото начало :) Изтеглени ли са CSS ресурсите или не? Проверете го с Firebug и проверете данните за отговора. - person BalusC; 22.08.2011
comment
Заявките за таблицата със стилове получават 200 OK, но данните за отговора са HTML за формуляра за влизане, а не CSS. - person rich; 22.08.2011
comment
Да, вашето ограничение за сигурност не работи по този начин. Актуализирах отговора. - person BalusC; 22.08.2011
comment
Ако премахна секцията с незащитени ресурси и променя шаблона на URL адреса на другата на /jsf-web/*, тогава, когато за първи път вляза в приложението, тя не пренасочва към страницата за вход и получавам NPE в приложението си, когато се опитва да извличане на влезлия потребител. - person rich; 22.08.2011
comment
Тогава шаблонът на URL просто не съвпада. Изглежда, че сте посочили контекстния път вместо реална папка в контекста на webapp. моделът на URL трябва да бъде зависим от контекста. - person BalusC; 22.08.2011
comment
ах Добавяне на три url шаблона за index.jsp, /view/* и /edit/*, с които изглежда работи. Благодаря за упоритостта! - person rich; 22.08.2011
comment
Моля. Моля, не забравяйте да маркирате отговора като приет винаги, когато е помогнал (най-много) за решаването на проблема. Вижте също meta. stackexchange.com/questions/5234/. Също така помислете за преглед на въпроси с неприети отговори в хронологията на вашите въпроси stackoverflow.com/users/180416/rich. Ако няма отговор и вече сте решили проблема сами, трябва да го публикувате като отговор в подробности. - person BalusC; 22.08.2011