JSF页面ins';使用过滤器接口进行t重定向

JSF页面ins';使用过滤器接口进行t重定向,jsf,redirect,servlet-filters,Jsf,Redirect,Servlet Filters,我正在开发jsf登录和注销较小的web应用程序。我发现了一些问题。我的注销方法没有删除会话,也无法重定向到登录页面。我已从stackoverflow.com询问。Matt用户向我回答了Filter类。然后我根据Matt研究了筛选器和页面缓存。我使用了Filter的doFilter()方法,在web.xml文件等中 这是我的密码: public class LoginFilter implements Filter { @Override public void init(FilterConf

我正在开发jsf登录和注销较小的web应用程序。我发现了一些问题。我的注销方法没有删除会话,也无法重定向到登录页面。我已从stackoverflow.com询问。Matt用户向我回答了Filter类。然后我根据Matt研究了筛选器和页面缓存。我使用了Filter的doFilter()方法,在web.xml文件等中

这是我的密码:

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() {

}
}

和注销()

和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>
@会议范围 公共类用户控制器{

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>

/login.xhtml
成功
/home.xhtml
失败
/login.xhtml
/home.xhtml
#{userController.logout()}
注销
/index.xhtml

您的筛选器正在无限重定向循环中运行。
login.jsf
上的请求也将调用筛选器。如果用户仍未登录,则它将重定向回
login.jsf
,后者将再次调用筛选器,等等

基本上有两种方法可以解决此问题:

  • 确保过滤器的URL模式不包括
    login.jsf
    。将所有安全页面(除了
    login.jsf
    !)收集到一个单独的文件夹中,如
    /app
    /secured
    /pages
    等,并将过滤器映射到该URL模式,例如
    /app/*

  • 添加一个额外的检查,确定请求是否已经请求登录页面,如果已经请求,则不再重定向到该页面

    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);
    }
    

  • 这是一张错误页面图片![注销后不要重定向到登录页面。在该图片中,表示注销后单击浏览器后退按钮。基本上检查重定向登录页面][1][1]:您需要告诉浏览器不要缓存页面。请参阅一个具体示例,您甚至可以在已有的筛选器中执行此操作。我使用了CacheControllPhaseListener类。public类Mr.BalusC我更改为向up post的筛选器类添加代码?或写入新的NoCacheFilter类?
    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";
    
    }
    
        <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>
    
    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);
    }