1. 在 servlet 中获取
import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import java.io.ioexception; public class urldemoservlet extends httpservlet { @override protected void doget(httpservletrequest request, httpservletresponse response) throws ioexception { // 获取到类似 "http://example.com:8080/app/path/to/servlet" stringbuffer url = request.getrequesturl(); // 如果还想要问号后面的查询串,比如 "?a=1&b=2" string querystring = request.getquerystring(); // 可能为 null string fullurl = (querystring == null) ? url.tostring() : url.append('?').append(querystring).tostring(); response.getwriter().write("full url: " + fullurl); } }
request.getrequesturl()
返回stringbuffer
,包含协议、服务器名、端口、上下文路径和 servlet 路径。request.getquerystring()
返回 url 中?
后的那部分(不含?
本身),如果没有查询参数则为null
。
2. 在 spring mvc 控制器中获取
import javax.servlet.http.httpservletrequest; import org.springframework.stereotype.controller; import org.springframework.web.bind.annotation.getmapping; import org.springframework.web.bind.annotation.responsebody; @controller public class urldemocontroller { @getmapping("/demo") @responsebody public string demo(httpservletrequest request) { stringbuffer url = request.getrequesturl(); string qs = request.getquerystring(); return (qs == null) ? url.tostring() : url.append('?').append(qs).tostring(); } }
spring 会自动把 httpservletrequest
注入到方法参数里,使用方式与 servlet 一样。
3. 在过滤器(filter)里获取
import javax.servlet.*; import javax.servlet.http.httpservletrequest; import java.io.ioexception; public class urlloggingfilter implements filter { @override public void dofilter(servletrequest req, servletresponse res, filterchain chain) throws ioexception, servletexception { httpservletrequest request = (httpservletrequest) req; stringbuffer url = request.getrequesturl(); string qs = request.getquerystring(); string fullurl = (qs == null) ? url.tostring() : url.append('?').append(qs).tostring(); system.out.println("incoming request url: " + fullurl); chain.dofilter(req, res); } }
过滤器常用于打印日志、鉴权、统一处理。
4. 拿到更精细的各部分
request.getscheme()
:协议(http
或https
)request.getservername()
:主机名或 iprequest.getserverport()
:端口号request.getcontextpath()
:应用上下文路径(部署时的app
名)request.getservletpath()
:servlet 映射路径request.getpathinfo()
:额外的路径信息request.getquerystring()
:查询串(不含?
)
如果你需要在反向代理(nginx、f5)后还拿到原始请求的主机名和协议,就要结合 x-forwarded-proto
/ x-forwarded-host
等头部来重组:
string proto = request.getheader("x-forwarded-proto"); if (proto == null) proto = request.getscheme(); string host = request.getheader("x-forwarded-host"); if (host == null) host = request.getservername(); string port = request.getheader("x-forwarded-port"); if (port == null) port = string.valueof(request.getserverport()); string fullurl = proto + "://" + host + (port.isempty() ? "" : ":" + port) + request.getrequesturi() + (qs == null ? "" : "?" + qs);
5. 客户端(http 客户端库)获取请求 url
如果你是在客户端代码中(比如用 apache httpclient、okhttp)想拿到自己发出的请求 url:
- apache httpclient
httpget get = new httpget("https://api.example.com/data?x=1"); system.out.println(get.geturi()); // 输出 uri 对象
- okhttp
request req = new request.builder() .url("https://api.example.com/data?x=1") .build(); system.out.println(req.url()); // okio.httpurl 对象
以上就是在各种常见场景下“java:获取请求 url 地址”的做法,按需选用即可。
到此这篇关于java获取请求url地址的几种常见方法的文章就介绍到这了,更多相关java获取请求url地址内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论