2

この質問は、JSF 2.0 / Facelets を使用して、すべての AJAX 呼び出しにグローバル リスナーをアタッチする方法はありますか?と非常によく似ています。 しかし、解決策は私にとってはうまくいきません。私は何かが欠けています。

問題は次のとおりです。セッションの有効期限が切れたときに、いくつかの ajax リンク/ボタンをクリックしてFilter、ブラウザから (から)リダイレクトを送信します。ページを更新しない AJAX 以外でリクエストされた最後のページを受け取ります

私が持っているものは次のとおりです。

  1. WebSphere 上の JSF 2.1 (私は Richfaces 4.2.0 も使用しています)
  2. 私はAJAXを使用しています(ログイン後の最初のリクエストを除く)
  3. フィールドで使用@ManagedBean(name = "user") @SessionScoped UserBeanしますUser user(これは、ユーザーアクセス管理用のEJBエンティティクラスです)
  4. OmniFaces クラスを使用して実行しますFullAjaxExceptionHandler(BalusC のおかげで、フィルターがなくても問題なく動作します)
  5. javax.servlet.Filtermaped 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>
4

0 に答える 0