Java 在JSF中尝试使用Servlet过滤器登录时出现无限循环
我试图使用JSF和servlet过滤器创建一个登录应用程序,但当用户登录时,什么也不会发生。它再次重定向到登录页面 以下是项目目录: 这里是web.xmlJava 在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
<?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;