`
xiaotian_ls
  • 浏览: 304290 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

单点登录—基于cookie的简单实现(IE)

阅读更多

撇开安全性的问题,从实现单点登录的角度来说,cookieIE下的最大的问题就是无法实现跨域共享.

举个例子来说:

AB是两个不同的系统,分布在不同的机器上,ip不同,域名不同,

A:www.a.com b:www.b.com,我最初的想法是如果在A系统登录成功后,访问B一次,让浏览记录BCookie,这样下次访问B的时候可以判断下Cookie,如果有的话,Cookie中取出相关的信息,让其自动登录.但是后来发现这种做法在Firefox下可以工作,但是在IE下不行,后来受了网上一篇介绍搜狐通行证单登录文章的启发,找到了问题的所在,需要Response中加入一段特别的Header. P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR",这样才能正常写入.

 

解决了这个问题,实现思路基本上就理清了.先介绍下我们的系统,j2eessh框架,通过session保存权限信息的,使用Cookie的目的仅仅是为了实现单点登录.还是用上面的例子,步骤如下.

1.     A系统登录成功后的页面上,把需要传到B的信息传到页面上.

String userId = session中取出;

request.setAttribute("userId",userId);//用户名

request.setAttribute("timeout", super.getHttpRequest().getSession().getMax InactiveInterval());//session最大活动时间

 

login成功后的页面

<script type="text/javascript" src="http://www.b.com:8080/job/login!cookie set.ilf?userId=<%=request.getAttribute("userId")%>&timeout=<%=request.getAttribute("timeout")%>"></script>

 

例子中只是将当前用户的账号和cookie活动时间传递到B系统.

 

2.     B系统Cookie写入当前浏览器

String userId = super.getHttpRequest().getParameter("userId");

Integer timeout = Integer.valueOf(super.getHttpRequest().getParameter(" timeout"));

target = new Cookie("SSO_userId",userId);      

target.setPath("/");

target.setMaxAge(timeout);//设置cookie活动时间

super.getHttpResponse().setHeader("P3P","CP=\"NON DSP COR CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa CONa HISa TELa OTPa OUR UNRa IND UNI COM NAV INT DEM CNT PRE LOC\"");

super.getHttpResponse().addCookie(target);

 

返回一个空白页面或者改成从页面上写入都可.

3.     这样A系统登录后浏览器就保存了B系统的Cookie,下次访问B系统时就可以判断Cookie的存在,如果存在,取相关的权限信息存入Session,一定要在鉴权跳转之前判断Cookie.可以通过拦截器实现.

4.     A系统注销后的页面,也要访问B系统的相关链接,B系统的Cookie清除掉.

注销后页面

<script type="text/javascript" src="http://www.b.com:8080/job/login!cookie Clear.ilf?userId=<%=request.getAttribute("userId")%>"></script>

 

B系统

String userId = super.getHttpRequest().getParameter("userId");

Cookie[] cookies = super.getHttpRequest().getCookies();

super.getHttpResponse().setHeader("P3P","CP=\"NON DSP COR CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa CONa HISa TELa OTPa OUR UNRa IND UNI COM NAV INT DEM CNT PRE LOC\"");

    if(cookies!=null)

    {

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

        {

           Cookie c = cookies[i];    

           if(c.getName().equalsIgnoreCase("SSO_userId"))

           {

               userId = c.getValue();

               if(c.getName().equalsIgnoreCase("SSO_userId")

                &&c.getValue().equalsIgnoreCase(userId))

               {

                   c.setMaxAge(0);

                    super.getHttpResponse().addCookie(c);

               }

            }

         }

    }

 

遗留问题:

1.由于是通过session保存权限信息,登录A系统,关闭浏览器,B系统Cookie清除,再次打开浏览器访问A是可以的,但是访问B就不行了,Cookie已清除.

2.登录A系统,一直操作直至保持session不过期,一段时间后B系统Cookie过期被清除掉,A系统仍可以访问。

 

关于这两个问题,结合我们页面用的架构(frameset),有一种方法可以解决,就是在最下面版权页面(最下面frameset)上做工作,session的最大活动时间getMaxInactiveInterval传到页面,利用html meta标签的自动刷新功能根据活动时间定时刷新

<meta http-equiv="refresh" content="<%=request.getParameter("timeout")%>;

url=http://www.b.com:8080/job/login!cookieSet.ilf?userId=<%=request.get Parameter("userId")%>&timeout=<%=request.get Parameter("timeout")%>">

 

 

 

还有一点负面效果,就是浏览器下方状态栏会定时出现一次进度条,一闪而过.  

 

 

多站点整合—单点登录简单方案

http://www.liuyebo.com/archives/200801/458.html

用P3P header解决iframe跨域访问cookie

http://blog.csdn.net/wonder4/archive/2008/02/27/2125804.aspx

分享到:
评论
1 楼 YY008871 2013-03-11  
仅限ie下登录成功或失败吗?

相关推荐

    单点登录系统

    单点登录系统(Single Sign-On, SSO)是一种身份验证机制,允许用户通过一次登录操作访问多个相互关联的应用系统,无需在每个系统中分别输入凭证。这种技术在现代企业架构中广泛采用,以提高用户体验,简化管理,并...

    IE的cookie机制导致的session问题及解决办法.doc

    在使用JSP开发的Web应用中,开发者可能会遇到一个令人困惑的问题:当用户使用Firefox浏览器时,基于Session的单点登录(Single Sign-On, SSO)功能表现正常;然而,切换至IE6浏览器时,初始阶段一切正常,但进行几次...

    ie恢复器DELPHI源码.rar_delphi IE_ie delphi

    【标题】"ie恢复器DELPHI源码.rar" 提供了一套基于Delphi编程语言实现的Internet Explorer(IE)浏览器恢复工具的源代码。在IT领域,源码是理解软件工作原理的关键,特别是对于开发者而言,它能帮助学习特定编程语言...

    易语言删除IE浏览记录源码.zip

    在“易语言删除IE浏览记录源码.zip”这个压缩包中,我们关注的主要知识点是易语言如何操作和删除Internet Explorer(简称IE)浏览器的浏览历史记录。下面将详细探讨这一主题。 首先,我们需要理解IE浏览器的浏览...

    C#做的IE

    标题中的"C#做的IE"可能是指使用C#编程语言开发的一个基于Internet Explorer的项目或控件。这个项目可能是一个自定义的浏览器界面,或者是对Internet Explorer功能的某种封装或者扩展。描述中的“在原来的基础上进行...

    vc++ 应用源码包_1

    实例简单,有用户登录、传输文件、视频、画质调节、禁音检测、回音消除、自动增益、噪音抑制、视频控制等、 VC++搜索指定文件夹中的文件 VC++文件分割、合并工具 自绘了Button、CProgressCtrl、CAutoFont。主要...

    vc++ 应用源码包_2

    实例简单,有用户登录、传输文件、视频、画质调节、禁音检测、回音消除、自动增益、噪音抑制、视频控制等、 VC++搜索指定文件夹中的文件 VC++文件分割、合并工具 自绘了Button、CProgressCtrl、CAutoFont。主要...

    vc++ 应用源码包_6

    实例简单,有用户登录、传输文件、视频、画质调节、禁音检测、回音消除、自动增益、噪音抑制、视频控制等、 VC++搜索指定文件夹中的文件 VC++文件分割、合并工具 自绘了Button、CProgressCtrl、CAutoFont。主要...

    vc++ 应用源码包_5

    实例简单,有用户登录、传输文件、视频、画质调节、禁音检测、回音消除、自动增益、噪音抑制、视频控制等、 VC++搜索指定文件夹中的文件 VC++文件分割、合并工具 自绘了Button、CProgressCtrl、CAutoFont。主要...

    vc++ 应用源码包_3

    实例简单,有用户登录、传输文件、视频、画质调节、禁音检测、回音消除、自动增益、噪音抑制、视频控制等、 VC++搜索指定文件夹中的文件 VC++文件分割、合并工具 自绘了Button、CProgressCtrl、CAutoFont。主要...

    vc++ 开发实例源码包

    C#源码,实现简单游览器。 RangeScan扫描器源代码 ip地址扫描,发送邮箱。 ResizableLib 测试开源界面库Resizable。 RsPicture 自定义了一个图片库,然后引用测试。 SimplePlayer 简单的媒体播放源码。 Skin_...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    WebApp 基于浏览器来实现的一种应用 HybridApp 一种可以下载的Native App,其用户界面的全部或者部分元素在嵌入式浏览器组件(WebView之类的)里面运行 优雅降级 一开始就构建站点的完整功能,然后针对浏览器测试和...

    asp.net web 2.0教程

    ASP.NET Web 2.0是微软推出的一种基于.NET Framework的Web应用程序开发平台,它极大地简化了Web应用的构建过程,并提供了丰富的功能和组件。本教程针对ASP.NET Web 2.0,适合初学者以及有一定基础的程序员进行学习,...

    一份招PHP高级工程师的面试题.pdf

    19. **SSO原理**:通过共享身份验证状态,实现多个系统单点登录。 20. **PHP框架**:如Laravel、Symfony等,解决代码组织、复用和快速开发问题,各有特点。 21. **大流量网站统计**:使用Google Analytics、自建...

    Beginning JavaScript, 4th Edition

    - **ActiveX控件**:在IE浏览器中使用的插件技术。 - **其他插件**:Flash、Silverlight等。 ##### 14. **Ajax** - **Ajax技术简介**:实现局部刷新的机制。 - **XMLHttpRequest对象**:发送HTTP请求和接收响应...

    最新前端面试题

    基于提供的文件信息,我们可以总结出以下几个关键知识点: 1. 组件封装的目的是为了重用、提高开发效率和代码质量,具有低耦合、单一职责、可复用性和可维护性等特点。 2. JavaScript 异步加载的方式有 defer 和 ...

    C#web浏览器

    然而,由于它基于IE内核,可能会受到版本限制,对现代网页支持不足。 2. **Chromium Embedded Framework (CEF)**: 针对WebBrowser控件的局限性,开发者转向了CEF,这是一个开源项目,将Chromium浏览器的核心集成到...

    KODExplorer 芒果云-资源管理器

    ###ver2.61(2014.7.12)... - 支持代码自动补全(基于文档、或自定义的代码快照) - 快速预览功能 - 优化文件保存完美解决。编码自动识别转换。(字符串转义问题。1&#'[{'"+~%25\\\\ ////) - 文件编辑,添加收藏夹 -...

    60个实用的jQuery代码片段.pdf

    以下是从60个实用jQuery代码片段中提取的知识点: 1. **选择器与过滤**:`filter()`方法允许根据指定条件筛选元素集合,如`":not(:has(.selected))"`用于移除包含特定类的元素。 2. **元素引用**:存储已选择的...

Global site tag (gtag.js) - Google Analytics