서브맵을 포함하지 않는 필터 매핑을 만들 수있는 방법이 있습니까?서브맵을 제외하는 필터 매핑 url-pattern
예를 들면.
내 컨텍스트 루트에 .xhtml 파일이 있고 동일한 확장자를 가진 파일에 "test"라는 하위 폴더가 있습니다. "test"디렉토리에있는 파일이 아닌 컨텍스트 루트에있는 파일에 필터를 매핑 할 수 있습니까?
서브맵을 포함하지 않는 필터 매핑을 만들 수있는 방법이 있습니까?서브맵을 제외하는 필터 매핑 url-pattern
예를 들면.
내 컨텍스트 루트에 .xhtml 파일이 있고 동일한 확장자를 가진 파일에 "test"라는 하위 폴더가 있습니다. "test"디렉토리에있는 파일이 아닌 컨텍스트 루트에있는 파일에 필터를 매핑 할 수 있습니까?
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()
방법에 기본적으로 다음과 같은 작업을 수행 *.xhtml
의 url-pattern
에 듣고 Filter
입니다 컨텍스트 경로의 요청 URI 부분.
/test
값을 필터의 <init-param>
으로 구성하면 필터 코드 대신 web.xml
내부에서 값을 제어 할 수 있습니다.
일부 컨테이너 (레진과 같은)는 정규 표현식을 기반으로 URL을 일치시킬 수있는 url-regexp
을 지정할 수있는 web.xml의 필터 매핑 정의에 대한 확장을 정의합니다. (reference). 컨테이너에 이와 비슷한 것이 있는지 확인하십시오.
*.ext
스타일 매핑에 하위 디렉토리가 있기 때문에 표준 서블릿/필터에서 사용할 수있는 것을 사용하면 서브 디렉토리를 직접 제외 할 수 없습니다. /test/*.xhtml
매핑을 특별히 처리하는 다른 필터를 선언하고 그에 따라 처리 할 수 있습니다.
그러나 매핑이있는 필터/*는 여전히/test 아래에있는 모든 것을 포함 할 것인가? –
맞습니다. 일치하는 첫 번째 것이 사용 된 것이라고 생각했지만 그렇지 않습니다. 대신 필터에 url 정규 표현식을 추가 할 수 있습니다. 정규 표현식과 일치하면 필터는 재 작성 필터 체인에 위임하기 전에 작업을 수행합니다. 정규식이 일치하지 않으면 작업을 수행하지 않고 필터 체인에 위임합니다. – mdma
솔루션, 기본적으로 당신은 당신의 자신의 필터 클래스를 필요로하고 필터
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>
죄송합니다. 첫 번째 게시물입니다. 형식을 수정하는 데 약 30 분이 걸립니다. 해결책은 기본적으로 필터 클래스가 필요하며 필터의 init-param으로 URL을 제외 시키도록 정의합니다. – softskin
컨텍스트 루트에있는 모든 파일에 대해 URL 매핑 값을 추가 할 수 있습니다. 따라서 필터는 해당 파일에만 적용되지만 테스트 폴더에있는 파일에는 적용되지 않습니다. 실제로는 특정 파일에만 적용됩니다. 다음은 나를 위해 일했다
<url-pattern>/index.faces</url-pattern>
먼저 필터에 하드 코딩 된 것으로 생각하십니까? init-param은 똑똑합니다. 여기에서 뭔가를 배웠습니다. – JoseK
@Jose : 천만에요. – BalusC