我正在开发一个带有 Richfaces 和 Apache MyFaces JSF 实现的 Web 应用程序,Spring,Hibernate,部署在 Tomcat 7 上。

我的每个请求都通过一个身份验证过滤器,检查用户是否已登录。问题是,当我尝试加载我的登录页面时,它会卡在 doFilter 方法中,因为 http servlet 请求会话不包含我的登录 bean,当我尝试获取它时,它是 null。

尝试加载页面后,浏览器显示:“页面未正确重定向”

这是我的 AuthenticationFilter:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ro.nordicparts.odin.frontend.managedbeans.Login;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter("/views/*")
public class AuthenticationFilter implements Filter {

    private static final Logger LOG = LoggerFactory.getLogger(AuthenticationFilter.class);

    private FilterConfig config;

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        LOG.info("AuthFilter doFilter");

        HttpServletRequest req = (HttpServletRequest) request;

        Login auth = (Login) req.getSession().getAttribute("login");

        if (auth != null && auth.isLoggedIn()) {
            // User is logged in, so just continue request.
            chain.doFilter(request, response);
        } else {
            // User is not logged in, so redirect to index.
            HttpServletResponse res = (HttpServletResponse) response;
            // Also check ajax requests, these need a special redirect response
            if ("partial/ajax".equals(((HttpServletRequest) request).getHeader("Faces-Request"))) {
                res.setContentType("text/xml");
                res.getWriter()
                    .append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
                    .printf("<partial-response><redirect url=\"%s\"></redirect></partial-response>", req.getContextPath() + "/login.xhtml");
            } else {
                res.sendRedirect(req.getContextPath() + "/login.xhtml");
            }
        }
    }

    public void init(FilterConfig config) throws ServletException {
        this.config = config;
    }

    public void destroy() {
        config = null;
    }
}

这是我的 LoginBean:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ro.nordicparts.odin.model.jaxb.LoginResponse;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import java.io.Serializable;
import java.util.Locale;

@ManagedBean(name="login")
@SessionScoped
public class Login implements Serializable {

    private static final Logger LOG = LoggerFactory.getLogger(Login.class);

    public static final String AUTH_KEY = "app.user.name";

    @ManagedProperty(value="#{sessionData}")
    private SessionData sessionData;

    private String username;
    private String password;

    private static final long serialVersionUID = 2156313213089107389L;

    public Login() { }

    public boolean isLoggedIn() {
        return sessionData.getLoginResponse() != null;
    }

    public String logoutAction() {
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
                .remove(AUTH_KEY);
        sessionData.setLoginResponse(null);
        return "/login.xhtml";
    }

    public String loginAction() {
        ILoginBO bo = (ILoginBO) ServiceFactory.getServiceImpl(LoginBO.class);

        try {
            LoginResponse loginResponse = loginBO.loginAction(username, password);
            LoginResponse loginResponse = new LoginResponse();
            sessionData.setLoginResponse(loginResponse);
        } catch (NotAuthorizedException e) {
            FacesContext context = FacesContext.getCurrentInstance();
            String value = context.getApplication().evaluateExpressionGet(context, "#{msg['"+e.getMessage()+"']}", String.class);
            FacesMessage message = new FacesMessage(value);
            FacesContext.getCurrentInstance().addMessage(null, message);
            return "login.xhtml";
        }
        return "views/index.xhtml";
    }

    public String registerAction() {
        return "register.xhtml";
    }

    public SessionData getSessionData() {
        return sessionData;
    }

