2011-12-20 3 views
29

특정 작업을 수행하기 위해 필터를 작성하고 있지만 필터에 특정 URL 패턴을 설정할 수 없습니다. 다음과 같이 내 필터 매핑은 다음과 같습니다 내가 기대했던대로web.xml URL 패턴에서 정규 표현식을 사용할 수 있습니까?

<web.xml> 
    <filter> 
    <filter-name>myFilter</filter-name> 
    <filter-class>test.MyFilter</filter-class> 
    </filter> 

    <filter-mapping> 
    <filter-name>myFilter</filter-name> 
    <url-pattern>/org/test/*/keys/*</url-pattern> 
    </filter-mapping> 
</web-app> 

내 URL 패턴 [ /org/test/ * /keys/ * ]가 작동하지 않습니다. 일치해야 필터 패턴 위의 URL에 따라서

http://localhost:8080/myapp/org/test/SuperAdminReport/keys/superAdminReport.jsp 
http://localhost:8080/myapp/org/test/Adminreport/keys/adminReport.jsp 
http://localhost:8080/myapp/org/test/OtherReport/keys/otherReport.jsp 

:

내가 좋아하는 브라우저에서 URL을 호출하고있다. 이것을 어떻게 할 수 있습니까?

+3

아는 한, url 패턴에서는 특정 폴더의 내용 ('path/to/my/folder/*')이나 특정 확장자 ('.do') 만 사용할 수 있습니다. – bdares

+0

[이 질문에 수락 된 답변을 참조하십시오 (http://stackoverflow.com/q/26732/922954) – aishwarya

답변

6

유효한 URL 패턴이 아니기 때문에 URL이 작동하지 않습니다. 당신은 당신이 매핑이 포착되지 않습니다 사이에 와일드 카드를 적용하려고 경우에만 start 또는 end에서 와일드 카드를 적용 할 수 서블릿 매핑 web.xml에 다음과 같은 응답

URL spec

0

를 참조 할 수 있습니다.

3

작동하지 않습니다. 정규식을 사용할 수 없습니다. 응용 프로그램이 URL을 사용하십시오 :

http://localhost:8080/myapp/org/test/keys/SuperAdminReport/superAdminReport.jsp 
http://localhost:8080/myapp/org/test/keys/Adminreport/adminReport.jsp 
http://localhost:8080/myapp/org/test/keys/OtherReport/otherReport.jsp 

그리고 당신의 web.xml을위한이 설정 :

<filter-mapping> 
    <filter-name>myFilter</filter-name> 
    <url-pattern>/org/test/keys/*</url-pattern> 
</filter-mapping> 
35

아니, 당신이 거기에 정규식을 사용할 수 없습니다. 다음과 같이 자바 서블릿 사양 V2.4 (섹션 srv.11.1)에 따르면, URL 경로가 해석됩니다

  • 하는 문자열에 '/'문자로 시작하고 끝나는 '/ *' 경로 매핑에 접미사가 사용됩니다.
  • '*.'접두사로 시작하는 문자열이 확장명 매핑으로 사용됩니다.
  • '/'문자 만 포함 된 문자열은 응용 프로그램의 "기본"서블릿을 나타냅니다. 이 경우 서블릿 경로는 요청 URI에서 텍스트 경로를 뺀 경로 정보이며 null입니다.
  • 다른 모든 문자열은 일치 검색에만 사용됩니다.

정규식이 없습니다. 복잡한 와일드 카드조차도 아닙니다.

0

url-pattern은 와일드 카드 문자로 시작하거나 끝나기 때문에 앞의 응답은 옳았으며 regex의 진정한 힘은 사용할 수 없습니다.

그러나 이전 프로젝트에서 모든 요청을 차단하는 간단한 기본 필터를 만들고 필터에 추가 논리를 적용할지 여부를 결정하는 정규식을 포함하여이 문제를 해결했습니다. 나는이 방법으로 성능 저하가 거의 없거나 거의 없다는 것을 발견했다.

다음은 정규식 패턴을 필터 속성으로 이동하여 향상시킬 수있는 간단한 예입니다.

웹 내의 필터 구성.XML :

<filter> 
    <filter-name>SampleFilter</filter-name> 
    <filter-class>org.test.SampleFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>SampleFilter</filter-name> 
    <servlet-name>SampleServlet</servlet-name> 
</filter-mapping> 
<servlet-mapping> 
    <servlet-name>SampleServlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 
(죄송합니다, 봄의 OncePerRequestFilter의 부모 클래스 사용합니다) 어떤 정규식 패턴을 사용할 수

기본 필터 구현 : 정규 표현식 매칭으로 필터링 할 방법이 없습니다

public class SampleFilter extends OncePerRequestFilter { 

    @Override 
    final protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { 
     if (applyLogic(request)) { 
      //Execute desired logic; 
     } 

     filterChain.doFilter(request, response); 
    } 

    protected boolean applyLogic(HttpServletRequest request) { 
     String path = StringUtils.removeStart(request.getRequestURI(), request.getContextPath()); 

     return PatternMatchUtils.simpleMatch(new String[] { "/login" }, path); 
    } 
} 
8

다른 사람에 의해 언급 한 바와 같이 기본 서블릿 필터 기능 만 사용합니다. 서블릿 스펙은 url의 효율적인 매칭을 허용하는 방식으로 작성 될 것이고 서블릿은 java (정규 표현식이 Java 1.4에 도착한)에서 정규 표현식의 가용성보다 선행하기 때문에 서블릿 스펙이 작성 될 가능성이 높습니다.

정규 표현식은 가능성 (아니, 난 그것을 벤치마킹하지 않은 경우) 덜 성능이 좋은 것,하지만 당신은 강력하게 시간을 처리하여 제약 및 구성의 용이성을 위해 성능을 거래하고자하지 않으면 당신은 이런 식으로 작업을 수행 할 수 있습니다

을 필터에서

: web.xml에 다음

private String subPathFilter = ".*"; 
private Pattern pattern; 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
    String subPathFilter = filterConfig.getInitParameter("subPathFilter"); 
    if (subPathFilter != null) { 
     this.subPathFilter = subPathFilter; 
    } 
    pattern = Pattern.compile(this.subPathFilter); 
    } 

    public static String getFullURL(HttpServletRequest request) { 
    // Implement this if you want to match query parameters, otherwise 
    // servletRequest.getRequestURI() or servletRequest.getRequestURL 
    // should be good enough. Also you may want to handle URL decoding here. 
    } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
    Matcher m = pattern.matcher(getFullURL((HttpServletRequest) servletRequest)); 
    if (m.matches()) { 

     // filter stuff here. 

    } 
    } 

...

<filter> 
    <filter-name>MyFiltersName</filter-name> 
    <filter-class>com.konadsc.servlet.MyFilter</filter-class> 
    <init-param> 
     <param-name>subPathFilter</param-name> 
     <param-value>/org/test/[^/]+/keys/.*</param-value> 
    </init-param> 
    </filter> 
    <filter-mapping> 
    <filter-name>MyFiltersName</filter-name> 
    <url-pattern>/*</url-pattern> 
    </filter-mapping> 

if 문을 doFilter()으로 바꾸거나 패턴을 제외시키기 위해 다른 초기화 매개 변수를 추가하는 방법으로 독자가 연습 문제로 남겨 두는 경우가 종종 있습니다.