[java] URL을 완성하기위한 HttpServletRequest

나는이 HttpServletRequest개체를.

이 호출이 내 서블릿에 도착하게하는 완전하고 정확한 URL을 어떻게 얻습니까?

또는 재생성 할 수있는 것 (매개 변수의 순서)이있을 수 있으므로 가능한 한 정확하게 작성하십시오.



답변

HttpServletRequest다음과 같은 방법이 있습니다 :

  • 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();


답변

의 결과를 결합 getRequestURL()하고하는 것은 getQueryString()당신에게 원하는 결과를 얻을 수 있습니다.


답변

filter를 사용할 수 있습니다.

@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에 필터 매핑 을 넣는 것을 잊지 마십시오