`

同一tomcat 下的两个应用共享 Session 2 (SSO)

阅读更多

D:\feiHuang\解决方案备份

 

 

1. 在 “%TOMCAT_HOME%\conf\Catalina\localhost" 目前下增加两个xml 文件:

    1) project_a.xml

        <!--

<Context cookies="true" debug="0" docBase="d:/workspace/project_a/web" path="/project_a" reloadable="true" crossContext="true">

</Context>

-->

 

<Context docBase="d:/workspace/project_a/web" path="/project_a" reloadable="ture" crossContext="true" cookies="true">

</Context>

 

    2)  project_b.xml

        <Context className="org.apache.catalina.core.StandardContext" cookies="true" crossContext="true" 

docBase="d:/workspace/project_b/WebContent" path="/Enterprise" privileged="false" reloadable="true" useNaming="true">                 

<Resource auth="Container" name="jdbc/project_b" type="javax.sql.DataSource"

               maxActive="10" maxIdle="5" maxWait="-1"

               username="project_b" password="123456" driverClassName="net.sourceforge.jtds.jdbc.Driver"

               url="jdbc:jtds:sqlserver://project_b:1433;DatabaseName=project_b"

               factory="org.apache.commons.dbcp.BasicDataSourceFactory"/>   

</Context>

 

2.  project_a 在session 里设置参数的时候调用以下代码:

     public static void setGlobalAuthInfo(HttpServletRequest request,

                                         HttpServletResponse response,                                         

                                         User user) {

HttpSession session = request.getSession();

        String sessionId = session.getId();

        Cookie cookie = new Cookie(Constants.GLOBAL_COOKIE_KEY,sessionId);

        cookie.setPath("/");

        response.addCookie(cookie);

        storeCrossContextData(session,user);

        Cookie cookieS = new Cookie(Constants.JSESSION_COOKIE_KEY,sessionId);

        cookieS.setPath("/");

        cookieS.setMaxAge(30*24*3600);

        response.addCookie(cookieS);

        

        Cookie cookieCode = new Cookie(Constants.USERCODE_COOKIE_KEY,user.getCode());

        cookieCode.setPath("/");

        cookieCode.setMaxAge(30*24*3600);

        response.addCookie(cookieCode);

    }

 

    private static synchronized void storeCrossContextData(HttpSession session,User user) {

        ServletContext context = session.getServletContext();

        Hashtable store = (Hashtable)context.getAttribute(Constants.CROSS_CONTEXT_DATA_KEY);

        if (store==null) {

            store = new Hashtable();

        }

        store.put(session.getId(),user.getCode());

        context.setAttribute(Constants.CROSS_CONTEXT_DATA_KEY,store);

    }

 

 3.  在 project_b 里,

        首先检查 project-b 里的是否已经设置好session 属性;如果没有则走以下流程:

 

       先通过以下方法得到 project_a 里的 sessionID,

      private static String getCookie(HttpServletRequest request) {

String id = "";

Cookie[] cookies = request.getCookies();

if (cookies==null) return id;

for (int i=0;i<cookies.length;i++) {

if ("GlobalSessionId".equals(cookies[i].getName())) {

id = cookies[i].getValue();

break;

}

}

return id;

}

 

       再通过以下参数获取登陆用户名,接下来根据登陆帐号从数据库获取相关信息并在 project_b 里的session 里设置好参数。

 

private String getLongName(HttpServletRequest request, HttpServletResponse response) {

String code = "";

String id = getCookie(request);

if ("".equals(id)) return code;

HttpSession session = request.getSession();

ServletContext c = servletContext.getContext("/positec");

if (c==null) return code;

Hashtable table = (Hashtable)c.getAttribute("CrossContextData");

if (table==null || table.size()<=0) return code;

code = (String)table.get(id);

if (code==null) code = "";

return code;

}

 

       

 

 

    

分享到:
评论

相关推荐

    Tomcat 同一服务器上 不同web项目共享session的

    4. **配置共享的Manager组件**:在Tomcat的`conf/context.xml`或每个Web应用的`WEB-INF/web.xml`中,可以指定一个共享的session管理器(Manager)。这样,所有的Web应用都会使用同一个session存储,达到共享目的。...

    tomcat7+redis单点 session共享jar

    本资源"tomcat7+redis单点 session共享jar"提供了针对Tomcat7服务器和Redis数据存储的一个解决方案,以实现跨服务器的session共享。 **Tomcat7** 是一个广泛使用的开源Java Servlet容器,它实现了Java EE的Web应用...

    nginx+tomcat8.+redis__session__单点登录、会话共享.zip

    标题中的"nginx+tomcat8.+redis__session__单点登录、会话共享"涉及到的是在分布式系统中如何实现用户会话(Session)的共享和单点登录(Single Sign-On, SSO)的问题。这里主要涉及到三个核心组件:Nginx、Tomcat和...

    Form实现同一服务器下的SSO

    总之,Form实现的SSO通过集中式的认证服务和票据机制,实现了在同一服务器下多应用之间的无缝登录体验。虽然涉及到的步骤和配置较多,但一旦设置好,可以极大地提升用户体验,简化管理。对于开发者来说,理解和掌握...

    基于共享内存的SSO

    【标题】"基于共享内存的SSO"技术是一种在多进程环境下实现单点登录(Single Sign-On,简称SSO)的有效方法。它利用操作系统提供的共享内存机制,使得用户登录信息可以在不同的进程之间共享,从而避免了用户在访问多...

    asp.net 跨子域共享SESSION

    在实际应用中,通常会结合单点登录(Single Sign-On, SSO)系统来实现跨子域共享Session。SSO允许用户在一个子域登录后,其他子域无需再次登录即可访问。实现SSO时,Session共享是关键组成部分,通常会结合Cookie或...

    跨域共享session (实现http跳转https 共享session)

    但是,为了提供更好的用户体验,特别是在单点登录(Single Sign-On, SSO)场景下,跨域共享session变得非常重要。 **一、跨域共享session原理** 1. **JSONP(JSON with Padding)**:JSONP是一种早期的跨域解决方案...

    tomcat配置ssl-单点登录(sso).rar

    2. 配置CAS客户端:在每个需要SSO的应用(即Tomcat上的Web应用)中,配置CAS客户端库,如jasig-cas-client,修改`web.xml`文件,设置相关参数如CAS服务器URL和服务验证URL。 3. 跨域配置:如果应用分布在不同的域下...

    SSM项目集成shiro搭建session共享

    7. **Shiro-Redis**:Shiro-Redis2.9是Shiro的一个扩展,它将session数据存储在Redis缓存中,解决了在分布式环境下的session共享问题。Redis是一个高性能的键值数据库,具有丰富的数据结构支持,适合存储session这样...

    spring-session实现session共享

    5. 应用启动后,所有Session数据将自动存储在Redis中,不同应用可以访问同一份Session数据,实现SSO。 通过Spring-Session与Redis的配合,我们可以轻松地在分布式环境中实现Session的共享,让单点登录成为可能。这...

    J2EE限制同一账号同一时刻只能一个用户登录使用,向QQ一样

    2. **Session标识存储**:服务器将生成的Session ID返回给客户端,客户端通常将其存储在Cookie中。这样,后续请求时,客户端会携带这个Session ID,服务器通过这个ID找到对应的Session。 3. **Session监控**:...

    laravel实现共享session案例.docx

    - 要使两个不同源的网站能够共享 Session,还需要处理浏览器的同源策略限制。可以通过设置 `CORS`(Cross-Origin Resource Sharing)头部允许跨域请求。 7. **安全注意事项**: - 使用相同的 `APP_KEY` 可能会...

    SSO跨域单点登录Demo

    在这个Demo中,我们有两个Web应用,SSOWebDemo1和SSOWebDemo2,它们都需要共享同一个登录状态。这两个应用的配置应该允许它们信任中央认证服务器,即SSOAuth。当用户首次尝试访问任一应用时,如果尚未登录,会被引导...

    SSO单点登录【基于cookie二级域名下跨域共享】

    SSO(Single Sign-On)单点登录是一种身份验证机制,允许用户在一次登录后访问多个相互关联的应用系统,而无需再次进行身份验证。在基于Cookie的二级域名下跨域共享SSO实现中,核心概念是利用Cookie的特性来实现用户...

    nginx+redis实现session共享

    为了实现单点登录(Single Sign-On, SSO)以及跨应用的session共享,我们可以结合使用Nginx作为反向代理服务器,以及Redis作为持久化内存数据库来存储session数据。下面将详细解释这个解决方案的各个方面。 首先,...

    基于Tomcat6的CAS SSO配置

    基于Tomcat6的CAS SSO配置涉及的主要知识点包括SSO(Single Sign-On,单点登录)、CAS(Central Authentication Service,中心认证服务)、SSL(Secure Socket Layer,安全套接层)以及Tomcat服务器的配置。...

    PHPSSO是用PHP开发的单点登录系统。在接入PHPSSO的多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。PHPSSO可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制,是目前比较流行的企业业务整合的解决方案之一。

    如果验证成功,服务器会生成一个唯一的会话标识(Session ID)并加密,然后将其返回给请求的应用系统。 3. 会话同步:应用系统收到加密的会话标识后,将其解密并存储在本地,同时设置用户已登录状态。此时,用户在...

    PHP在同一域名下两个不同的项目做独立登录机制详解

    总结来说,要实现PHP在同一域名下两个不同项目的独立登录机制,关键在于修改默认的session_name或session_id。这可以通过在每个项目中单独设置session_name或使用自定义session_id来实现。通过这种方式,每个项目...

    单点登录(SSO)-同域名、不同域名

    2. **Session共享**:虽然各应用系统间默认不会共享Session,但可以通过多种方式实现Session的共享,如使用Spring Session等技术方案。这种方式确保了无论用户访问哪个子系统,都能够读取到SSO系统中的登录状态,...

    开发阶段:需要session共享做开发测试

    在开发过程中,尤其是在多服务或分布式系统中,有时我们需要在不同的服务器或应用之间共享Session来实现用户状态的保持。这通常发生在需要进行联合登录、单点登录(SSO)或者跨域资源共享(CORS)的场景。标题"开发...

Global site tag (gtag.js) - Google Analytics