2012-05-22 3 views
1

Filter을 사용하여 일부 페이지에 액세스하려는 사용자에게 강제로 로그인을 시도하고 있습니다.인덱스를 제외한 모든 페이지에서 서블릿 필터 사용

그래서 내 Filter은 세션이없는 오류 페이지로 리디렉션해야합니다.

그러나 색인 페이지에 로그인 할 수 있기 때문에 방문하는 사용자가 index.html에 방문하는 것을 원하지 않습니다.

그래서 /index.xhtml을 제외한 모든 페이지와 일치하는 URL 패턴이 필요합니다.

어떻게하면됩니까? 내 web.xml에 정규식을 사용할 수 있습니까?

편집 : 내 doFilter() 방법

if (!req.getRequestURI().matches("((!?index)(.*)\\.xhtml)|((.*)\\.(png|gif|jpg|css|js(\\.xhtml)?))")) 

,하지만 여전히 모든 것을 처리합니다

this

을 읽은 후 나는 같은 것을 할 수 있다고 생각.

정규식이 온라인으로 테스트되었고 필터링 할 필요가없는 파일과 일치하기 때문에 정규식이 작동하지만 제외 된 파일에 대해서도 if 내용이 실행됩니다.

수정 2 :

나는 새로운 방식을 시도하고 있습니다.

필터를 *.xhtml에 내 web.xml에 매핑 했으므로 위 정규식을 사용하여 CSS, 이미지 및 자바 스크립트를 제외 할 필요가 없습니다.

여기합니다 (doFilter()에) 새로운 코드

if (req.getRequestURI().contains("index")) { 
    chain.doFilter(request, response); 
} else { 
    if (!userManager.isLogged()) { 
     request.getRequestDispatcher("error.xhtml").forward(request, response); 
    } else { 
     chain.doFilter(request, response); 
    } 
} 

이다하지만이 모든 페이지에 (만약 외부에서)를 chain.doFilter()를 호출하기 때문에 여전히하지 않습니다.

색인 페이지를 필터링하지 않도록 제외하려면 어떻게합니까?

답변

5

web.xml URL 패턴은 정규 표현식을 지원하지 않습니다. /faces/**.xhtml과 같이 일치하는 와일드 카드 접두사 (폴더) 및 접미사 (확장자) 만 지원합니다.

구체적인 문제는 분명히 <welcome-file>으로 정의 된 색인 파일이며 /으로 열었습니다. 이렇게하면 request.getRequestURI()/contextpath/이되며 /contextpath/index.xhtml이 아닙니다. request.getRequestURI()을 디버그하여 필터가 실제로 검색 한 내용을 확인하십시오.

String path = request.getRequestURI().substring(request.getContextPath().length()); 

if (userManager.isLogged() || path.equals("/") || path.equals("/index.xhtml") || path.startsWith(ResourceHandler.RESOURCE_IDENTIFIER)) { 
    chain.doFilter(request, response); 
} else { 
    request.getRequestDispatcher("/WEB-INF/error.xhtml").forward(request, response); 
} 

지도 /*에이 필터 :

나는 재 작성을 제안한다.<h:outputStylesheet>, <h:outputScript><h:graphicImage> 같은 JSF 자원도 생략됩니다 사용자가 로그인하지 않았을 때, 그렇지 않으면 당신은 CSS/JS/이미지없이 인덱스 페이지와 끝까지 그래서 나는 ResourceHandler.RESOURCE_IDENTIFIER 검사를 포함합니다.

주를이 FacesServlet*.xhtml의 URL 패턴에 매핑되어 있다고 가정합니다. 그렇지 않으면 path에 따라 /index.xhtml 점검을 변경해야합니다.

+0

내 색인 페이지는 환영 파일로 설정되어 있지만'request.getRequestURI()'는'/ contextpath/index.xhtml'을 출력하므로 이것이 이상하게 보입니다. 제 솔루션을 최대한 빨리 시도해 보겠습니다. – StepTNT

관련 문제