我有一个类似Spring Security 3.0 SSO的内置Spring应用程序和一个外部php应用程序,可以对我的SSO服务器进行身份验证。
当用户登录此应用程序时,我也想在php应用程序中验证他/她。
所以我这样做了:
....
public class CustomAuthenticationHandler extends SavedRequestAwareAuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {
DefaultHttpClient httpclient = new DefaultHttpClient();
try {
HttpGet httpget = new HttpGet("http://localhost/phpapp/signin");
httpget.setHeader("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0.2) Gecko/20100101 Firefox/10.0.2");
httpget.setHeader("Connection", "keep-alive");
httpget.setHeader("Referer", "http://localhost:8080/;jsessionid="+request.getSession().getId());
httpget.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
httpget.setHeader("Accept-Language", "en-gb,en;q=0.5");
httpget.setHeader("Accept-Encoding", "gzip, deflate");
httpget.setHeader("Cookie", "JSESSIONID="+request.getSession().getId());
HttpResponse res = httpclient.execute(httpget);
} finally {
httpclient.getConnectionManager().shutdown();
}
}
}
在后验证处理程序中,我针对php应用程序的登录创建了一个“GET”请求。 当它被执行时,在请求体中返回不记录用户的“登录页面”。注意我用过:
httpget.setHeader("Referer", "http://localhost:8080/;jsessionid="+request.getSession().getId());
作为当前经过身份验证的jsessionid。
但是如果我在验证后将相同的链接:http://localhost/phpapp/signin作为页面中的正常href链接并单击它就可以正常工作。
知道为什么在过滤器中不能使用相同类型的请求?
答案 0 :(得分:0)
它很可能与Cookie路径有关。 Cookie与子域,域,路径和端口绑定,因此除非两个应用程序都在http://localhost/phpapp/上运行,否则会遇到问题。您可以尝试修改Spring以不设置cookie的路径或端口元素,即只将其绑定到localhost。
但是我强烈建议您采用另一种方法,例如真正的单点登录系统,而不是尝试在应用之间代理Cookie。