source

URL을 완료하기 위한 HttpServletRequest

lovecheck 2022. 11. 8. 21:12
반응형

URL을 완료하기 위한 HttpServletRequest

나는 가지고 있다.HttpServletRequest물건.

이 콜이 서블릿에 착신하게 된 완전하고 정확한 URL을 취득하려면 어떻게 해야 합니까?

또는 가능한 한 정확하게 재생성할 수 있는 것(파라미터의 순서 등)이 있을 수 있습니다.

에는 다음 방법이 있습니다.

  • getRequestURL() - 쿼리 문자열 구분 문자 앞에 있는 전체 URL 부분을 반환합니다.?
  • getQueryString() - 쿼리 문자열 구분 문자 뒤에 전체 URL 부분을 반환합니다.?

따라서 전체 URL을 얻으려면 다음 작업을 수행합니다.

public static String getFullURL(HttpServletRequest request) {
    StringBuilder requestURL = new StringBuilder(request.getRequestURL().toString());
    String queryString = request.getQueryString();

    if (queryString == null) {
        return requestURL.toString();
    } else {
        return requestURL.append('?').append(queryString).toString();
    }
}

다음 방법을 사용합니다.

public static String getURL(HttpServletRequest req) {

    String scheme = req.getScheme();             // http
    String serverName = req.getServerName();     // hostname.com
    int serverPort = req.getServerPort();        // 80
    String contextPath = req.getContextPath();   // /mywebapp
    String servletPath = req.getServletPath();   // /servlet/MyServlet
    String pathInfo = req.getPathInfo();         // /a/b;c=123
    String queryString = req.getQueryString();          // d=789

    // Reconstruct original requesting URL
    StringBuilder url = new StringBuilder();
    url.append(scheme).append("://").append(serverName);

    if (serverPort != 80 && serverPort != 443) {
        url.append(":").append(serverPort);
    }

    url.append(contextPath).append(servletPath);

    if (pathInfo != null) {
        url.append(pathInfo);
    }
    if (queryString != null) {
        url.append("?").append(queryString);
    }
    return url.toString();
}
// http://hostname.com/mywebapp/servlet/MyServlet/a/b;c=123?d=789

public static String getUrl(HttpServletRequest req) {
    String reqUrl = req.getRequestURL().toString();
    String queryString = req.getQueryString();   // d=789
    if (queryString != null) {
        reqUrl += "?"+queryString;
    }
    return reqUrl;
}

Spring 프로젝트에서 사용할 수 있습니다.

UriComponentsBuilder.fromHttpRequest(new ServletServerHttpRequest(request)).build().toUriString()

HttpUtil이 폐지되었습니다.이것은 올바른 방법입니다.

StringBuffer url = req.getRequestURL();
String queryString = req.getQueryString();
if (queryString != null) {
    url.append('?');
    url.append(queryString);
}
String requestURL = url.toString();

및 의 결과를 조합하면 원하는 결과를 얻을 수 있습니다.

필터를 사용할 수 있습니다.

@Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
            HttpServletRequest test1=    (HttpServletRequest) arg0;

         test1.getRequestURL()); it gives  http://localhost:8081/applicationName/menu/index.action
         test1.getRequestURI()); it gives applicationName/menu/index.action
         String pathname = test1.getServletPath()); it gives //menu/index.action


        if(pathname.equals("//menu/index.action")){ 
            arg2.doFilter(arg0, arg1); // call to urs servlet or frameowrk managed controller method


            // in resposne 
           HttpServletResponse httpResp = (HttpServletResponse) arg1;
           RequestDispatcher rd = arg0.getRequestDispatcher("another.jsp");     
           rd.forward(arg0, arg1);





    }

잊지 말고 넣어 주세요<dispatcher>FORWARD</dispatcher>web.xml의 필터 매핑에서

HttpServletRequest 개체에서 다음 메서드를 사용합니다.

java.displaces를 클릭합니다.String getRequestURI() - 이 요청 URL의 일부를 프로토콜 이름에서 HTTP 요청의 첫 번째 줄에 있는 쿼리 문자열로 반환합니다.

java.displaces를 클릭합니다.StringBuffer getRequestURL() - 클라이언트가 요청을 작성하기 위해 사용한 URL을 재구성합니다.

java.displaces를 클릭합니다.String getQueryString() 경로 뒤에 요청 URL에 포함된 쿼리 문자열을 반환합니다.

파티에는 다소 늦었지만, WebUtilsMarkUtils-Web 라이브러리에 Checkstyle 승인 및 JUnit 테스트 완료:

import javax.servlet.http.HttpServletRequest;

