好的,我有一个有趣的登录页面重定向案例。
我的网络服务有一个登录页面(login.html),其中包含一些 JavaScript 来处理登录并重定向到硬编码的“默认”页面。 Web 服务是用 Java 编写的,带有 Servlet 过滤器,如果用户未经身份验证,则处理重定向(因此,如果用户尝试在未登录的情况下访问 domain/statistics
,他们将被定向到 domain/login .html
)。来自 protected 服务的重定向有效:我可以重定向到登录页面,一旦用户通过身份验证,将其重定向到默认页面。但是,我在重定向到上一页时遇到问题。
我知道这通常是通过 Javascript 中的参数 document.referrer
来处理的,我已经尝试过了,但是由于 Java 使用 response.sendRedirect
进行重定向,Referer header 是未发送。
如何让这两个方面重定向到之前调用的页面?我是否需要在 Javascript 端、Java 端或两者上添加一些内容?
最佳答案
我所做的是将原始(重定向)URL 放入登录表单上的隐藏输入字段中。进行身份验证的代码应该只检查该参数,如果它不为空,则可以在建立 session 后重定向。
你必须小心这样做,以防止 XSS 攻击等,但这并不难,而且效果很好。
在我的框架(Stripes)中,我可以将原始 URL(取自 HttpServletRequest 对象,servlet 路径、“路径信息”和查询字符串的组合)推送到一个特殊的保存框中,这将导致框架在下一个请求时将其作为参数返回给我。如果没有这个,最简单的方法就是在重定向时添加 URL 作为参数。只需对原始尝试的 URL 进行 URL 编码,然后使用一些参数名称将其附加到重定向 URL 上。然后,在您的登录页面上,您只需检查它:
<c:if test='${not empty param.attemptedUrl}'>
<input type='hidden' name='attemptedUrl' value='${fn:escapeXml(param.attemptedUrl)}'>
</c:if>
然后,当提交登录表单时,您的登录操作也会获取该参数,并且可以根据需要对其进行操作。
关于java - Java 和 Javascript 中的登录页面重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6412428/