如何在 servlet 中设置 URL 锚点(散列)?

How to set URL anchor (hash) in servlets?

简单的问题!不知道为什么Google不知道答案!

在 Java servlet 中,如何在返回给用户时设置 URL 锚点(散列)?

URL 锚仅由浏览器处理,甚至从未到达服务器(它不是请求的一部分)。

这意味着服务器端,无论是在您建议的 servlet 中还是使用任何其他服务器端技术(例如 PHP),您 可以 重定向到设置了 URL 锚点的 URL,但是您 不能 检查您当前正在处理的请求中是否提供了 URL 锚点.

此限制阻止您设置 URL 锚点 同时保持 URL 的其余部分不变 ,因为服务器无法区分带和不带 URL 锚点的地址。

所以,你 可以做到 :这个答案的规范地址是这个


但服务器将其重定向到此


注意锚点前的URL部分不一样

在 HTTP servlet 中,您可以使用传递给服务方法的 HTTPServletResponse 对象的 sendRedirect(String) 方法来实现此目的,例如

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {

    /* ... */

    response.sendRedirect("http://example.com/your/url#hash");
}

但是,这个,你做不到:重定向这个

http://example.com/some/url

至此

http://example.com/some/url#there

对于服务器来说,都是同一个地址,无法区分。这使得无法检查地址是否是第一个(没有 URL 锚点的地址)并且如果是则有条件地重定向。不检查就重定向当然会创建一个重定向循环。

但是,根据您要完成的具体目标,即使您不能在您的 servlet 中完成它,您也可以使用客户端脚本(即 JavaScript)实现它。看看 window.location.hash 属性.

曾经遇到过类似的需求

我的问题是:

我在同一个 jsp 页面上有两种不同的表单(一种用于注册,一种用于登录)。表单通过 url 中的哈希值可见,即 http://myapp.com/auth#login 使登录表单可见,http://myapp.com/auth#signup 使注册表单可见。

我需要通过重新加载同一页面向用户显示验证错误,但无法从我的 servlet 导航到哈希值。

这是我显示验证错误的方式 (jsp):

    <form method="post" action="authentication">
        <c:forEach items="${errorSignupMessage}" var="message">
            <div class="error-message">${message}</div>
        </c:forEach>
          ..................................
    </form>

errorSignupMessage是我通过servlet传入的属性

request.setAttribute("errorSignupMessage", array);

解决方法:

首先,我在必须包含所需属性的表单中创建了隐藏字段:

<input type="text" name="ACTION" class="hidden  important" value="signup" data-attr="${errorSignupMessage != null ? true : false}"/>

要注意的重要一点是属性 data-attr。如您所见,我根据 servlet 的操作在属性上设置布尔值,即如果 errorSignupMessagenull,那么用户与另一个表单交互并且如果 errorSignupMessage 存在并且不是 null,则当前表单是用户与之交互的表单。

然后我去了 javascript 并使用 window.onload 事件进行数据属性检测并编写了一些用于更改 location.hash 值的逻辑。

var authForms = document.getElementsByClassName('important');
function changeHash() {
    for(var i = 0; i < authForms.length; ++i) {
        var form = authForms[i];

        if (form.value === 'signup' && form.getAttribute('data-attr') === 'true') {
            location.hash = '#signup';
        } else {
            location.hash = '#login';
        }
    }
}
window.onload = changeHash;

我就是这样解决的。当然,您需要根据自己的需要采用所有这些,但我认为您仍然了解总体思路。

希望对您有所帮助!