public class GetRequestUrl{
    /**
     * <p>A faster replacement for {@link HttpServletRequest#getRequestURL()}
     *  (returns a {@link String} instead of a {@link StringBuffer} - and internally uses a {@link StringBuilder})
     *  that also includes the {@linkplain HttpServletRequest#getQueryString() query string}.</p>
     * <p><a href="https://gist.github.com/ziesemer/700376d8da8c60585438"
     *  >https://gist.github.com/ziesemer/700376d8da8c60585438</a></p>
     * @author Mark A. Ziesemer
     *  <a href="http://www.ziesemer.com.">&lt;www.ziesemer.com&gt;</a>
     */
    public String getRequestUrl(final HttpServletRequest req){
        final String scheme = req.getScheme();
        final int port = req.getServerPort();
        final StringBuilder url = new StringBuilder(256);
        url.append(scheme);
        url.append("://");
        url.append(req.getServerName());
        if(!(("http".equals(scheme) && (port == 0 || port == 80))
                || ("https".equals(scheme) && port == 443))){
            url.append(':');
            url.append(port);
        }
        url.append(req.getRequestURI());
        final String qs = req.getQueryString();
        if(qs != null){
            url.append('?');
            url.append(qs);
        }
        final String result = url.toString();
        return result;
    }
}

Mat Banik에 뒤지지 않는 가장 빠르고 견고한 답변일 것입니다.그러나 이 답변도 HTTP/HTTPS를 사용한 비표준 포트 구성에 대해서는 설명하지 않습니다.

다음 항목도 참조하십시오.

3진수를 사용하여 간단한 1개의 라이너를 작성할 수 있으며 StringBuffer의 빌더 패턴을 사용하는 경우.getRequestURL():

private String getUrlWithQueryParms(final HttpServletRequest request) { 
    return request.getQueryString() == null ? request.getRequestURL().toString() :
        request.getRequestURL().append("?").append(request.getQueryString()).toString();
}

하지만 그것은 단지 통사적인 설탕일 뿐이다.

요청이 전송될 때(예를 들어 리버스 프록시로부터)HttpServletRequest.getRequestURL()method는 전달된 URL을 반환하지 않고 로컬 URL을 반환합니다.언제?x-forwarded-*헤더가 설정되어 있기 때문에, 간단하게 처리할 수 있습니다.

public static String getCurrentUrl(HttpServletRequest request) {
    String forwardedHost = request.getHeader("x-forwarded-host");

    if(forwardedHost == null) {
        return request.getRequestURL().toString();
    }

    String scheme = request.getHeader("x-forwarded-proto");
    String prefix = request.getHeader("x-forwarded-prefix");

    return scheme + "://" + forwardedHost + prefix + request.getRequestURI();
}

이 부분에는 Query 부분이 없지만 다른 답변에서 예상한 대로 추가할 수 있습니다.제가 여기 온 이유는 특히 그 전달 자료가 필요해서 누군가 도와줄 수 있기 때문입니다.

http ServletRequest 인스턴스에서 cURL 명령어(단말기에서 사용할 수 있음)를 생성하는 유스케이스를 가지고 있습니다.저는 이런 방법을 하나 만들었습니다.이 메서드의 출력을 단말기에 직접 복사하여 붙여넣을 수 있습니다.

private StringBuilder generateCURL(final HttpServletRequest httpServletRequest) {
    final StringBuilder curlCommand = new StringBuilder();
    curlCommand.append("curl ");

    // iterating over headers.
    for (Enumeration<?> e = httpServletRequest.getHeaderNames(); e.hasMoreElements();) {
        String headerName = (String) e.nextElement();
        String headerValue = httpServletRequest.getHeader(headerName);
        // skipping cookies, as we're appending cookies separately.
        if (Objects.equals(headerName, "cookie")) {
            continue;
        }
        if (headerName != null && headerValue != null) {
            curlCommand.append(String.format(" -H \"%s:%s\" ", headerName, headerValue));
        }
    }

    // iterating over cookies.
    final Cookie[] cookieArray = httpServletRequest.getCookies();
    final StringBuilder cookies = new StringBuilder();
    for (Cookie cookie : cookieArray) {
        if (cookie.getName() != null && cookie.getValue() != null) {
            cookies.append(cookie.getName());
            cookies.append('=');
            cookies.append(cookie.getValue());
            cookies.append("; ");
        }
    }
    curlCommand.append(" --cookie \"" + cookies.toString() + "\"");

    // appending request url.
    curlCommand.append(" \"" + httpServletRequest.getRequestURL().toString() + "\"");
    return curlCommand;
}

언급URL : https://stackoverflow.com/questions/2222238/httpservletrequest-to-complete-url

반응형