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에 포함된 쿼리 문자열을 반환합니다.
파티에는 다소 늦었지만, WebUtils의 MarkUtils-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."><www.ziesemer.com></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를 사용한 비표준 포트 구성에 대해서는 설명하지 않습니다.
다음 항목도 참조하십시오.
- http://blogger.ziesemer.com/2017/08/httpservletrequestgetrequesturl.html
- https://gist.github.com/ziesemer/700376d8da8c60585438
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
'source' 카테고리의 다른 글
$HOME 폴더에 pip 패키지를 설치하는 중 (0) | 2022.11.08 |
---|---|
사전 매핑 반전/반전 (0) | 2022.11.08 |
python 모듈의 argparse 부분에 대한 테스트는 어떻게 작성합니까? (0) | 2022.11.08 |
403 오류 페이지를 에뮬레이트합니다. (0) | 2022.11.08 |
PHP - 어레이 값의 키 이름 가져오기 (0) | 2022.11.08 |