我的情况如下:
我在Tomcat上运行了2个Web应用程序。最初用户登录到应用程序1然后。有一个指向应用程序2的链接。在单击链接时,应将用户重定向到第二个应用程序。
两个应用程序都使用LDAP身份验证。
现在,问题在于第二个应用程序有自己的身份验证系统。
因此,我们计划隐式验证在第一个系统中登录的用户。
我编写了一个servlet,当我在App1中点击App2的链接时,它会被执行。
我正在尝试使用下面的代码,它应该在给定参数的app2上调用Servlet“ldap-login”。参数名称是正确的。
String targetURL = "http://localhost:8080/app2/ldap-login";
HttpClient client = new HttpClient();
PostMethod doPost = new PostMethod(targetURL);
//doPost.getParams().setBooleanParameter(HttpMethodParams.USE_EXPECT_CONTINUE, true);
doPost.addParameter("login_netid", "alice");
doPost.addParameter("login_password", "alice");
try {
int status = client.executeMethod(doPost);
if (status == HttpStatus.SC_OK) {
// redirect
response.sendRedirect("http://localhost:8080/app2/myPage");
} else {
System.out.println("Service failed, Response Code= " +
HttpStatus.getStatusText(status));
System.out.println("Response Body --> " + doPost.getResponseBodyAsString());
}
} catch (Exception ex) {
System.out.println("ERROR: " +
ex.getClass().getName() + " "+ ex.getMessage());
ex.printStackTrace();
} finally {
doPost.releaseConnection();
}
但我得到的回应“暂时移动”。
有人可以建议我替代吗?
答案 0 :(得分:1)
A 302 Moved Temporarily响应只是一个重定向。这正是你response.sendRedirect()
时得到的那种回应。您也可以很好地获得重定向作为对成功登录的响应。我建议在第二个应用程序验证登录成功时是否确实重定向。然后,您应该检查响应代码是否为302而不是200.或者,您需要告诉HttpClient
自动关注任何重定向。
更重要的是,如果登录实际上失败了,您会从第二个应用程序获得什么样的响应?它会抛出异常,从而返回500的响应代码吗?或者它只是在请求范围内有条件地设置一些错误消息并通过转发重新显示JSP,从而保持响应代码为200?那么如何在成功登录时区分失败登录200和200?
无关,如果第二个应用程序与第一个应用程序不共享同一会话,则您的方法可能无效。登录通常存储在会话中,但您不会在任何地方维护会话。无论如何,这是一个新问题的主题:)
答案 1 :(得分:0)
根据API doc,sendRedirect调用会执行临时重定向。正如@BalusC所提到的,您需要处理响应代码SC_MOVED_TEMPORARILY
或SC_FOUND
。
在登录后进行重定向(或者可能在任何 POST 请求之后)进行重定向的原因可能是Double Submit Problem。 Here是关于那个的另一篇文章。