2013-07-02 57 views
1

当会话没有打开或关闭时,我想重定向到起始页面。我添加了Servlet过滤器,但它不起作用。Servlet过滤器无法正常工作

SessionFilter类:

public class SessionFilter implements Filter { 

    private ArrayList<String> urlList; 

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { 
     HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) resp; 
     String url = request.getServletPath(); 
     HttpSession session = request.getSession(false); 

     if (new Bean().getLoggedIn() || urlList.contains(url) || session != null){ 
      chain.doFilter(req, resp); 
     } 
     else{ 
      response.sendRedirect("index.jsf"); 
     } 
    } 

    public void init(FilterConfig config) throws ServletException { 
     String urls = config.getInitParameter("avoid-urls"); 
     StringTokenizer token = new StringTokenizer(urls, ","); 

     urlList = new ArrayList<String>(); 

     while (token.hasMoreTokens()) { 
      urlList.add(token.nextToken()); 

     } 
    } 

    public void destroy() { 
    } 

} 


web.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
      http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
      version="2.5"> 
    <filter> 
     <filter-name>SessionFilter</filter-name> 
     <filter-class>com.tsystems.demail.SessionFilter</filter-class> 
     <init-param> 
      <param-name>avoid-urls</param-name> 
      <param-value>/index.jsf, /registration.jsf</param-value> 
     </init-param> 
    </filter> 

    <filter-mapping> 
     <filter-name>SessionFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <welcome-file-list> 
     <welcome-file>index.jsf</welcome-file> 
    </welcome-file-list> 
</web-app> 

当我登录new Bean().getLoggedIn()是真的。注销时 - false。如何更改我的过滤器?我哪里有错误?

+3

什么是豆子?你的意思是每创建一个新的*时间? –

+1

“但它不起作用”它不起作用,它根本不重定向,它重定向到错误的页面,你得到一个HTTP 500,没有任何反应,什么?根据调试器的判断,else块中的代码是否可以执行?请详细说明,谢谢。 – Keith

+0

@DaveNewton我的Bean类:http://pastebin.com/EKU1d0EY – rubaka

回答

0

注意 response.sendRedirect是( “index.jsf”)

需要相对路径作为其参数。因此,假设index.jsf位于Web应用程序的根目录中,则可能需要使用值“/index.jsf”(以正斜杠开始)来处理各级别的重定向。如果没有,像这样的网址:

/folder1/folder2/somePage.jsf 

将被重定向到

/folder1/folder2/index.jsf 

,而不是

/index.jsf 
+0

我得到了相同的结果 – rubaka

+0

您是否已验证您的else块中的重定向行是否已实际到达?通过使用调试器或日志语句? – Keith

+0

我确定没关系 – rubaka

0

我想你应该尝试:

response.sendRedirect(request.getContextPath() + "/index.jsf"); 

相反作者:

response.sendRedirect("index.jsf"); 

但请检查下面的例子:

我的登录方法假定,我把当前用户的会话,使用户在连接时,我可以得到不空对象!

方法登录:

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 

Map<String, Object> sessionMap = externalContext.getSessionMap(); 

sessionMap.put("User", wantConnect); 

现在,如果用户试图访问某些网页与url-pattern的成员http://www.domain.com/member/ ......,下面的过滤器被调用。

@WebFilter("/member/*") 
public class RequestInterceptor implements Filter { 

public void init(FilterConfig filterConfig) throws ServletException { 

} 

@Override 
public void doFilter(ServletRequest req, ServletResponse res, 
     FilterChain chain) throws ServletException, IOException { 

     HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 
     HttpSession session = request.getSession(); 

     if (session == null || session.getAttribute("User") == null) { 
      response.sendRedirect(request.getContextPath() + "/index.xhtml"); // No logged-in user found, so redirect to login page. 
     } else { 
      chain.doFilter(req, res); // Logged-in user found, so just continue request. 
     } 




} 

@Override 
public void destroy() { 
    // Cleanup global variables if necessary. 
} 

}

这里我的web.xml

<filter> 
    <description>Requires user to log in as a member</description> 
    <filter-name>RequestInterceptor</filter-name> 
    <filter-class>fr.atoswg.peu.security.RequestInterceptor</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>RequestInterceptor</filter-name> 
    <url-pattern>/member/*</url-pattern> 
</filter-mapping> 

希望它帮助:)!