컨텍스트 경로 없이 요청 URI를 얻는 방법
Method request.getRequestURI()는 컨텍스트 경로를 가진 URI를 반환합니다.
예를 들어 응용 프로그램의 기본 URL이http://localhost:8080/myapp/
(즉, 콘텍스트 패스가 myapp입니다)를 호출합니다.request.getRequestURI()
위해서http://localhost:8080/myapp/secure/users
, 그것은 돌아옵니다./myapp/secure/users
.
이 부품만 구할 수 있는 방법은 없나요?/secure/users
예를 들어 컨텍스트 경로가 없는 URI를 선택하십시오.
다음과 같은 프리픽스 패턴으로 매핑된 프론트컨트롤러 서블릿 내부에 있는 경우/foo/*
를 사용하면 됩니다.
String pathInfo = request.getPathInfo();
// ...
이 예의 서블릿이 매핑되어 있다고 가정합니다./secure/*
이 경우 이 값이 반환됩니다./users
일반적인 프론트 컨트롤러 서블릿 내부의 유일한 관심 정보입니다.
그러나 서블릿이 다음과 같은 접미사 패턴에 매핑되어 있는 경우*.foo
(다만, URL 예에서는, 이러한 경우는 표시되지 않습니다), 또는 실제로 필터내에 있는 경우(실제로 기동하는 서블릿이 반드시 특정되어 있지 않은 경우).getPathInfo()
돌아올 수 있다null
)의 경우 통상적인 콘텍스트 패스의 길이에 따라 요구 URI를 직접 서브스트링하는 것이 가장 좋습니다.String
방법:
HttpServletRequest request = (HttpServletRequest) req;
String path = request.getRequestURI().substring(request.getContextPath().length());
// ...
request.getRequestURI().substring(request.getContextPath().length())
Spring을 사용하면 다음 작업을 수행할 수 있습니다.
String path = new UrlPathHelper().getPathWithinApplication(request);
getPathInfo()는 null을 반환할 수 있습니다.문서 HttpServletRequest에서
이 메서드는 추가 경로 정보가 없는 경우 null을 반환합니다.
필터에 컨텍스트 경로가 없는 파일에 대한 경로를 가져와 getPathInfo()가 null을 반환해야 합니다.그래서 다른 메서드 httpRequest.getServletPath()를 사용합니다.
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String newPath = parsePathToFile(httpRequest.getServletPath());
...
}
필터 내에서 request.getPathInfo()를 사용하면 (적어도 jetty에서는) 늘을 얻을 수 있습니다.
이 간단한 무효 버그 + 응답은 다음 문제를 시사합니다.
https://issues.apache.org/bugzilla/show_bug.cgi?id=28323
서블릿이 요청을 수신하기 전에 필터가 실행된다는 사실과 관련이 있는 것 같습니다.컨테이너 버그일 수도 있고 예상된 동작일 수도 있습니다.
contextPath는 사용할 수 있으므로 필터에서도 fforws 솔루션이 작동합니다.수작업으로 하는 것은 싫지만, 실장되어 있지 않거나,
이를 위해서는 request URI에서 servelet 컨텍스트패스를 rest 하는 방법이 있습니다.
String p = request.getRequestURI();
String cp = getServletContext().getContextPath();
if (p.startsWith(cp)) {
String.err.println(p.substring(cp.length());
}
여기를 읽어주세요.
분할 방법을 사용하면 다음과 같이 '/myapp'을 제거할 수 있습니다.
string[] uris=request.getRequestURI().split("/");
string uri="/"+uri[1]+"/"+uris[2];
언급URL : https://stackoverflow.com/questions/4278083/how-to-get-request-uri-without-context-path
'itsource' 카테고리의 다른 글
업데이트 후 Android Studio에서 리소스 오류 발생:리소스를 찾을 수 없습니다. (0) | 2022.09.14 |
---|---|
ORDERBY 사용 시 MySQL Slow JOIN 쿼리 (0) | 2022.09.14 |
String Builder를 루프에서 재사용하는 것이 좋습니까? (0) | 2022.09.14 |
목록의 마지막 항목을 삭제하려면 어떻게 해야 합니까? (0) | 2022.09.14 |
콘솔로 이동합니다.writline 및 System.out.println (0) | 2022.09.14 |