6

我在 Tomcat 中实现了一个基于 Web 的服务,并使用基于 Tomcat 容器的身份验证。我想要实现的是让登录页面根据用户到达那里的方式而有所不同。具体来说:

  • 如果用户单击“登录”按钮,我希望登录页面只要求输入用户名和密码。我已经实现了登录按钮,以简单地将用户带到“登录”页面,并将该页面设为安全页面,以便触发容器登录。

  • 如果未经身份验证的用户访问需要身份验证的页面,我希望登录页面也显示“您必须登录才能执行此操作”或类似的内容。

所以问题是让登录表单的控制器或 JSP 知道浏览器在重定向到这里时所请求的内容。我查看了请求对象中的标头和其他属性,但看不到任何有用的东西。

任何人都可以提出解决方案吗?或者也许是一种不同的方式来实现可以避免问题的“登录”按钮?

4

4 回答 4

7

您可以使用它来确定原始请求的目标:

<%
String value0 = (String)request.
                getAttribute("javax.servlet.forward.request_uri");
if(value0.contains("login_success.jsp")) {
    out.print("USER, LOG IN!");
} else {
    out.print("USER, you have to LOG IN to go there!");
}
%>

其他选项包括:

您可以实现登录按钮以重定向到URLlogin success page并将 a 添加?MyKey=value到 URL,该属性可以被看到login page并且您可以对其做出反应。

我将处理我的代码,将我能找到的所有内容和任何内容都绘制出来,并使其更具可读性,然后将其发布在这里。我确信用户下一步获得的值存在于您的某处request,您只需要找出在哪里。

于 2012-04-13T07:33:51.910 回答
4

您有几个选项,1 是标题“Referer” 此字段将包含浏览器最后所在的 URL...所以您可以在登录页面上看到,我的页面链接它们的最后一页是这里,还是其他地方.

这会起作用,但它不是万无一失的,有些人/公司会过滤掉引用者等,有些浏览器可能允许用户关闭它,所以你不会得到他们上次访问的页面的引用。

最好的办法是在用户登录时分配 cookie 值,然后如果用户请求需要登录的页面,您的代码只需检查 cookie 值是否存在。如果它在那里,则用户已经登录并且您可以显示该页面......如果不是,您发送给他们您必须登录才能执行此页面。

于 2012-04-17T14:33:06.917 回答
2

我赞成@Angelo 对可移植性的回答,但是如果您愿意将您的应用程序绑定到Tomcat,您可以从保存在会话中的触发请求中获取目标目的地(用户登录后想要去的地方)。我还没有尝试过,但我认为它会起作用:

import org.apache.catalina.authenticator.Constants
import org.apache.catalina.authenticator.SavedRequest
import org.apache.catalina.session.StandardSession

...

StandardSession standardSession = 
    (StandardSession) httpServletRequest.getSession();

// Retrieve the SavedRequest object from our session
SavedRequest saved = (SavedRequest)
        standardSession.getNote(Constants.FORM_REQUEST_NOTE);
if ((saved == null) || 
    httpServletRequest.getRequestURI().equals(saved.getRequestURI())) {
    // user came directly to login page
} else {
    // "You must login to do this"
}
于 2012-04-18T22:01:02.923 回答
2

上述解决方案对我来说似乎倒退了。身份验证控制器不应该查看请求的来源来决定做什么......应该被告知。重定向控制器/规则应该知道他们想要做什么,并将其发送到适当的操作。

登录可以直接进入 servlet 的登录动作。

我不知道您的 servlet 是如何设置的,但是 servlet 应该在需要执行某些操作的情况下寻找身份验证。如果未通过身份验证,请重定向到身份验证操作。登录/验证操作会略有不同(设置参数或文本),但可以转到相同的视图。

话虽如此,从头开始进行身份验证需要大量工作,而且通常只引入其他框架要容易得多。例如:弹簧安全。

于 2012-04-19T15:17:39.677 回答