我正在开发一个带有 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>
你能帮助我解决这个问题吗?几天来我一直在苦苦挣扎,似乎无法解决这个问题。