我有一个HttpServletRequest对象。
我如何获得导致这个调用到达我的servlet的完整而准确的URL ?
或者至少尽可能准确,因为有些东西是可以重新生成的(也许是参数的顺序)。
我有一个HttpServletRequest对象。
我如何获得导致这个调用到达我的servlet的完整而准确的URL ?
或者至少尽可能准确,因为有些东西是可以重新生成的(也许是参数的顺序)。
当前回答
如果你使用了.getRequestURL()中的StringBuffer的构建器模式,你可以用三元写一个简单的一行代码:
private String getUrlWithQueryParms(final HttpServletRequest request) {
return request.getQueryString() == null ? request.getRequestURL().toString() :
request.getRequestURL().append("?").append(request.getQueryString()).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;
}
结合getRequestURL()和getQueryString()的结果应该会得到您想要的结果。
如果你使用了.getRequestURL()中的StringBuffer的构建器模式,你可以用三元写一个简单的一行代码:
private String getUrlWithQueryParms(final HttpServletRequest request) {
return request.getQueryString() == null ? request.getRequestURL().toString() :
request.getRequestURL().append("?").append(request.getQueryString()).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);
}
不要忘记在web.xml的filter mapping中放入<dispatcher>FORWARD</dispatcher>
我有一个用例来生成cURL命令(我可以在终端使用)从httpServletRequest实例。我创建了一个这样的方法。您可以直接在终端中复制粘贴此方法的输出
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;
}