当前位置: 代码网 > it编程>编程语言>Java > Java获取请求url地址的几种常见方法

Java获取请求url地址的几种常见方法

2025年05月22日 Java 我要评论
1. 在servlet中获取import javax.servlet.http.httpservlet;import javax.servlet.http.httpservletrequest;imp

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():主机名或 ip

  • request.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地址内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com