简单的问题!不知道谷歌为什么不知道答案!
在Java servlet中,如何在返回用户时设置URL锚点(哈希)?
答案 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-attr
是errorSignupMessage
,而不是用户与另一个表单进行交互,如果null
存在且不是errorSignupMessage
,那么当前表单就是用户与之交互的表单。
然后我转到javascript并使用null
事件进行了数据属性检测,并编写了一些用于更改window.onload
值的逻辑。
location.hash
这就是我解决这个问题的方法。当然,你需要根据自己的需要采用所有这些,但我认为你仍然可以得到一般的想法。
希望它有用!