서블릿 필터를 사용하여 수신 서블릿 요청 URL을 변경하는 방법
http://nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123
에
http://nm-java.appspot.com/Check_License?Contact_Id=My_Obj_123
?
업데이트 : 아래 BalusC의 단계에 따라 다음 코드를 생각해 냈습니다.
public class UrlRewriteFilter implements Filter {
@Override
public void init(FilterConfig config) throws ServletException {
//
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
String requestURI = request.getRequestURI();
if (requestURI.startsWith("/Check_License/Dir_My_App/")) {
String toReplace = requestURI.substring(requestURI.indexOf("/Dir_My_App"), requestURI.lastIndexOf("/") + 1);
String newURI = requestURI.replace(toReplace, "?Contact_Id=");
req.getRequestDispatcher(newURI).forward(req, res);
} else {
chain.doFilter(req, res);
}
}
@Override
public void destroy() {
//
}
}
관련 항목은 web.xml
다음과 같습니다.
<filter>
<filter-name>urlRewriteFilter</filter-name>
<filter-class>com.example.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>urlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
예상 결과로 서버 측 및 클라이언트 측 리디렉션을 모두 시도했습니다. BalusC 덕분에 효과가있었습니다!
답변
- 구현
javax.servlet.Filter
. - 에서
doFilter()
방법, 수신 캐스트ServletRequest
에를HttpServletRequest
. HttpServletRequest#getRequestURI()
경로를 잡는 데 사용 합니다.- , 등의 간단한
java.lang.String
방법 을 사용하여 관심있는 부분을 추출하고 새 경로를 작성하십시오.substring()
split()
concat()
- 둘 중 하나를 사용하십시오
ServletRequest#getRequestDispatcher()
다음RequestDispatcher#forward()
새 URL (브라우저의 주소 표시 줄에 반영되지 서버 측 리디렉션)에 대한 요청 / 응답을 전달에 또는 캐스트 수신을ServletResponse
에HttpServletResponse
다음HttpServletResponse#sendRedirect()
에 반영 새로운 URL에 대한 응답 (클라이언트 측 리디렉션을, 리디렉션 브라우저 주소 표시 줄). - 에 필터를 등록
web.xml
온url-pattern
의/*
나/Check_License/*
, 컨텍스트 경로에 따라, 또는 이미 서블릿 3.0 인 경우, 사용@WebFilter
하는 대신에 대한 주석을.
URL 을 변경 해야하는 경우 코드에 확인을 추가 하고을 호출 하지 않으면 을 호출하십시오 FilterChain#doFilter()
. 그렇지 않으면 무한 루프로 자체 호출됩니다.
또는 기존 타사 API를 사용하여 다음과 같은 모든 작업을 수행 할 수도 있습니다. Apache의 작업 방식과 같이 구성 할 수있는 Tuckey ‘s UrlRewriteFilter 수도 있습니다 mod_rewrite
.
답변
다음 과 같은 규칙으로 바로 사용할 수있는 URL 재 작성 필터 를 사용할 수 있습니다 .
<rule>
<from>^/Check_License/Dir_My_App/Dir_ABC/My_Obj_([0-9]+)$</from>
<to>/Check_License?Contact_Id=My_Obj_$1</to>
</rule>
자세한 내용 은 예제 를 확인하십시오 .
답변
BalusC의 답변 단계에 기반한 간단한 JSF Url Prettyfier 필터 . 필터는 / ui 경로로 시작하는 모든 요청 (여기에 모든 xhtml 파일이 저장되어 있다고 가정)을 동일한 경로로 전달하지만 xhtml 접미사를 추가합니다.
public class UrlPrettyfierFilter implements Filter {
private static final String JSF_VIEW_ROOT_PATH = "/ui";
private static final String JSF_VIEW_SUFFIX = ".xhtml";
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpServletRequest = ((HttpServletRequest) request);
String requestURI = httpServletRequest.getRequestURI();
//Only process the paths starting with /ui, so as other requests get unprocessed.
//You can register the filter itself for /ui/* only, too
if (requestURI.startsWith(JSF_VIEW_ROOT_PATH)
&& !requestURI.contains(JSF_VIEW_SUFFIX)) {
request.getRequestDispatcher(requestURI.concat(JSF_VIEW_SUFFIX))
.forward(request,response);
} else {
chain.doFilter(httpServletRequest, response);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}