2

用户登录后,如果再次访问,我想进行重定向,这样如果他/她已经通过身份验证/login,用户就无法访问登录表单。

我正在使用Jetty 8,我在FormAuthenticator.java:168方法中发现validateRequest,如果用户访问登录或错误页面,则用户永远不会经过身份验证,尽管可能是这种情况

if (isLoginOrErrorPage(URIUtil.addPaths(request.getServletPath(),request.getPathInfo())))
    return Authentication.NOT_CHECKED;

我怎样才能解决这个问题?

4

2 回答 2

3

此问题已于 2012-08-07 修复。我认为 Jetty 在这里没有按预期工作。出于这个原因,我提交了一个关于重定向行为的错误。看看最新的 Jetty 8,它现在应该可以为你工作,分别看看修复

于 2012-11-11T23:34:20.467 回答
3

我为你描述的问题苦苦挣扎了一段时间......

当用户已经登录时,我尝试使用会话、请求和响应的 API 进行重定向,但是在使用 Jetty 时,用户的身份验证数据显然无法从登录页面获得。

我对 JSP 和 Jetty 完全陌生(我将它用于课堂作业),但我提出了一个运行良好的解决方案,即使认为它不是理想的解决方案。

首先,我通过在我的登录页面中添加一个变量来查看该页面是否已经加载,使用以下 JSP 做了一个小绕过:

<%
if(session.getAttribute("loginLoadedOnce") == "true")
{
    response.sendRedirect("/redirect.jsp");
}
else
{
    session.setAttribute("loginLoadedOnce", "true");
}
%>

这样,如果属性设置不正确,它将让用户尝试登录。否则,它将重定向到重定向页面。重定向页面将提供可用的用户数据,并且能够查看用户是否具有某些角色。

重定向页面的 JSP 代码如下:

<%
if(request.isUserInRole("admin"))
{
    String url = response.encodeRedirectURL("admin/AdminPage.jsp");
    response.sendRedirect(url);
}
else if(request.isUserInRole("accounting"))
{
    String url = response.encodeRedirectURL("/accounting/Mainpage.jsp");
    response.sendRedirect(url);
}
else
{
    // Here the user has no role that we are aware of.
    session.setAttribute("loginLoadedOnce", "false"); // stop redirect loop.
    response.sendRedirect("/login.jsp");
}
%>

在这里,我们检查用户的角色并重定向到角色的正确页面。

就像现在一样,用户必须先注销才能返回登录页面。每个尝试返回登录页面的尝试最终都会重定向,即使使用浏览器的“返回”按钮也是如此。

希望这会对某人有所帮助。

于 2012-11-10T06:25:01.137 回答