カスタム認証のためのJSFプロジェクトでの認可フィルタの使用

私はアプリケーションにログイン/ログアウト機能を組み込んでいますが、ブラウザのアドレスバーにポイントしたときにログアウトした後でもページが表示されるため、フィルタが動作していない可能性があります。ログイン操作は次のとおりです:

this.currentUser = new User(); //initiate currentUser
FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.getApplication().createValueBinding("#{" + Constants.VISIT_KEY_SCOPE +
Constants.VISIT_KEY + "}").setValue(facesContext, currentUser);
FacesUtils.putIntoSession(Constants.VISIT_KEY, currentUser);

ログアウトアクション: -

FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession)facesContext.getExternalContext().getSession(false);
session.removeAttribute(Constants.VISIT_KEY_SCOPE + Constants.VISIT_KEY);

 if (session != null)
    {
     session.invalidate();
    }

定数クラス: -

public class Constants
{
 //Backing bean keys
 public final static String VISIT_KEY_SCOPE = "sessionScope.";
 public final static String VISIT_KEY = "currentUser";

//Model object keys
 public final static String PROJECT_COORDINATOR_SCOPE = "applicationScope.";


  public final static String ORIGINAL_VIEW_SCOPE = "sessionScope";
  public final static String ORIGINAL_VIEW_KEY = "originalTreeId";
  }

web.xml: -

 
 AuthorizationFilter
 org.AuthorizationFilter.AuthorizationFilter
 
 
 AuthorizationFilter
 /faces/pages/*
 

最後に認可フィルタは次のようになります。

public class AuthorizationFilter implements Filter
{
 FilterConfig config = null;
 ServletContext servletContext = null;

 public AuthorizationFilter()
 {
 }

 public void init(FilterConfig filterConfig) throws ServletException
 {
  config = filterConfig;
  servletContext = config.getServletContext();
  }

  public void doFilter(ServletRequest request, ServletResponse response,
                   FilterChain chain) throws IOException, ServletException
     {
       HttpServletRequest httpRequest = (HttpServletRequest)request;
       HttpServletResponse httpResponse = (HttpServletResponse)response;
       HttpSession session = httpRequest.getSession();

       User currentUser = (User)session.getAttribute("currentUser");

    if (session  == null || currentUser == null || currentUser.getUserName() == null)
     {
      session.setAttribute(Constants.ORIGINAL_VIEW_KEY, httpRequest.getPathInfo());
      httpResponse.sendRedirect(httpRequest.getContextPath() +  "/faces/pages  
       /login.jsp");
      }
     else
        {
         session.removeAttribute(Constants.ORIGINAL_VIEW_KEY);
         chain.doFilter(request, response);
         } 

         }

          public void destroy()
          {
           }
           }

忍耐と助けに感謝の束。

4

1 答え

ユーザーがログインしているかどうかを確認する必要がある制限されたページをキャッシュしないようにブラウザに指示する必要があります。そうしないと、ブラウザはキャッシュからページを表示し、フィルタを呼び出しません。 FilterChain#doFilter()を呼び出す前に、フィルタの else ブロックに次の行を追加することで可能です。

httpResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");//HTTP 1.1.
httpResponse.setHeader("Pragma", "no-cache");//HTTP 1.0.
httpResponse.setDateHeader("Expires", 0);//Proxies.

Unrelated to the concrete problem, there are some flaws in your code:

    getSession( false )を渡したため、ログアウトアクションの
  1. session.removeAttribute() NullPointerException 。とにかく session.invalidate()をコールしようとすると、その行は大変です。削除するだけです。

  2. false を渡していないため、フィルタの request.getSession() null を返しません。したがって、 session == null は余分です。または、 false を追加する必要があります。

3
追加された
テストする前にブラウザのキャッシュをクリアする必要があります。
追加された 著者 BalusC,
hi BalusC。返信ありがとう。私は "キャッシュの削除"の行を追加しました。あなたが言及した1番と2番のアドレス指定されたポイント。アプリケーションでエラーが発生することはありませんが、アドレスがブラウザに書き込まれると、ページが表示されます。どのようなアイデアを探してどこですか?
追加された 著者 Jamal Khattak,
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript