如何在servlet中设置URL锚(哈希)?

时间:2015-01-16 15:52:10

标签: java url java-ee servlets anchor

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

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

2 个答案:

答案 0 :(得分:4)

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

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

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

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

http://stackoverflow.com/a/27988314/4402557

但服务器将其重定向到此

http://stackoverflow.com/questions/27987762/how-to-set-url-anchor-hash-in-servlets/27988314#27988314

请注意,锚点之前的URL部分不相同。

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

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属性。

答案 1 :(得分:0)

一旦遇到类似的需求。

我的问题是:

我在同一个jsp页面上有两种不同的表单(一种用于注册,另一种用于登录)。通过网址中的哈希显示表单,即http://myapp.com/auth#login使登录表单可见,{​​{1}}使注册表单可见。

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

以下是我如何显示验证错误(jsp):

http://myapp.com/auth#signup

<form method="post" action="authentication"> <c:forEach items="${errorSignupMessage}" var="message"> <div class="error-message">${message}</div> </c:forEach> .................................. </form> 是我通过servlet传递的属性

errorSignupMessage

解决方案:

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

request.setAttribute("errorSignupMessage", array);

重要的是要查看属性<input type="text" name="ACTION" class="hidden important" value="signup" data-attr="${errorSignupMessage != null ? true : false}"/> 。如您所见,我根据来自servlet的操作设置属性的布尔值,即data-attrerrorSignupMessage,而不是用户与另一个表单进行交互,如果null存在且不是errorSignupMessage,那么当前表单就是用户与之交互的表单。

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

location.hash

这就是我解决这个问题的方法。当然,你需要根据自己的需要采用所有这些,但我认为你仍然可以得到一般的想法。

希望它有用!