Java HttpServletRequest以完成URL
我有一个Java HttpServletRequest以完成URL,java,http,servlets,Java,Http,Servlets,我有一个HttpServletRequest对象 如何获取导致此调用到达我的servlet的完整而准确的URL 或者至少尽可能准确,因为可能存在可以重新生成的内容(可能是参数的顺序)。具有以下方法: -返回查询字符串分隔符字符之前的完整URL部分? -返回查询字符串分隔符字符后的完整URL部分? 因此,要获得完整的URL,只需执行以下操作: public static String getFullURL(HttpServletRequest request) { StringBuil
HttpServletRequest
对象
如何获取导致此调用到达我的servlet的完整而准确的URL
或者至少尽可能准确,因为可能存在可以重新生成的内容(可能是参数的顺序)。具有以下方法:
- -返回查询字符串分隔符字符之前的完整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();
}
}
将和的结果组合在一起应该会得到所需的结果。HttpUtil被弃用,这是正确的方法
StringBuffer url = req.getRequestURL();
String queryString = req.getQueryString();
if (queryString != null) {
url.append('?');
url.append(queryString);
}
String requestURL = url.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();
}
您可以使用过滤器
@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中的过滤器映射中提出
前进,在HttpServletRequest对象上使用以下方法
java.lang.String
-返回此请求URL的一部分,从协议名称到HTTP请求第一行中的查询字符串
java.lang.StringBuffer
-重建客户端用于发出请求的URL
java.lang.String
-返回路径后请求URL中包含的查询字符串。在Spring项目中,您可以使用
UriComponentsBuilder.fromHttpRequest(new ServletServerHttpRequest(request)).build().toUriString()
参加派对有点晚,但我在我的InCheckStyle approved和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;
}
}
import javax.servlet.http.HttpServletRequest;
公共类GetRequestUrl{
/**
*更快地替换{@link HttpServletRequest#getRequestURL()}
*(返回一个{@link String}而不是一个{@link StringBuffer}-并在内部使用一个{@link StringBuilder})
*这还包括{@linkplain HttpServletRequest#getQueryString()查询字符串}
*
*@作者马克·齐塞默
*
*/
公共字符串getRequestUrl(最终HttpServletRequest请求){
最终字符串scheme=req.getScheme();
final int port=req.getServerPort();
最终StringBuilder url=新StringBuilder(256);
追加(方案);
url.append(“:/”);
append(req.getServerName());
if(!(((“http.equals(scheme)”和&(port==0 | | port==80))
||(“https.equals(scheme)&&port==443))){
append(“:”);
url.append(端口);
}
append(req.getRequestURI());
最后一个字符串qs=req.getQueryString();
如果(qs!=null){
url.append(“?”);
url.append(qs);
}
最终字符串结果=url.toString();
返回结果;
}
}
这可能是迄今为止最快、最可靠的答案,远远落后于Mat Banik的答案,但即使是他的答案,也没有考虑到HTTP/HTTPS的潜在非标准端口配置
另见:
如果使用中StringBuffer的生成器模式,您可以编写一个简单的带三元数的一行程序。getRequestURL()
:
但这只是语法上的甜点。您忽略了StringBuffer
的优点。是的。我接受它,但我猜它只是另外两个对象。它是一个额外的对象(StringBuilder),并且不会改变返回的底层StringBuffer。事实上,我更喜欢这个答案而不是“接受”答案,JVM将优化差异,而这不会有任何引入错误的风险。(request.getRequestURL().toString()+((request.getQueryString()!=null)?(“?”+request.getQueryString()):“”)您从getRequestURI复制了描述(错误)但是在代码中使用getRequestURL(右)。您需要有条件地检查查询字符串是否为空。您还需要修改支持请求URL的StringBuffer。如果请求实现没有生成防御副本,那么这是一种很好的方法,可以在代码的其他部分引入奇怪的行为和bug,而这些部分期望它以原始形式出现StringBuffer@KenBlair:有目的地返回StringBuffer,以便您可以轻松添加更多存储。由于这是在javadoc上指定的,因此实现中期望调用方不会修改返回的StringBuffer是非常荒谬的——因此,这很酷。这是一个有助于快速参考HttpServletRequest上所有可用信息位的答案。但是,我认为在决定是否向结果中添加端口时,您应该检查该方案。例如,“https”应该是443。一个小优化是使用StringBuilder而不是StringBuffer,只是一个提示只是一个注释:在这个特定示例中,线程安全不是问题,因为url
被声明、实例化,并且只在方法内部使用,因此,除了调用该方法的线程外,不能从其他线程访问它。如前所述,这里的线程安全不是问题,因为您正在为每个调用创建StringBuffer
的实例,并且不与任何其他线程共享它。这应该更改为StringBuilder
。有没有理由不使用getRequestURI
?如何处理与post相关的参数?@flash严格来说,post参数不是URL的一部分,它们是请求的主体。另请参阅:为什么我们没有为记录使用UTI函数…test1.getRequestURI();它给出了/applicationName/menu/index.action(即它包含前导斜杠)为什么不呢newservletserverhttprequest(request).getURI()
URI这不是最佳答案。这是我今天看到的最令人满意的答案。即使微服务链接在网关后面也能工作!必须补充的是,UriComponentsBuilder没有添加“UriComponentsBuilder”,所以它在gateway下不能完美工作。但复制这种方法仍然很好。
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;
}
}
private String getUrlWithQueryParms(final HttpServletRequest request) {
return request.getQueryString() == null ? request.getRequestURL().toString() :
request.getRequestURL().append("?").append(request.getQueryString()).toString();
}