IT

서비스 경로없이 요청 URI를 얻는 방법은 무엇입니까?

lottoking 2020. 7. 17. 07:49
반응형

서비스 경로없이 요청 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())

봄으로 할 수있는 일 :

String path = new UrlPathHelper().getPathWithinApplication(request);

getPathInfo ()는 null을 반환합니다. 문서에서 HttpServletRequest

추가 경로 정보가없는 경우이 메소드는 널을 리턴합니다.

필터에 많은 경로가없는 파일 경로가 필요하고 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'을 제거 할 수 있습니다.

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

반응형