반응형
Java에서 servlet 필터를 사용하여 들어오는 servlet 요청 URL을 변경하는 방법?
서블릿 필터를 사용하여 수신 서블릿 요청 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>
서버측과 클라이언트측 리디렉션을 모두 예상된 결과로 시도했다.잘 됐어, 발루시 고마워!
- 구현하다.
- 메소드에서 수신인을 에 캐스팅하십시오.
- 길을 잡을 때 사용한다.
- , , 등과 같은 간단한 방법을 사용하여 관심 부분을 추출하고 새 경로를 구성하십시오.
- 사용 중 ServletRequest#getRequestDispatcher() 다음 RequestDispatcher#forward() 새로운 URL(SSI는 다시 잠시 동안 재전송, 브라우저 주소 표시줄에 반영되지 않), 또는 HttpServletResponse에 들어오는 ServletResponse를 요청/응답에 포워드 된 다음 HttpServletResponse#sendRedirect() 새로운 URL(클라이언트 sid에 대한 응답을 리디렉션 합니다.E리다이렉트, 브라우저 주소 표시줄에)영향을 미친다.
- 필터 등록 위치
web.xml
…에.url-pattern
의/*
또는/Check_License/*
, 컨텍스트 경로에 따라 또는 이미 서블릿 3.0에 있는 경우 대신 주석을 사용하십시오.
URL을 변경해야 하는 경우 코드에 수표를 추가하는 것을 잊지 말고, 그렇지 않은 경우 그냥 호출하고, 그렇지 않으면 무한 루프에서 자신을 호출한다.
또는 기존 타사 API를 사용하여 모든 작업을 수행할 수도 있으며, 예를 들어 Apache의 UrlRewriteFilter와 같이 구성할 수 있다.mod_rewrite
.
다음 규칙과 함께 Url Rewrite Filter를 사용할 준비가 된 규칙을 사용할 수 있다.
<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 Pretyfier 필터.필터는 /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 {
}
}
나의 경우 봄을 사용하고 어떤 이유에서인지forrward
나와 함께 일하지 않았기 때문에 나는 다음과 같이 했다.
public class OldApiVersionFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
if (httpServletRequest.getRequestURI().contains("/api/v3/")) {
HttpServletRequest modifiedRequest = new HttpServletRequestWrapper((httpServletRequest)) {
@Override
public String getRequestURI() {
return httpServletRequest.getRequestURI().replaceAll("/api/v3/", "/api/");
}
};
chain.doFilter(modifiedRequest, response);
} else {
chain.doFilter(request, response);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void destroy() {}
}
modifiedRequest를 연결하십시오.
반응형
'IT이야기' 카테고리의 다른 글
ANSI C와 K&R C의 주요 차이점은 무엇인가? (0) | 2022.05.05 |
---|---|
문자열의 마지막 문자를 얻는 방법은? (0) | 2022.05.05 |
$emit를 동기식 모드로 실행하고 excast 이벤트에서 결과를 다시 얻을 수 있는가? (0) | 2022.05.05 |
Eclipse 복사/붙여넣기 전체 줄 바로 가기 키 (0) | 2022.05.05 |
돌연변이를 통해 상태 속성을 동적으로 추가하는 방법 (0) | 2022.05.05 |