2010-08-12 2 views
6

서브맵을 포함하지 않는 필터 매핑을 만들 수있는 방법이 있습니까?서브맵을 제외하는 필터 매핑 url-pattern

예를 들면.

내 컨텍스트 루트에 .xhtml 파일이 있고 동일한 확장자를 가진 파일에 "test"라는 하위 폴더가 있습니다. "test"디렉토리에있는 파일이 아닌 컨텍스트 루트에있는 파일에 필터를 매핑 할 수 있습니까?

답변

17

url-pattern은 실제로 일치하는 데 제한이 있습니다. 정확한, 접두사 또는 접미사 matchnig 만 허용합니다. 중간/전체/정규식 일치가 아닙니다. 그래서 예. /*.xhtml 당신이하고자하는 것은 효과가 없을 것입니다.

// First cast ServletRequest to HttpServletRequest. 
HttpServletRequest hsr = (HttpServletRequest) request; 

// Check if requested resource is not in /test folder. 
if (!hsr.getServletPath().startsWith("/test/")) { 
    // Not in /test folder. Do your thing here. 
} 

HttpServletRequest#getServletPath() 기본적으로 반환 : 당신이 /test 폴더에 XHTML을 제외 할 경우

은, 당신의 가장 좋은 정말 doFilter() 방법에 기본적으로 다음과 같은 작업을 수행 *.xhtmlurl-pattern에 듣고 Filter입니다 컨텍스트 경로의 요청 URI 부분.

/test 값을 필터의 <init-param>으로 구성하면 필터 코드 대신 web.xml 내부에서 값을 제어 할 수 있습니다.

+1

먼저 필터에 하드 코딩 된 것으로 생각하십니까? init-param은 똑똑합니다. 여기에서 뭔가를 배웠습니다. – JoseK

+0

@Jose : 천만에요. – BalusC

-1

일부 컨테이너 (레진과 같은)는 정규 표현식을 기반으로 URL을 일치시킬 수있는 url-regexp을 지정할 수있는 web.xml의 필터 매핑 정의에 대한 확장을 정의합니다. (reference). 컨테이너에 이와 비슷한 것이 있는지 확인하십시오.

0

*.ext 스타일 매핑에 하위 디렉토리가 있기 때문에 표준 서블릿/필터에서 사용할 수있는 것을 사용하면 서브 디렉토리를 직접 제외 할 수 없습니다. /test/*.xhtml 매핑을 특별히 처리하는 다른 필터를 선언하고 그에 따라 처리 할 수 ​​있습니다.

+0

그러나 매핑이있는 필터/*는 여전히/test 아래에있는 모든 것을 포함 할 것인가? –

+0

맞습니다. 일치하는 첫 번째 것이 사용 된 것이라고 생각했지만 그렇지 않습니다. 대신 필터에 url 정규 표현식을 추가 할 수 있습니다. 정규 표현식과 일치하면 필터는 재 작성 필터 체인에 위임하기 전에 작업을 수행합니다. 정규식이 일치하지 않으면 작업을 수행하지 않고 필터 체인에 위임합니다. – mdma

3

솔루션, 기본적으로 당신은 당신의 자신의 필터 클래스를 필요로하고 필터

package test; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

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.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class LoginValidationFilter implements Filter { 

    private String loginPage = ""; 
    private List<String> excludedURLs; 

    public void init(FilterConfig filterConfig) throws ServletException { 
     this.loginPage = filterConfig.getInitParameter("loginPage"); 

     String[] excluded = filterConfig.getInitParameter("excludedURLs").split(";"); 
     excludedURLs = new ArrayList<String>(); 
     for (int i = 0; i < excluded.length; i++) { 
      excludedURLs.add(excluded[i]); 
     } 
    } 

    public void destroy() { 
     this.loginPage = ""; 
    } 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, 
      ServletException { 

     HttpServletRequest httpRequest = request instanceof HttpServletRequest ? (HttpServletRequest) request : null; 
     HttpServletResponse httpResponse = response instanceof HttpServletResponse ? (HttpServletResponse) response 
       : null; 

     if (httpRequest == null || httpResponse == null) { 
      filterChain.doFilter(request, response); 
      return; 
     } 

     boolean isExcludedURL = false; 
     for (int i = 0; i < excludedURLs.size(); i++) { 
      if (httpRequest.getRequestURL().indexOf(excludedURLs.get(i)) > -1) { 
       isExcludedURL = true; 
       break; 
      } 
     } 

     if (isExcludedURL) { 
      filterChain.doFilter(request, response); 
     } else { 
      if (UserUtil.validateUserLogin(httpRequest)) { 
       filterChain.doFilter(request, response); 
      } else { 
       httpResponse.sendRedirect(httpRequest.getContextPath() + loginPage); 
      } 
     } 
    } 
} 

에 대한 초기화-PARAM 등을 제외한 URL을 정의하고 필터, 매핑을 정의하고 web.xml 파일에 URL을 제외

<filter> 
    <filter-name>LoginValidationFilter</filter-name> 
    <filter-class>test.LoginValidationFilter</filter-class> 
    <init-param> 
     <param-name>loginPage</param-name> 
     <param-value>/login.jsp</param-value> 
    </init-param> 
    <init-param> 
     <param-name>excludedURLs</param-name> 
     <param-value>/admin/;/assets/;/content/;/css/;/js/;/login.jsp;/login.cmd;/logout.cmd;forgot_password.jsp;pageName=</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>LoginValidationFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
+0

죄송합니다. 첫 번째 게시물입니다. 형식을 수정하는 데 약 30 분이 걸립니다. 해결책은 기본적으로 필터 클래스가 필요하며 필터의 init-param으로 URL을 제외 시키도록 정의합니다. – softskin

0

컨텍스트 루트에있는 모든 파일에 대해 URL 매핑 값을 추가 할 수 있습니다. 따라서 필터는 해당 파일에만 적용되지만 테스트 폴더에있는 파일에는 적용되지 않습니다. 실제로는 특정 파일에만 적용됩니다. 다음은 나를 위해 일했다

<url-pattern>/index.faces</url-pattern>