JSF 1.2アプリケーションでセッションが進行中で、セッションタイムアウトまたはユーザーがブラウズバックまたは更新ページを押すたびにセッションが乱れる予期せず行動するようになります。JSFセッションのタイムアウト/リフレッシュ/バック/フォワードを検出してログイン画面に戻る
私は、そのようなことが起こるたびに、ユーザーを定義済みのログイン画面に戻すことができます。 認証はJSFアプリケーション内で処理されます。
ありがとうございました!はい、あなたが配置する必要がいけない
MyPhaseListener.java
のfaces-config.xmlの<faces-config version="1.2" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
(...)
<lifecycle>
<phase-listener>yourPackage.MyPhaseListener</phase-listener>
</lifecycle>
(...)
</faces-config>
でリスナーを設定
public class MyPhaseListener implements PhaseListener {
public void afterPhase(PhaseEvent event) {
//If you have a login, so you have a user in session. Try to retrieve this value
//and it will return null if the user is not logged in or theres no more session
//and...
if (null == FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("myUserInSession") {
//Redirect to login using mapped navigation configs in faces-config.xml
try {
NavigationHandler nh = FacesContext.getCurrentInstance().getApplication().getNavigationHandler();
nh.handleNavigation(FacesContext.getCurrentInstance(), null, "stringToReturnLogin");
} catch (Exception e) {
}
//OR using redirect
try {
FacesContext.getCurrentInstance().getExternalContext().redirect("http://localhost:xxxx/App_Context/Page.xhtml");
} catch (Exception e) {
}
}
}
public void beforePhase(PhaseEvent event) {
//Do nothing
}
@Override
public PhaseId getPhaseId() {
return PhaseId.RESTORE_VIEW;
}
}
:
これは、ユーザーがバックボタンまたはリフレッシュボタンを押していることを処理しますか? – Ben
私は知りません、試してください..私のアプリは完全なAJAXなので、歴史的なものを生成せず、ブラウザの戻るボタンは常に無効になっています。私はF5とコンテクストメニューをブロックしました(リッチフェイスを使って自分のコンテキストメニューを作った)。 – Renan
PhaseId.RESTORE_VIEW。このようにこのメソッドをオーバーライドすると、すべてのフェーズのRESTORE_VIEWが返されます。私はそれがPhaseId.ANY_PHASEであるべきだと思います。 – Krishna