[java] 컨텍스트 경로없이 요청 URI를 얻는 방법은 무엇입니까?

request.getRequestURI () 메서드 는 컨텍스트 경로와 함께 URI를 반환합니다.

응용 프로그램의 기본 URL 인 경우 예를 들어, http://localhost:8080/myapp/(즉, 컨텍스트 경로는 MyApp를 ) 내가 전화 request.getRequestURI()를 위해 http://localhost:8080/myapp/secure/users, 그것은 반환합니다 /myapp/secure/users.

이 부분 /secure/users, 즉 컨텍스트 경로가없는 URI 만 얻을 수있는 방법이 있습니까?



답변

접두사 패턴에 매핑 된 프런트 컨트롤러 서블릿 내부에있는 경우 HttpServletRequest#getPathInfo().

String pathInfo = request.getPathInfo();
// ...

예제의 서블릿이에 매핑되었다고 가정하면 일반적인 프론트 컨트롤러 서블릿 내에서 유일한 관심 정보 /secure가 반환됩니다 /users.

그러나 서블릿이 접미사 패턴에 매핑 된 경우 (URL 예제는 이것이 사실임을 나타내지 않음) 또는 실제로 필터 내부에있을 때 (호출 될 서블릿이 아직 결정되지 않은 경우) getPathInfo())를 반환 할 수있는 경우 null가장 좋은 방법은 일반적인 String방법을 사용하여 컨텍스트 경로의 길이를 기반으로 요청 URI를 직접 부분 문자열로 지정하는 것입니다 .

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 ()를 사용하면 항상 null을 얻는 것처럼 보입니다 (적어도 부두에서는).

이 간결한 잘못된 버그 + 응답은 내가 생각하는 문제를 암시합니다.

https://issues.apache.org/bugzilla/show_bug.cgi?id=28323

서블릿이 요청을 받기 전에 필터가 실행된다는 사실과 관련이 있다고 생각합니다. 컨테이너 버그이거나 내가 식별 할 수없는 예상 된 동작 일 수 있습니다.

하지만 contextPath를 사용할 수 있으므로 fforws 솔루션은 필터에서도 작동합니다. 손으로해야하는 것은 싫지만 구현이 깨 졌거나


답변

이를 수행하는 방법은 요청 URI에서 서블릿 컨텍스트 경로를 휴식하는 것입니다.

String p = request.getRequestURI();
String cp = getServletContext().getContextPath();

if (p.startsWith(cp)) {
  String.err.println(p.substring(cp.length());
}

여기에서 읽으 십시오 .


답변

예를 들어 ‘/ myapp’을 제거하기 위해 split 메소드를 사용할 수 있습니다.

string[] uris=request.getRequestURI().split("/");
string uri="/"+uri[1]+"/"+uris[2];