ChatGPT解决这个技术问题 Extra ChatGPT

如何获取域 URL 和应用程序名称?

这是场景。

我的 Java Web 应用程序具有以下路径

https://www.mywebsite.com:9443/MyWebApp

假设有一个 JSP 文件

https://www.mywebsite.com:9443/MyWebApp/protected/index.jsp

我需要找回

https://www.mywebsite.com:9443/MyWebApp 

在这个 JSP 文件中。

当然,有一种相当懒惰和愚蠢的方式来获取 URL,然后重新跟踪路径。

但是有没有一种程序化的方式来做到这一点?具体来说,我认为我可以获得域+端口,但我如何实际检索应用程序名称“MyWebApp”?


b
bluish

查看 HttpServletRequest 的文档。
为了在您的示例中构建 URL,您需要使用:

获取方案()

获取服务器名称()

获取服务器端口()

获取上下文路径()

这是一个将返回您的示例的方法:

public static String getURLWithContextPath(HttpServletRequest request) {
   return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}

如果服务器名称是 localhost ,如何获取 ip?
请注意,getScheme() 并不总是适用于 https,一些服务器有奇怪的行为,并且可能总是返回 http 而不是 https。我想我应该让你知道。如果需要,请尝试 request.getRequestURL().toString() 并按摩
@MahmoudSaleh request.getLocalAddr()
如果您还显示每种方法的示例输出,那就太好了。启动并运行 Web 服务器只是为了检查每个服务器的输出是一件很痛苦的事情。
方法中的 getContextPath() 不返回任何内容! getServerPort() 只返回 2 位数字,而不是 4 位数字!我可以提供一些帮助吗?
B
BalusC

Web 应用程序名称(实际上是上下文路径)可通过调用 HttpServletrequest#getContextPath() 获得(因此不是之前建议的 getServletPath())。您可以通过 ${pageContext.request.contextPath} 在 JSP 中检索它。

<p>The context path is: ${pageContext.request.contextPath}.</p>

如果您打算将它用于 JSP 页面中的所有相对路径(这会使这个问题更有意义),那么您可以使用 HTML <base> 标记:

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:set var="req" value="${pageContext.request}" />
<c:set var="url">${req.requestURL}</c:set>
<c:set var="uri" value="${req.requestURI}" />

<!doctype html>
<html lang="en">
    <head>
        <title>SO question 2204870</title>
        <base href="${fn:substring(url, 0, fn:length(url) - fn:length(uri))}${req.contextPath}/">
        <script src="js/global.js"></script>
        <link rel="stylesheet" href="css/global.css">
    </head>
    <body>
        <ul>
            <li><a href="home.jsp">Home</a></li>
            <li><a href="faq.jsp">FAQ</a></li>
            <li><a href="contact.jsp">Contact</a></li>
        </ul>
    </body>
</html>

然后页面中的所有链接将自动与 <base> 相关,因此您无需在任何地方复制粘贴上下文路径。请注意,当相对链接以 / 开头时,它们将不再与 <base> 相关,而是与域根相关。


文档指出,“ServletContext.getContextPath() 返回的上下文路径应被视为应用程序的主要或首选上下文路径”。这就是我在意识到这件事后将这个包含在我原来的答案中的原因。我没有删除我的第一次尝试,因为我希望 OP 考虑通读文档并了解更多有关相关方法的信息。我希望你明白我的意思。
@Vinegar:对于 JSP 文件,getServletPath() 返回 /filename.jsp。 OP根本没有要求,这当然不是要走的路。
我当然会在我的帖子中进行更正,但这次我期待对我的评论的回应,这是完全不同的:)。
在 XHTML DOCTYPE 中,您需要将“/”字符附加到 contextPath。
为什么不关闭 <base> 标记?不应该关闭所有标签吗?
A
AgilePro

应用程序名称来自 getContextPath

我发现 Agile Software Craftsmanship HttpServletRequest Path Decoding 中的这张图整理了所有可用的不同方法:

https://i.stack.imgur.com/btajG.png


该图对于回答许多问题很有用。我尝试在许多问题的答案中使用它,但它们都被删除了:有一条规则反对重复使用相同的答案。这是一种耻辱。理论上,如果您使用相同的答案,那么问题必须相同,因此您应该将问题标记为重复。但这不是现实。同一张图可以回答很多不同的问题。执行这种武断的规则是心胸狭窄的。如果您看到用这张图回答得最好的问题,请使用它。
A
Adeel Ansari

我强烈建议您通读 docs,了解类似的方法。如果您对上下文路径感兴趣,请查看此处,ServletContext.getContextPath()


T
Tiny

以下代码可能对使用 JavaScript 的 Web 应用程序有用。

var newURL = window.location.protocol + "//"  + window.location.host + "" + window.location.pathname;

newURL = newURL.substring(0,newURL.indexOf(""));

m
master_d

如果您将 url 作为字符串传递并想要提取该应用程序的上下文根,则可以使用此正则表达式来提取它。它适用于以上下文根开头的完整 url 或相对 url。

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