登录过滤器被重定向URL中,但视图页面显示“该网页有重定向循环”

问题描述:

这里的问题开始,我得到异常当Eclipse重新加载方面登录过滤器被重定向URL中,但视图页面显示“该网页有重定向循环”

java.lang.NullPointerException 
    at org.richfaces.application.ServiceTracker.release(ServiceTracker.java:100) 
    at org.richfaces.application.InitializationListener.onStop(InitializationListener.java:144) 
    at org.richfaces.application.InitializationListener.processEvent(InitializationListener.java:154) 
    at javax.faces.event.SystemEvent.processListener(SystemEvent.java:106) 
    at com.sun.faces.application.ApplicationImpl.processListeners(ApplicationImpl.java:2168) 
    at com.sun.faces.application.ApplicationImpl.invokeListenersFor(ApplicationImpl.java:2144) 
    at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:302) 
    at com.sun.faces.config.ConfigureListener.contextDestroyed(ConfigureListener.java:332) 
    at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4980) 
    at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5626) 
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232) 
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3947) 
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:426) 
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1345) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1530) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1519) 
    at java.lang.Thread.run(Unknown Source) 

我的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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 
    <display-name>JsfEaxmples</display-name> 
    <context-param> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>server</param-value> 
    </context-param> 
    <context-param> 
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name> 
    <param-value>.xhtml</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>javax.faces.FACELETS_REFRESH_PERIOD</param-name> 
    <param-value>1</param-value> 
    </context-param> 
    <context-param> 
    <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name> 
    <param-value>true</param-value> 
    </context-param> 
    <context-param> 
    <param-name>javax.faces.SEPARATOR_CHAR</param-name> 
    <param-value>-</param-value> 
    </context-param> 
    <context-param> 
    <param-name>org.richfaces.skin</param-name> 
    <param-value>classic</param-value> 
    </context-param> 
    <context-param> 
    <param-name>facelets.BUILD_BEFORE_RESTORE</param-name> 
    <param-value>true</param-value> 
    </context-param> 
    <context-param> 
    <param-name>facelets.RECREATE_VALUE_EXPRESSION_ON_BUILD_BEFORE_RESTORE</param-name> 
    <param-value>true</param-value> 
    </context-param> 
    <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> 
    <context-param> 
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name> 
    <param-value>resources.application</param-value> 
    </context-param> 
    <listener> 

    <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
    </listener> 

    <filter> 
    <filter-name>sessionfilter</filter-name> 
    <filter-class>com.invoice.sessionfilter</filter-class> 

    </filter> 
    <filter-mapping> 
    <filter-name>sessionfilter</filter-name> 
    <url-pattern>/Jsf Invoice System/*</url-pattern> 

    </filter-mapping> 

</web-app> 

我无法理解问题出在我的web.xml或过滤器中。我的过滤器是在这里

package com.invoice; 

import java.io.IOException; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.annotation.WebFilter; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 

/** 
* Servlet Filter implementation class sessionfilter 
*/ 


public class sessionfilter implements Filter { 
    String uname; 

    /** 
    * Default constructor. 
    */ 
    public sessionfilter() { 
     // TODO Auto-generated constructor stub 
    } 

    /** 
    * @see Filter#destroy() 
    */ 
    public void destroy() { 
     // TODO Auto-generated method stub 
    } 

    /** 
    * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) 
    */ 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     // TODO Auto-generated method stub 
     // place your code here 

     // pass the request along the filter chain 
     HttpServletResponse res = (HttpServletResponse) response; 
     HttpServletRequest req = (HttpServletRequest) request; 
     login b=(login)req.getSession().getAttribute("login"); 
     String url= req.getContextPath() +"/Login.xhtml"; 
     if(req.getRequestURI().equals(url)) 
     { 
     if(b!=null && b.isLoggedIn()) 
     { 
      res.sendRedirect(req.getContextPath()+"/Jsf Invoice System/invoiceinfo.xhtml"); 

     } 
     else 
     { 

       // res.sendRedirect(req.getContextPath()+"/Jsf Invoice System/Login.xhtml"); 
      chain.doFilter(request, response); 
     } 
     } 
     else 
     { 

      if(b!=null && b.isLoggedIn()) 
      { 
       chain.doFilter(request, response); 

      } 
      else 
      { 

       res.sendRedirect(req.getContextPath()+"/Jsf Invoice System/Login.xhtml"); 


      } 


     } 

    } 

    /** 
    * @see Filter#init(FilterConfig) 
    */ 
    public void init(FilterConfig fConfig) throws ServletException { 
     // TODO Auto-generated method stub 
    } 

} 

我应该改变我的URL模式完全我没有想法如何着手

我的登录bean类是

package com.invoice; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 

import javax.faces.bean.SessionScoped; 
import javax.faces.context.FacesContext; 
import javax.servlet.http.HttpSession; 

@SessionScoped 
public class login { 

    String username,userpassword,errormess,navipg; 

    boolean isLoggedIn; 

    public boolean isLoggedIn() { 
     return isLoggedIn; 
    } 

    public void setLoggedIn(boolean isLoggedIn) { 
     this.isLoggedIn = isLoggedIn; 
    } 

    public String getNavipg() { 
     return navipg; 
    } 

    public void setNavipg(String navipg) { 
     this.navipg = navipg; 
    } 

    public String getErrormess() { 
     return errormess; 
    } 

    public void setErrormess(String errormess) { 
     this.errormess = errormess; 
    } 

    public String getUsername() { 
     return username; 
    } 

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

    public String getUserpassword() { 
     return userpassword; 
    } 

    public void setUserpassword(String userpassword) { 
     this.userpassword = userpassword; 
    } 
    public String navigate() 
    { 
     try 
     { 

      Class.forName("oracle.jdbc.driver.OracleDriver"); 
      Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","invoice","google"); 
      Statement stmt=con.createStatement(); 
      ResultSet rs=stmt.executeQuery("select username,password from usertable where username='"+username+"' and password='"+userpassword+"' "); 
      if(rs.next()) 
      { 

       setErrormess(""); 
       FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("uname",this.username); 
       navipg="invoiceinfo"; 
       setLoggedIn(true); 


      } 
      else 

      { 

       setErrormess("Invalid Login credentials"); 
       username=""; 
       navipg="Login"; 
       setLoggedIn(false); 

      } 

     } 
     catch(Exception e) 
     { 

      e.printStackTrace(); 

     } 
     return navipg; 

    } 
    public String logout() 
    { 

     FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); 
     setLoggedIn(false); 
      return "Login"; 

    } 




} 

但我调试,并检查它实际上执行不在这里输入

String url="/Login.xhtml"; 
    if(req.getRequestURI().equals(url)) 

行号50在过滤器没有得到执行我什至变编这样

String url="/Jsf Invoice System/Login.xhtml"; 
     if(req.getRequestURI().equals(url)) 

请帮帮我,给了这个问题

的解决方案有此链接一看: Filter for User Session Check in JSF 2.0