    public void setSessionData(SessionData sessionData) {
        this.sessionData = sessionData;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

login.xhtml:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich">

<h:head>
    <title><h:outputText value="#{msg['login.title']}" /></title>
    <link rel="stylesheet" type="text/css"bhref="#{request.contextPath}/style/style2.css" />
</h:head>

<h:body>
    <div id="container">
        <h:form class="login">
            <fieldset>
                <LEGEND>Login</LEGEND>

                <p>
                    <h:messages />
                </p>
                <p>
                    <h:outputLabel class="field" for="username" value="#{msg['login.username']}" />
                    <h:inputText class="textboxright" id="username" value="#{login.username}" />
                </p>
                <p>
                    <h:outputLabel class="field" for="password" value="#{msg['login.password']}" />
                    <h:inputSecret class="textboxright" id="password" value="#{login.password}" />
                </p>
                <p>
                    <h:commandButton class="login" value="#{msg['login.loginAction']}"  action="#{login.loginAction}" />

                    <h:commandLink class="left" value="#{msg['login.registerAction']}" action="#{login.registerAction}" />
                </p>

            </fieldset>
        </h:form>
    </div>
</h:body>
</html>

如果它有助于发现问题,我也会附上我的 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="norducparts-frontend" version="2.5">
    <display-name>NordicpartsFrontend</display-name>

    <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>*.jsf</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/views/*</url-pattern>
    </servlet-mapping>

    <filter>
        <filter-name>LoginFilter</filter-name>
        <filter-class>ro.nordicparts.odin.frontend.filters.AuthenticationFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LoginFilter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/views/*</url-pattern>
    </filter-mapping>

    <context-param>
        <param-name>org.richfaces.skin</param-name>
        <param-value>DEFAULT</param-value>
    </context-param>
    <context-param>
        <param-name>org.richfaces.fileUpload.maxRequestSize</param-name>
        <param-value>100000</param-value>
    </context-param>
    <context-param>
        <param-name>org.richfaces.fileUpload.createTempFiles</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <context-param>
        <param-name>org.richfaces.resourceOptimization.enabled</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>server</param-value>
    </context-param>

    <context-param>
        <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.DISABLE_FACELET_JSF_VIEWHANDLER</param-name>
        <param-value>true</param-value>
    </context-param>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:ro/nordicparts/odin/frontend/application-config.xml</param-value>
    </context-param>

    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>classpath:ro/nordicparts/odin/config/log4j.xml</param-value>
    </context-param>

    <welcome-file-list>
        <welcome-file>views/index.xhtml</welcome-file>
    </welcome-file-list>

    <error-page>
        <exception-type>javax.faces.application.ViewExpiredException</exception-type>
        <location>/error.xhtml</location>
    </error-page>

    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <listener>
        <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
    </listener>
</web-app>

还有我的 pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>odin</artifactId>
        <groupId>ro.nordicparts</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>ro.nordicparts</groupId>
    <artifactId>odin.frontend</artifactId>
    <packaging>war</packaging>
    <version>1.1</version>

    <name>odin.frontend</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <richfaces.version>4.3.5.FINAL</richfaces.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.version>4.0.0.RELEASE</spring.version>
        <hibernate.version>4.3.0.Final</hibernate.version>
        <hibernate.tools.version>3.2.0.beta8</hibernate.tools.version>
        <hibernate.generic.dao>1.2.0</hibernate.generic.dao>
        <slf4j.version>1.6.4</slf4j.version>
        <junit.version>4.7</junit.version>
        <log4j.version>1.2.14</log4j.version>
        <commons-dbcp.version>1.4</commons-dbcp.version>
        <jersey.version>1.1.5</jersey.version>
        <servlet-api-version>2.5</servlet-api-version>
        <modules.version>1.0-SNAPSHOT</modules.version>

    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.richfaces</groupId>
                <artifactId>richfaces-bom</artifactId>
                <version>${richfaces.version}</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>

        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>odin.model</artifactId>
            <version>${modules.version}</version>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>odin.business</artifactId>
            <version>${modules.version}</version>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>odin.persistence</artifactId>
            <version>${modules.version}</version>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>odin.config</artifactId>
            <version>${modules.version}</version>
        </dependency>

        <dependency>
            <groupId>org.richfaces.core</groupId>
            <artifactId>richfaces-core-impl</artifactId>
        </dependency>
        <dependency>
            <groupId>org.richfaces.ui</groupId>
            <artifactId>richfaces-components-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.richfaces.ui</groupId>
            <artifactId>richfaces-components-ui</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.myfaces.core</groupId>
            <artifactId>myfaces-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.myfaces.core</groupId>
            <artifactId>myfaces-impl</artifactId>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>servlet-api</artifactId>
                    <groupId>javax.servlet</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>net.sourceforge.cssparser</groupId>
            <artifactId>cssparser</artifactId>
            <version>0.9.7</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>14.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.w3c.css</groupId>
            <artifactId>sac</artifactId>
            <version>1.3</version>
        </dependency>
        <dependency>
            <groupId>antlr</groupId>
            <artifactId>antlr</artifactId>
            <version>2.7.6rc1</version>
        </dependency>
        <dependency>
            <groupId>asm</groupId>
            <artifactId>asm</artifactId>
            <version>1.5.3</version>
        </dependency>
        <dependency>
            <groupId>asm</groupId>
            <artifactId>asm-attrs</artifactId>
            <version>1.5.3</version>
        </dependency>
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.0</version>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.0</version>
        </dependency>

        <dependency>
            <groupId>concurrent</groupId>
            <artifactId>concurrent</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>javax.security</groupId>
            <artifactId>jaas</artifactId>
            <version>1.0.01</version>
        </dependency>
        <dependency>
            <groupId>javax.security</groupId>
            <artifactId>jacc</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>jaxen</groupId>
            <artifactId>jaxen</artifactId>
            <version>1.1</version>
        </dependency>
        <dependency>
            <groupId>javax.transaction</groupId>
            <artifactId>jta</artifactId>
            <version>1.1</version>
        </dependency>
        <dependency>
            <groupId>oscache</groupId>
            <artifactId>oscache</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>proxool</groupId>
            <artifactId>proxool</artifactId>
            <version>0.8.3</version>
        </dependency>

        <dependency>
            <groupId>org.w3c.css</groupId>
            <artifactId>sac</artifactId>
            <version>1.3</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-ext</artifactId>
            <version>1.7.5</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
          </dependency>
          <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
          </dependency>

        <dependency>
            <groupId>swarmcache</groupId>
            <artifactId>swarmcache</artifactId>
            <version>1.0RC2</version>
        </dependency>
        <dependency>
            <groupId>xalan</groupId>
            <artifactId>xalan</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>xerces</groupId>
            <artifactId>xmlParserAPIs</artifactId>
            <version>2.6.2</version>
        </dependency>
        <dependency>
            <groupId>xerces</groupId>
            <artifactId>xerces</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>xml-apis</groupId>
            <artifactId>xml-apis</artifactId>
            <version>2.0.2</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>NordicpartsFrontend</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

你能帮助我解决这个问题吗?几天来我一直在苦苦挣扎,似乎无法解决这个问题。