如何在同一服务器下运行两个不同的应用程序使用相同的HTTPSession

时间:2015-01-07 18:49:19

标签: session servlets sharing

我在同一个服务器(Tomcat 7)下运行了两个应用程序

在First Application下我有一个包含用户名和密码字段的登录页面。

点击登录按钮,我正在调用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资源免于直接访问而无需用户登录。

现在在我的Filter里面,我试图在我的servlet Filter中使用该session属性。

但问题在于,两个不同的应用程序都有两个不同的会话

所以我得到的会话属性总是为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() {
    }
}

我们有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

恕我直言,不可能在不同的应用程序之间共享会话。但确实可以共享身份验证。它被称为单点登录,其完整示例为CAS

以下是有关它的一般信息,包括3个部分:客户端(通常是浏览器),Web应用程序和身份验证服务器

  • 客户端要求提供需要身份验证的受保护页面
  • webapp通过对所询问页面的引用重定向到身份验证服务器
  • 身份验证服务器对客户端进行身份验证,并使用一次性票证作为请求参数,在特殊URL处重定向回Web应用程序以进行票证验证
  • Web应用程序获取票证并向验证服务器请求用户引用(传递票证);身份验证服务器查找故障单并发回用户信息 - 然后,Web应用程序可以将用户ID放入会话中:客户端在Web应用程序上进行身份验证

Web应用程序中的低级部分由客户端库自动执行。

您可以直接使用CAS,也可以将其用作如何进行远程身份验证的指南。我建议您查看完整的protocol description,因为这个答案只能用作一般性介绍。