如何使在同一服务器下运行的两个不同应用程序使用相同的 HTTPSession
How to make two different Applications running under same server use same HTTPSession
我有两个应用程序在同一台服务器 (Tomcat 7) 下运行
在第一个应用程序下,我有一个带有用户名和密码字段的登录页面。
单击“登录”按钮后,我将调用 Jersey RESTFUL 服务(不同的应用程序)。
<html>
<head>
<title>Login Page 122</title>
</head>
<body>
<form action="LoginServlet" method="post">
Username: <input type="text" name="user">
<br>
Password: <input type="password" name="pwd">
<br>
<input type="button" value="Login User" onclick="LoginAdmin()">
</form>
</body>
</html>
function LoginAdmin() {
$.ajax({
type: 'GET',
url: url + '/RFS/admin/adminlogin?UUID=' + UUID ,
//contentType: 'application/json; charset=utf-8',
jsonpCallback: 'jsonCallback',
cache: true,
dataType: 'jsonp',
jsonp: false,
success: function (response) {
var testdata = JSON.stringify(response);
},
});
}
RESTFUL 服务将根据数据库验证数据,如果成功
我在 HttpSession 中设置一个属性。
session.setAttribute("user","LoggedIN");
在 Application First 下,我编写了一个过滤器,它可以保护 HTML 资源免于在用户未登录的情况下直接访问。
现在在我的过滤器中,我正尝试在我的 servlet 过滤器中使用该会话属性。
但问题是,由于两者都是两个不同的应用程序,因此都有两个不同的会话
所以我得到的会话属性总是 NULL 的原因
public class AuthenticationFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
String uri = req.getRequestURI();
this.context.log("Requested Resource::"+uri);
HttpSession session = req.getSession(false);
if(session == null || !session.getAttribute("user").toString().equals("LoggedIN")){
this.context.log("Unauthorized access request");
System.out.println("Into session is null condition");
res.sendRedirect("login.html");
}else{
System.out.println("Into chain do filter");
chain.doFilter(request, response);
}
}
public void destroy() {
}
}
有什么办法可以解决这个问题吗??
恕我直言,无法在不同的应用程序之间共享会话。但确实可以共享身份验证。它被称为单点登录,一个完整的例子是 CAS.
以下是关于它的概括,分为 3 个部分:客户端(通常是浏览器)、Web 应用程序和身份验证服务器
- 客户端请求需要身份验证的受保护页面
- webapp 重定向到身份验证服务器并引用请求的页面
- 身份验证服务器对客户端进行身份验证,并在特殊的 URL 重定向回 Web 应用程序以使用一次性票证作为请求参数进行票证验证
- Web 应用程序获取票证并向身份验证服务器请求用户参考(通过票证);身份验证服务器查找票证并发回用户信息 - 然后 Web 应用程序可以将用户 ID 放入会话中:客户端在 Web 应用程序上进行身份验证
Web 应用程序中的低级部分由客户端库自动执行。
您可以直接使用 CAS,也可以将其用作如何进行远程身份验证的指南。我强烈建议您查看完整的protocol description,因为此答案只能用作一般介绍。
我有两个应用程序在同一台服务器 (Tomcat 7) 下运行
在第一个应用程序下,我有一个带有用户名和密码字段的登录页面。
单击“登录”按钮后,我将调用 Jersey RESTFUL 服务(不同的应用程序)。
<html>
<head>
<title>Login Page 122</title>
</head>
<body>
<form action="LoginServlet" method="post">
Username: <input type="text" name="user">
<br>
Password: <input type="password" name="pwd">
<br>
<input type="button" value="Login User" onclick="LoginAdmin()">
</form>
</body>
</html>
function LoginAdmin() {
$.ajax({
type: 'GET',
url: url + '/RFS/admin/adminlogin?UUID=' + UUID ,
//contentType: 'application/json; charset=utf-8',
jsonpCallback: 'jsonCallback',
cache: true,
dataType: 'jsonp',
jsonp: false,
success: function (response) {
var testdata = JSON.stringify(response);
},
});
}
RESTFUL 服务将根据数据库验证数据,如果成功 我在 HttpSession 中设置一个属性。
session.setAttribute("user","LoggedIN");
在 Application First 下,我编写了一个过滤器,它可以保护 HTML 资源免于在用户未登录的情况下直接访问。
现在在我的过滤器中,我正尝试在我的 servlet 过滤器中使用该会话属性。
但问题是,由于两者都是两个不同的应用程序,因此都有两个不同的会话
所以我得到的会话属性总是 NULL 的原因
public class AuthenticationFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
String uri = req.getRequestURI();
this.context.log("Requested Resource::"+uri);
HttpSession session = req.getSession(false);
if(session == null || !session.getAttribute("user").toString().equals("LoggedIN")){
this.context.log("Unauthorized access request");
System.out.println("Into session is null condition");
res.sendRedirect("login.html");
}else{
System.out.println("Into chain do filter");
chain.doFilter(request, response);
}
}
public void destroy() {
}
}
有什么办法可以解决这个问题吗??
恕我直言,无法在不同的应用程序之间共享会话。但确实可以共享身份验证。它被称为单点登录,一个完整的例子是 CAS.
以下是关于它的概括,分为 3 个部分:客户端(通常是浏览器)、Web 应用程序和身份验证服务器
- 客户端请求需要身份验证的受保护页面
- webapp 重定向到身份验证服务器并引用请求的页面
- 身份验证服务器对客户端进行身份验证,并在特殊的 URL 重定向回 Web 应用程序以使用一次性票证作为请求参数进行票证验证
- Web 应用程序获取票证并向身份验证服务器请求用户参考(通过票证);身份验证服务器查找票证并发回用户信息 - 然后 Web 应用程序可以将用户 ID 放入会话中:客户端在 Web 应用程序上进行身份验证
Web 应用程序中的低级部分由客户端库自动执行。
您可以直接使用 CAS,也可以将其用作如何进行远程身份验证的指南。我强烈建议您查看完整的protocol description,因为此答案只能用作一般介绍。