从请求URL获取哈希参数

时间:2011-11-07 06:55:43

标签: java

我有这样的网址 - http://www.coolsite.com/daily-plan/#id=1 解析该字符串并读取哈希值(#id =之后的值)的最简单方法是什么? 谢谢

8 个答案:

答案 0 :(得分:31)

在客户端(即从JavaScript),您可以检查window.location.hash以获取哈希值。在服务器端,一般答案是'不可能',因为哈希不会在请求中发送到服务器。

更新:我可能误解了这个问题。我的答案是关于如何在请求处理期间在浏览器或服务器端代码中获取URL的哈希部分,而不是字符串处理。

Upd2:回答此处的评论,因为它不适合评论。

当用户点击您的导航链接时,它是如何工作的?

我假设哈希被更改,相应的内容通过来自Web服务或REST的AJAX请求下载。

例如,如果您的用户在其浏览器中有URL www.example.com,则此页面会显示产品类别列表。用户点击一个类别,URL更改为www.example.com/#id=5,该类别(ID = 5)的产品将通过AJAX下载并显示在页面上。没有回发,只有部分页面刷新。

这是否接近你的情景?

现在,您希望用户直接在浏览器地址栏中粘贴/输入www.example.com/#id=5,然后直接转到该类别中的产品列表。

但是 / #id = 5没有被浏览器发送到带有请求的服务器,因此无法在服务器端获取该值,并且您无法对其进行任何操作,因为它是浏览器决定不发送这些数据,而你没有在服务器端拥有它。

在我们的项目中,我们使用解决方案,当服务器只返回公共页面代码/ html,即页眉,页脚,没有页面的主/中心部分。然后有一个JavaScript代码,它在加载这个常见的HTML之后立即执行。它需要window.location.hash并通过AJAX将其发送到Web服务,Web服务返回页面主要部分的内容(HTML)。

答案 1 :(得分:11)

new URI("http://.../abc#xyz").getFragment();

请参阅Javadocs for URI

答案 2 :(得分:-1)

String url = " http://www.coolsite.com/daily-plan/#id=1";
int sharpPos = url.indexOf('#');
String q = null;
if (sharpPos >= 0) {
    q = url.substring(sharpPos);
}

当然,您可以使用各种字符串操作方法,包括正则表达式。

但实际上你的例子很奇怪。通常,URL的参数在问号后传递。在这种情况下,您只需使用标准类URL:

String q = new URL(" http://www.coolsite.com/daily-plan?id=1").getQuery();

答案 3 :(得分:-1)

你正在使用什么来做这件事?

如果您使用jsp或servlet,则对您有用

if (request.getParameter("#id") == null) {
    out.println("Please enter your name.");
} else {
    out.println("Hello <b>"+request.getParameter(i)+"</b>!");
}

如果您正在使用javascript,那么以下功能将对您有用

function getURLParameters() 
{
var sURL = window.document.URL.toString();

if (sURL.indexOf("?") > 0)
{
    var arrParams = sURL.split("?");

    var arrURLParams = arrParams[1].split("&");

    var arrParamNames = new Array(arrURLParams.length);
    var arrParamValues = new Array(arrURLParams.length);

    var i = 0;
    for (i=0;i<arrURLParams.length;i++)
    {
        var sParam =  arrURLParams[i].split("=");
        arrParamNames[i] = sParam[0];
        if (sParam[1] != "")
            arrParamValues[i] = unescape(sParam[1]);
        else
            arrParamValues[i] = "No Value";
    }

    for (i=0;i<arrURLParams.length;i++)
    {
        alert(arrParamNames[i]+" = "+ arrParamValues[i]);
    }
}
else
{
    alert("No parameters.");
}
   }

答案 4 :(得分:-1)

以下是捕获锚链接的方法。适用于所有Web框架。

我将使用示例方案来说明:我们需要捕获未经身​​份验证的用户请求的深层网址http://server.com /#/ xyz ,以便他们可以在登录后重定向到那个深度的URL。

  1. 未经身份验证的用户请求http://server.com /#/ xyz (来自&#39;#&#39;以后的所有内容都不会发送到服务器)。

  2. 所有服务器都知道用户想要http://server.com/并且他们未经身份验证。服务器将用户重定向到登录表单。

  3. 这里有一个聪明的一点:客户端仍在等待他们的原始请求,所以如果服务器在登录表单中包含一个隐藏元素,其中一些JS引用window.location.href,它可以捕获原始请求的完整网址 完成了锚点部分:

    <form action="/login" method="post">
      <div>
        <label>Username:</label>
        <input type="text" name="username"/><br/>
      </div>
      <div>
        <label>Password:</label>
        <input type="password" name="password"/>
      </div>
      <!-- XXXXXXXXX CLEVER BIT XXXXXXXXXX-->
      <script>
        document.write('<input type="hidden" name="from" value="'+document.location.href+'"/>');
      </script>
      <!-- XXXXXXXXXX-->
      <div>
        <input class="submit-button" type="submit" value="Submit"/>
      </div>
    </form>
    
  4. 用户对自己进行身份验证,并使用POST发送原始URL。然后,服务器可以将用户转发到原始的深层URL。

答案 5 :(得分:-1)

更换&#39;#&#39;解析网址时使用&#39;?&#39; 。检查下面的代码

String url = "http://www.coolsite.com/daily-plan/#id=1";
String urlNew = url.replace("#", "?");
String id = Uri.parse(urlNew).getQueryParameter("id");

答案 6 :(得分:-3)

如果您的URL与您编写的相同且不包含任何其他内容,那么Java上的whis代码将帮助您

 String val = "http://www.coolsite.com/daily-plan/#id=1";
 System.out.println(val.split("#id")[1]);

不要忘记检查为空值。

P.S。如果使用servlet,则可以从request.getAttribute(“id”)获取此参数。

最诚挚的问候, 心理

答案 7 :(得分:-3)

如果您的网址是从OAuth回调获取的,那么您将无法使用! 因为完整的网址由于hash(#)而不会发送给服务