Java 在JSF中尝试使用Servlet过滤器登录时出现无限循环

Java 在JSF中尝试使用Servlet过滤器登录时出现无限循环,java,jsf,servlets,jsf-2,Java,Jsf,Servlets,Jsf 2,我试图使用JSF和servlet过滤器创建一个登录应用程序,但当用户登录时,什么也不会发生。它再次重定向到登录页面 以下是项目目录: 这里是web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XML

我试图使用JSF和servlet过滤器创建一个登录应用程序,但当用户登录时,什么也不会发生。它再次重定向到登录页面

以下是项目目录:

这里是web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" 
         xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <filter>
        <filter-name>LoginFilter</filter-name>
        <filter-class>javaeetutorial.guessnumber.filters.LoggedInFilter</filter-class>
    </filter>
    <!-- Set the login filter to secure all the pages in the /secured/* path of the application  -->
    <filter-mapping>
        <filter-name>LoginFilter</filter-name>
        <url-pattern>/secured/*</url-pattern>
    </filter-mapping>
    <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>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>greeting.xhtml</welcome-file>
    </welcome-file-list>
</web-app>
这里是login.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"htth://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"     
      xmlns:h="http://java.sun.com/jsf/html">

    <h:head>
        <title>Login form</title>
    </h:head>
    <h:body>
        <h3>Login here</h3>
        <h:form id="login-form">
           <h:outputText value="username:"/>
           <h:inputText value="#{testBean.username}" id="username"/>
           <br/>
           <h:outputText value="password:"/>
           <h:inputSecret value="#{testBean.password}" id="password"/>
           <br/>
           <h:commandButton id="button" value="Login" action="#{testBean.doLogin}"/>
           <br/>
           <h:commandLink action="#{navigationBean.redirectToInfo}" value="Info page"/>
           <br/>
           <h:messages />
           <br/>
        </h:form>
    </h:body>
</html>

登录表格
在这里登录






您将JSF托管bean/概念与CDI托管bean混合在一起

首先,您忽略了指定容器,但我将为普通servlet容器编写一个答案,为支持CDI的java应用程序服务器(如TomEE/Wildfly/Glassfish)编写一个答案

使用
@Named
@SessionScoped
但是要确保您有正确的@SessionScoped。javax.enterprise.context是包名。如果您使用JSF中的SessionScoped,那么bean的作用域将是依赖的,这是错误的

现在卸下过滤器并使用测试页面进行快速测试。将字段设置为
(都在
中)。确保值在F5之后仍然存在,从而成功地
@SessionScoped.

如果它不起作用,请确保您使用的是CDI1.1,或者文档中相应地存在beans.xml

最后使用

@Inject
private TestBean testBean;
或者,如果您有一个像Tomcat或Jetty这样的普通容器,则需要使用Deltaspike核心,然后:
TestBean TestBean=BeanProvider.getContextualReference(TestBean.class,false)


祝您好运

您的过滤器似乎适用于所有内容。它不应该排除登录页面吗?不,只有安全/抱歉下的页面,代码解析的方式,看起来所有的过滤器映射都被注释掉了,因为它们都是灰色文本。在获得
登录栏后,您是否可以暂停一下,看看它是否总是
null
?您是否尝试过调试
LoggedInFilter.doFilter()
方法?bean设置是否正确?@L-Rayı尝试过,当我添加line System.out.println(loginBean)时,它给出了一个空指针异常;我将所有“ManagedBean”更改为“Named”,并导入了正确的@SessionScoped库。会话作用域工作得很好,当我按f5时,我可以看到相同的值,但我仍然无法登录并转到安全页面。现在它工作了,问题是我不知道如何在筛选器类中使用inject,现在它工作得很好。谢谢
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"htth://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"     
      xmlns:h="http://java.sun.com/jsf/html">

    <h:head>
        <title>Login form</title>
    </h:head>
    <h:body>
        <h3>Login here</h3>
        <h:form id="login-form">
           <h:outputText value="username:"/>
           <h:inputText value="#{testBean.username}" id="username"/>
           <br/>
           <h:outputText value="password:"/>
           <h:inputSecret value="#{testBean.password}" id="password"/>
           <br/>
           <h:commandButton id="button" value="Login" action="#{testBean.doLogin}"/>
           <br/>
           <h:commandLink action="#{navigationBean.redirectToInfo}" value="Info page"/>
           <br/>
           <h:messages />
           <br/>
        </h:form>
    </h:body>
</html>
@Inject
private TestBean testBean;