2015-01-23 2 views
0

Я использую Tomcat 7. Моя проблема заключается в том, что не вошедшие в систему пользователи не должны видеть определенную страницу (home.xhtml в моем случае), но должны быть перенаправлены на страницу входа. Поведение: 1. Если приложение только что началось и никто не пробовал войти в систему, можно получить прямой доступ к странице с ограничениями. 2. Если кто-то вошел в систему и вышли из, и после этого попытались получить доступ к упомянутой home.xhtml, браузер показывает страницу с ошибками (в то время как он должен перенаправить на страницу входа в систему):Можете увидеть защищенную страницу, пока вы не вошли в систему

An Error Occurred: 

viewId:/home.xhtml - View /home.xhtml could not be restored. 
- Stack Trace 

javax.faces.application.ViewExpiredException: viewId:/home.xhtml - View /home.xhtml could not be restored. 
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:205) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 
+ Component Tree 

+ Scoped Variables 

Jan 22, 2015 8:57:04 PM - Generated by Mojarra/Facelets 

Мои рожи-конфигурации .xml:

<?xml version='1.0' encoding='UTF-8'?> 
<faces-config version="2.0" 
    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-facesconfig_2_0.xsd"> 
    <navigation-rule> 
     <from-view-id>/login.xhtml</from-view-id> 
     <navigation-case> 
      <from-outcome>home</from-outcome> 
      <to-view-id>/home.xhtml</to-view-id> 
     <redirect>  
     </redirect> 
     </navigation-case> 
</navigation-rule> 
</faces-config> 

web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.0" 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_3_0.xsd"> 
    <context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value>Development</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> 
    <session-config> 
     <session-timeout> 
      30 
     </session-timeout> 
    </session-config> 
    <welcome-file-list> 
     <welcome-file>login.xhtml</welcome-file> 
    </welcome-file-list> 
</web-app> 

Фильтр:

public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) { 

      HttpServletRequest req = (HttpServletRequest) request; 
      HttpServletResponse res = (HttpServletResponse) response; 
      HttpSession session = req.getSession(); 
      String reqURI = req.getRequestURI(); 
      if (reqURI.indexOf("/login.xhtml") >= 0 
        || (session != null && session.getAttribute("username") != null) 
        || reqURI.indexOf("/public/") >= 0 
        || reqURI.contains("javax.faces.resource")) 
       try { 
        chain.doFilter(request, response); 
       } catch (IOException e) { 
        System.out.println("IO exc after doFilter"); 
       } catch (ServletException e) { 
        System.out.println("Servlet exc after doFilter"); 
       } 
      else 
       try { 
        res.sendRedirect(req.getContextPath() + "/login.xhtml"); 
       } catch (IOException e) { 
        System.out.println("IO exc after redirect"); 
       } 

    } 

Что случилось? BTW ни один из моих sysouts в ловушках не напечатан, поэтому исключения находятся где-то глубоко.

EDIT 1: Я нашел ответ на часть моего вопроса, связанного с исключением here, но я до сих пор путают, пока она показывает страницу она не должна ...

+0

Является ли это приемлемым, как дубликат? http://stackoverflow.com/questions/4194207/prevent-user-from-going-back-to-the-previous-secured-page-after-logout/ Здесь вы можете найти более обширный пример фильтра ограничения доступа http : //stackoverflow.com/questions/14580267/authorization-redirect-on-session-expiration-does-not-work-on-submitting-a-jsf-f/ – BalusC

+0

Проблема не в кеше, я попробовал полностью чистый браузер , Проблема в другом месте ... –

+0

Я не говорил о 'ViewExpiredException' :) – BalusC

ответ

0

Я решил эту загадку ... Я просто не заполнил фильтр в web.xml. Я не знал, что это должно быть сделано, потому что это мой первый тестовый проект. Таким образом, web.xml должен содержать в моем случае:

<filter> 
    <filter-name>AuthFulter</filter-name> 
    <filter-class>com.demshin.beans.AuthFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>AuthFulter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
0

Вы пробовали проверки ! session.getAttribute ("имя пользователя"). IsEmpty(). Строки передаются как пустые строки, а не конвертируются в Null. Я бы также добавил, если содержит имя пользователя yo, если он присутствует в атрибутах сеанса перед выполнением проверки Null и isEmpty.

+0

Фактически, в этом случае он должен быть нулевым, а не« ", поэтому проверка'! = Null' достаточно. Вы можете попробовать себя. –

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