2013-07-02 4 views
1

Я хочу получить перенаправление на стартовую страницу, когда сеанс не открыт или закрыт. Я добавил Servlet Filter, но он не работает.Сервлет Фильтр не работает

Мой 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() верно. Когда logout - false. Как изменить фильтр? Где у меня ошибка?

+3

Что такое «Бин»? Вы хотите создать новое одно * время *? –

+1

«но он не работает». Как он не работает, он не перенаправляет вообще, он перенаправляет на неверную страницу, вы получаете HTTP 500, ничего не происходит, что? Выполняется ли код в блоке else вообще, как определено отладчиком? Более подробно пожалуйста, спасибо. – Keith

+0

@DaveNewton мой класс Bean: http://pastebin.com/EKU1d0EY – rubaka

ответ

0

Обратите внимание, что response.sendRedirect ("index.jsf")

принимает относительный путь в качестве аргумента. Итак, если предположить, что index.jsf находится в корне вашего веб-приложения, вы, вероятно, захотите использовать значение «/index.jsf» (начинается с косой черты) для обработки перенаправлений на всех уровнях. Если нет, URL, как это:

/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-шаблон, такие как 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> 

Надеется, что это поможет :)!

Смежные вопросы