1

jsfログインとログアウトの小さなWebアプリを開発しています。いくつかの問題があります。ログアウト方法でセッションが削除されず、ログインページへのリダイレクトが機能しません。stackoverflow.comから質問しました。MattユーザーがFilterクラスに回答しました。 Mattに従ってFilterとページキャッシュを調査しています。web.xmlファイルなどでFilterのdoFilter()メソッドを使用していました。

これが私のコードです:

public class LoginFilter implements Filter {


@Override
public void init(FilterConfig config) throws ServletException {

}

@Override
public void doFilter(ServletRequest req, ServletResponse res,
        FilterChain chain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    UserController userController = (UserController) request.getSession().getAttribute("user");


    if (userController == null || !userController.isLoggedIn()) {
        response.sendRedirect(request.getContextPath() + "/login.jsf");
    } else {
        chain.doFilter(request, response);
    }
}

@Override
public void destroy() {

}

}

そしてlogout()

    public String logout() {

    FacesContext context = FacesContext.getCurrentInstance();
    ExternalContext ec = context.getExternalContext();
    final HttpServletRequest request = (HttpServletRequest) ec.getRequest();
    request.getSession(false).invalidate();
    return "logout";
}

そしてweb.xml構成:

<filter>
     <filter-name>loginFilter</filter-name>
     <filter-class>org.bis.logic.LoginFilter</filter-class>
</filter>
<filter-mapping>
     <filter-name>loginFilter</filter-name>
     <url-pattern>*.jsf</url-pattern>
</filter-mapping>

ログに記録した後、ホームページをレンダリングします。

<body>
 <!-- 
 #{ session.invalidate(); 
    response.sendRedirect("login.jsf");
  } -->
 <h:panelGrid rendered="#{userController.isLoggedIn()}">

 Hello Mr . #{userController.user.name}

<br />
<h:form>
    <p align="right">
          <h:commandLink action="#{userController.logout()}"value="Logout" />
    </p>
</h:form>
</h:panelGrid>
</body>

私のuserControllermanagedBeanクラス:

@ManagedBean(name = "userController")

@SessionScoped public class UserController {

private User user;

public UserController() {
    user = new User();
}

public User getUser() {
    return user;
}

public void setUser(User user) {
    this.user = user;
}

public static void addErrorMessage(String msg) {
    FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_ERROR,
            msg, msg);
    FacesContext.getCurrentInstance().addMessage(null, facesMsg);
}

public String authenticate() {

    if (user.getName().equals("admin") && user.getPassword().equals("")) {
        return "success";
    } else
        addErrorMessage(String
                .format("Username and Password didn't match !!!"));
    return "fail";

}

ページナビゲーションxml:

    <navigation-rule>
    <from-view-id>/login.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>success</from-outcome>
        <to-view-id>/home.xhtml</to-view-id>
        <redirect />
    </navigation-case>
    <navigation-case>
        <from-outcome>fail</from-outcome>
        <to-view-id>/login.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>
<navigation-rule>
    <from-view-id>/home.xhtml</from-view-id>
    <navigation-case>
        <from-action>#{userController.logout()}</from-action>
        <from-outcome>logout</from-outcome>
        <to-view-id>/index.xhtml</to-view-id>
        <redirect />
    </navigation-case>
</navigation-rule>
4

1 に答える 1

3

フィルタが無限のリダイレクト ループで実行されています。上のリクエストlogin.jsfもフィルターを呼び出します。ユーザーがまだログインしていない場合は、リダイレクトされlogin.jsf、フィルターが再度呼び出されます。

これを修正するには、基本的に 2 つの方法があります。

  1. login.jsfがフィルターの URL パターンに含まれていないことを確認してください。すべての保護されたページ (! を除く) を 、 、 などの別のフォルダーに収集し、代わりlogin.jsfにその URL パターンにフィルターをマップします。/app/secured/pages/app/*

  2. リクエストがすでにログイン ページをリクエストしているかどうかを判断する追加のチェックを追加し、リクエストしている場合は再度リダイレクトしないようにします。

    String loginURL = request.getContextPath() + "/login.jsf";
    
    boolean loggedIn = userController != null && userController.isLoggedIn();
    boolean loginRequest = request.getRequestURI().equals(loginURL);
    
    if (loggedIn || loginRequest) {
        chain.doFilter(request, response);
    } else {
        response.sendRedirect(loginURL);
    }
    
于 2012-05-01T12:28:13.717 に答える