この質問は、JSF 2.0 / Facelets を使用して、すべての AJAX 呼び出しにグローバル リスナーをアタッチする方法はありますか?と非常によく似ています。 しかし、解決策は私にとってはうまくいきません。私は何かが欠けています。
問題は次のとおりです。セッションの有効期限が切れたときに、いくつかの ajax リンク/ボタンをクリックしてFilter
、ブラウザから (から)リダイレクトを送信します。ページを更新しない AJAX 以外でリクエストされた最後のページを受け取ります。
私が持っているものは次のとおりです。
- WebSphere 上の JSF 2.1 (私は Richfaces 4.2.0 も使用しています)
- 私はAJAXを使用しています(ログイン後の最初のリクエストを除く)
- フィールドで使用
@ManagedBean(name = "user") @SessionScoped UserBean
しますUser user
(これは、ユーザーアクセス管理用のEJBエンティティクラスです) - OmniFaces クラスを使用して実行します
FullAjaxExceptionHandler
(BalusC のおかげで、フィルターがなくても問題なく動作します) javax.servlet.Filter
maped toを使用し@WebFilter("*.xhtml")
て、リソースへのアクセスとログイン チェックを管理しています。doFilter()
関数スニペット:.... if (user == null) { // if user is not logged in redirectToLogin(req, res); }
そして
redirectToLogin()
、同じ Filter クラスに関数があります (BalusC (= ) に感謝します:private static final String FACES_REDIRECT_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<partial-response><redirect url=\"%s\"></redirect></partial-response>"; protected void redirectToLogin(ServletRequest req, ServletResponse res) throws IOException { HttpServletRequest request = (HttpServletRequest) req; if ("partial/ajax".equals(request.getHeader("Faces-Request"))) { res.setContentType("text/xml"); res.setCharacterEncoding("UTF-8"); res.getWriter().printf(FACES_REDIRECT_XML, request.getContextPath() + "/login.xhtml"); } else { String url = request.getContextPath() + "/login.xhtml"; HttpServletResponse resHttp = (HttpServletResponse) res; resHttp.sendRedirect(url); } }
セッションが期限切れになり、いくつかの ajax リンク/ボタンをクリックすると (ViewExpiredException が発生します)。res.getWriter().printf(FACES_REDIRECT_XML, request.getContextPath() + "/login.xhtml");
文字列が実行されることをデバッグで確認できます。また、HTTP REDIRECT リクエストとレスポンスも表示できます。login.xhtml(これはログインページではなく、最後の非 AJAX リクエストが行われた古いページです! ) Firebug のページ、しかし、ブラウザはビューを更新しません.
ViewExpiredException が Filter (FacesContext の外側) で発生したことをどうにかして検出し、制御を FullAjaxExceptionHandler に渡すことはできますか? (ところで、可能であれば、ViewExpiredException に ajaxExceptionHandler はもう必要ありませんよね?) ブラウザのページが更新されない理由は何ですか?
投稿の冒頭で述べたように、関連する投稿のガイドラインを読み、それに従っていますが、何かを見逃したり、誤解したりしました。どうなり得るか?
ありがとう。
更新: 私が受け取った HTML コードは、最後の非 AJAX リクエストで返された古い HTML ページです! つまり、FacesServlet は login.xhtml をクライアントのブラウザに送信しません。
Update2: FasesServletから受け取ったページが、AJAX 以外で要求された最後のページであることがわかりました (私の場合、ログインに成功した後に最初に表示されるビューです)。(ところで、ブラウザはまだページを更新せず、この行によって引き起こされる XML 解析エラーがあります<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
:)
Update3: web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>facelets.DEVELOPMENT</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<session-config>
<session-timeout>
1
</session-timeout>
</session-config>
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>login.xhtml</welcome-file>
</welcome-file-list>
<context-param>
<param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
<param-value>true</param-value>
</context-param>
<error-page>
<error-code>500</error-code>
<location>/errors/500.xhtml</location>
</error-page>
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/loginViewExpired.xhtml</location>
</error-page>
</web-app>