java单点登录在校园身份管理系统中的实现

摘要:

一个学校或企业的内部有很多信息系统,用户登录这些系统时需要进行身份认证。传统的认证机制是基于用户名和密码的,每一个系统都建立有自己的用户信息数据库,用来验证用户的身份。对于一个要访问处于不同系统中资源的用户,每进入一个系统就要登录一次,这无疑会耗费大量的时间,同时用户也需要记忆大量的账号信息。

单点登录系统就是为了解决这样一个问题而产生的,它把实际用户映射成一个电子身份,并可以将其安全、高效地传递给各个系统。这样,用户只需要参与一次身份认证过程,获得其电子身份标识。以后单点系统自动将该身份标识传递到各个系统进行身份认证,从而使用户可以高效地访问各个系统中的资源,提高工作效率。

本文阐述了单点登录的概念,优势,以及单点登录在基于Sun ONE的校园身份管理系统中的实现。

关键字:

单点登录

跨域单点登录

网络身份

轻量级目录访问协议

身份认证服务器

目录服务器

    

 

第一章 绪论... 1

1.1 项目背景... 1

1.2 系统介绍... 1

1.3 本文的工作... 2

第二章 网络身份管理策略... 3

2.1网络身份的内容... 3

2.2 身份管理的发展... 4

2.3 Sun开放网络环境概述... 9

第三章 系统结构... 11

3.1 系统环境... 11

3.2 功能设计... 12

第四章Sun ONE Identity Server 应用分析... 14

4.1 Sun ONE Identity Server 简介... 14

4.2 Sun ONE Identity Server 的基本组件... 14

4.3 Sun ONE Identity Server API 分析... 16

4.4 Sun ONE Identity Server特点以及扩展... 18

第五章SSO在校园身份管理系统中的实现... 20

5.1 单点登录(SSO)的实现... 20

5.2 跨域单点登录(CDSSO)的实现... 22

5.3 Web服务的部署... 23

5.4校园身份管理系统中单点登录的具体实现... 24

5.5 校园身份管理系统中单点登录的测试... 32

第六章 总结与展望... 36

6.1 总结... 36

6.2 系统的不足与展望... 36

  ... 37

参考文献... 38

第一 绪论

1.1 项目背景

近年来,Web技术在政府、公司、学校中的使用已经出现了爆炸性的增长,通过Web提供的信息和应用越来越多。随着Web的使用进入成熟阶段,成功地管理和保护部门的Web资源已经成为一个越来越复杂的挑战。

身份认证管理是保护部门Web资源的核心部分。如今,内部网络登录服务、各种组织、商业服务等要求身份认证的需求者将一个人在网络上的身份分割成许多独立的碎片。这些碎片构成了繁多的一对一的客户服务关系,导致了更多的安全风险。

以学校为例,一个学校的内部有很多的信息系统,如学籍管理系统、电子邮件系统、文件共享服务器、成绩管理系统、图书馆信息系统等,每个用户在这些系统上都有账号,以前他们需要在每个系统上配置为各个账号分配的权限,由于系统过多,很容易出现遗忘,出现过用户被分配过高权限后没有及时修改的现象,发生了信息泄露的问题,影响了系统的安全。同时每个用户都需要记住自己在各个系统上的用户名和密码,众多用户同时面对多个系统要重复输入账号、口令等信息,不仅烦琐,更重要的是容易出现口令丢失,给系统和用户造成损失。因此,信息系统急需有一个统一的、具有较高安全控制的身份验证和授权系统,以保证数据安全和用户操作方便。

1.2 系统介绍

基于Sun ONE的校园身份管理系统很好的解决了上述问题,它使用Sun ONE的身份认证服务器,目录服务器,采用单点登录(single sign-on,SSO)的策略。当用户访问多个需要认证的系统应用时,只需要初始进行一次登录和身份认证,就可以访问具有权限的任何系统,而不需要再次登录,后续系统会自动获取用户信息,从而识别出用户的身份。这样,无论用户要访问多少个应用,他只需要进行一次登录,而不需要用户重复输入认证信息。单点登录技术可以简化用户访问多种系统应用,避免用户由于需记忆众多账号信息而出现的遗忘,而且可以减少口令等重要信息在网络传播时被截获的危险。

该系统有很好的用户权限控制粒度,可以整合学校的各种系统,如学籍管理系统、电子邮件系统、文件共享服务器、成绩管理系统、图书馆信息系统等的各种认证信息存放于单一的身份认证服务器中,实现单点认证,全局应用。用户在一点认证就可以根据权限访问整个学校的所有资源。比如用户在登录图书管理服务器时进行了认证,整个系统就知道了给用户的身份,该用户在使用电子邮件服务和文件共享服务时就不需要再认证了,系统会根据他的身份赋予相应的权限;管理员可以在一点改变所有系统上用户的权限,例如管理员通过统一的管理终端将某用户分配特定系统的权限,不用再到各个系统分别配置。

1.3 本文的工作

本文分几个部分介绍了单点登录(SSO)在基于Sun ONE的校园身份管理系统中的实现。第一章,绪论,介绍了项目背景和系统所解决的问题;第二章,介绍了网络身份管理策略和身份管理的发展情况;第三章介绍了基于Sun ONE的校园身份管理系统的系统结构;第四章分析了Sun ONE Identity Server的特点及扩展;第五章详细描述了单点登录在基于Sun ONE的校园身份管理系统中的具体实现;第六章,总结与展望,总结了系统的优缺点,以及今后的改进方向。

第二章 网络身份管理策略

2.1网络身份的内容

身份管理是一个发展很久的名词,在以前的描述中,身份管理曾经被简单地认为是目录管理,或者简单地对用户身份进行数据库式的线性管理。现在,真正的身份管理,已经发展为包含认证机制、密码管理、Web和企业网上的一次性登录(SSO)、账号管理、集成身份访问控制等非常全面的企业安全技术。身份管理包括两部分内容:身份识别和访问控制。

身份识别管理需要集中并自动实现用户账号和批准工作流的创建,从整体角度设置IT和非IT资源,并通过流程自动地降低成本。借助集成化的一次登录和个性化的门户自服务(包括密码重置),也提升了用户的生产效率。由于有了能够满足当前及未来企业需求的功能强大的身份鉴别和识别存储支持,身份识别管理可以管理企业身份识别的各个环节。从员工工作、合作伙伴签约或客户访问系统开始,它就追踪和管理并自动实现所要求的系统访问变更,并且启动所有的工作流和批准过程。

通过提供一次登录,可自动实现安全地访问基于浏览器、客户机/服务器以及传统设备的应用程序,并且可消除当今IT安全领域最大的、造成高额成本支出的安全难题——持有多个ID的密码问题。

实现网络身份的有效识别何管理需要有强大的存储库,并借助接近实时的查找功能来管理成千上万的用户。管理用户合理的访问企业当前庞杂的资源是一项复杂工作,员工、企业合作伙伴及客户通常跨不同平台和操作系统,需要安全地访问关键业务应用。管理访问意味着对被认证的用户访问的所有类型资源进行控制,确保强大的安全策略始终如一地应用到所有相关人员。

访问管理解决方案通过集中和强化端到端的安全性,确保业务关键型资源的安全,而无需受限于操作系统、平台和业务应用以及是否是Web资源。借助主动的动态安全措施,解决方案能提供最强大的保护,在防止内部破坏和外部攻击的同时,全面监控IT和物理访问设备的访问违规。

2.2 身份管理的发展

身份管理系统近些年发展很快,现在有扩大范围的趋势。身份认证技术已经逐渐由传统的多点登录向集中式单点登录方向发展,同时身份也不只局限在一个公司内部,公司之间联合身份认证已很热门。联合身份认证解决如何在公司之间实现单点认证,涉及到多个身份管理服务器互相交互,建立信任管理的问题。

身份管理的发展趋势如图21所示:

在解决认证和单点登录(SSO)问题方面,很多流行的新技术被采用,这其中包含Kerberos、公用密钥基础结构(PKI),结合了XML标准以及Web Service 安全规范的标准也正在被制定,这是未来发展的一个方向。

2.2.1 传统的用户登录模式

传统的认证机制是基于用户名和密码的,每一个系统都建立有自己的用户信息数据库,用以验证用户的身份。用户要访问n个系统就需要在n个系统中建立n个帐号。当其要访问一个系统中的资源时,用户首先要登录进入该系统,如果他同时要访问处于多个系统中的资源,用户就不得不按照各个系统的要求分别登录进入相应的系统。

这种情况在网络广泛应用的单位中更为明显。例如在一个大型的公司里,职员要访问技术文档、查看个人工资情况、使用邮件服务等就要分别登录到技术文档服务器、企业员工工资管理系统、邮件服务器等。用户会输入相应的帐号来登录进入这些系统。对于繁多的用户帐号,大多数用户会选择简单易一记的用户名和密码,甚至有人把用户帐号写在字条上,以防忘记;更有人为了避免重复登录系统,干脆在不使用服务的情况下也不退出系统。这样的系统既增加了用户的负担,也容易导致违反基本安全策略的事件发生,使系统更容易受到攻击,降低了系统的安全性。有资料显示,典型的网络用户一般每年在登录到网络应用程序上要花费44小时。更有甚之,70%帮助小组电话都与密码遗忘有关,可见,传统的认证机制耗费了大量的人力物力,仍然不能很好地满足人们的对网络应用高效、安全的需要。

从技术上分析,传统的认证机制有着严重的安全问题。首先,用户名和密码信息会在网络上传送,且常常为明文传送,这就很容易被攻击者截取到,假扮合法用户来攻击系统。另外,在一般的系统中,密码一般由长度不长的字符组成,用户为了方便记忆往往会选用一些更为简便的密码形式,这很容易遭受到密码猜测的攻击,尤其是基于字典方式的攻击往往非常有效。如果强迫用户使用复杂的密码,则用户很可能将密码写在便条上,以便查阅,这样更大大增加了密码泄露的可能性,安全仍然难以得到保障。由于用户账号是不断重用的,这样为重播攻击提供了条件,攻击者只要记录下上一次用户的登录数据,以后他就可以原封不动的使用该数据来假扮合法用户通过系统的认一证,破坏系统。  

同样对网络管理员来说,这样的系统会使他们的工作量大大增加。因为每个系统都保存有自己的用户信息数据库。例如当公司新增了一名员工,管理员就要在该员工有权访问的所有系统中逐个为该员工建立账号。当该员工离开公司后,管理员又要在各个系统中将其账号删除,工作量无疑是巨大的,而且很难避免某些遗漏。因为网络管理员并不知道用户到底在多少个系统中建立了自己的账号,只能逐个检查,很容易忘记在某个系统中删除该员工账号,这样就会留下安全隐患。

分析其原因,这一切都是由于分散的用户管理造成的,各个系统间没有联系。用户在现实世界中的身份通过账号映射成为网络世界中的用户身份标识,但用户的这种身份标识是分别被每个系统分别保存的,无法互相传递。这就迫使用户在进入每一个系统时都要重新提交自己的身份标识,来通过系统的认证。其概念结构如图2-2所示:

 

总之,基于效率和安全的因素,人们必须改变传统的认证机制,设计出一个更为高效、安全的网络认证机制,来简化人们访问网络中各种资源的过程。

2.2.2 单点登录模式

单点登录,即SSOSingle Sign-On),SSO的机制就是在企业网络用户访问企业网站时作一次身份认证,随后就可以对所有被授权的网络资源进行无缝的访问,SSO 可以提高网络用户的工作效率,降低了系统出错的几率,但是比较难于实现。

单点登录系统就是用户只需要在网络中主动地进行一次身份认证过程,然后就可以访问其被授权使用的所有处在网络上的资源而不需要其主动参与其后的身份认证过程。这些服务资源可能处在不同的计算机环境中,用户以后的身份认证是系统自动完成的。在此系统中,管理员无需修改或干涉用户登录就能方便的实施希望得到的安全控制。这是一个为了能够在分布式计算机环境中,安全和方便地鉴别用户而产生的课题。

在这里,网络的资源可以是打印机或其它硬件设备,也可以是各种厂创利程序和文档数据等等,这些资源可能处于不同的计算机环境中。

单点登录系统从根本上不再使用基于用户名和密码的身份认证机制,而是采用结合了密码学技术的新的身份认证机制。新的身份认证机制可以大大提高系统的安全性,同时也可以保证用户的电子身份标识可以安全、高效地在网络之间传递。

其次,单点登录系统把原来分散的用户管理,集中起来了。各个系统之间依靠相互信赖的关系来进行用户身份的自动认证。用户的账号信息是集中保存和管理的,管理员只需要在统一的用户信息库中添加、删除用户账号,不必在多个系统中分别设置用户信息库。由此可见单点登录系统的优点有:

1.提高工作效率。用户不再需要每访问一个服务资源就进行一次身份认证过程,从而使用户有更多的时间从事有益的工作。同时这样也可以使帮助人员从为用户找回密码的繁重工作中解脱出来。

2.更好的网络安全性。系统中使用的身份认证机制使用了加密等多种方法,可以防止大部分的网络攻击。同时由于新的身份认证机制使用户的账号信息记忆量减少,使系统由于用户机密信息的泄露而导致安全事故出现的机会大大减少。

3.更有效的管理。用户的账号数据统一保存,网络管理员只需要在一个用户信息库中对用户的账号信息进行操作,减少了他的工作量和由于马虎造成的安全漏洞,提高其工作效率。

其概念结构如图2-3所示:

单点登录分为域内单点登录和跨域单点登录(Cross Domain SSO)。同一个企业可能有不同的域名,如微软有microsoft.commsn.comhotmail.com等不同的域名,如果需要要在多个不同的域之间实现单点登录,就会用到跨域单点登录。

2.2.3 联合身份认证

身份管理系统近些年发展很快,现在有扩大范围的趋势。身份不只局限在一个公司内部,公司之间联合身份认证解决如何在公司之间实现单点认证现已很热门。

为了促进网络身份认证项目的顺利推广,20019月,由HPCisco等十多家IT知名企业以及美国30多家著名大企业发起组成了自由联盟(www.projectliberty.org),自由联盟旨在开发和部署开放的、客户操作的网络身份认证标准。该联盟在征求各方意见的前提下,于20027月推出了Liberty 1.0 版规范,这是这个成立不到一年的跨行业共同体制定的第一套开放性联合身份认证规范。

在这种联盟下,用户只用登录过任何一个联盟参与者的服务网站或终端,并许可联盟内的其他参与者可以获得自己信息,就可以按照系统返回的ID号码,在联盟企业中任意访问,而不用重新登录。这样,很多重复的工作就由联盟在后台完成了,给用户带来了真正的方便。

举一个简单的例子。美联航和花旗银行都是自由联盟的发起者。如果某个用户希望用花旗银行的信用卡购买美联航的机票,那么他只用登录过一次美联航的网站或者电话通知他的个人信息及所需机票要求,美联航就会为他出票并按照自由联盟协议,自动到花旗银行该用户信用卡上将机票费用划走。联合身份认证将成为今后网络身份认证的一种必然趋势。

联合身份认证解决如何在公司之间实现单点认证,涉及到多个身份管理服务器互相交互,建立信任关系的问题。

2.3 Sun开放网络环境概述

在网络身份认证领域,支持单点登录的产品很多,有Microsoft公司的Passport解决方案,有Sun公司的Sun ONE解决方案,有IBM公司的WebSphere解决方案。在这个校园身份管理系统中,我们选择Sun ONE,因为Sun ONE遵循而自由联盟提出的Liberty 1.0 版规范,这是一套开放性联合身份认证规范。Sun ONE 网络身份认证平台便利于提供开放和安全的授权和身份验证服务、简化访问方式以及提高生产效率。

Sun ONE的全称是Sun Open net Environment,也就是Sun开放网络环境,它是Sun整合了其门下所有软件产品后的成果。Sun ONESun Microsystems的标准软件理念、体系结构、平台和专业技术,用于开发和部署定制服务。Sun ONE体系结构支持定制服务应用及服务的创建和交付。Sun ONE网络身份认证平台包含支持自由规范的 Sun ONE Identity ServerSun ONE Directory Server以及 Solaris 9 操作环境。它还包含 Sun 公司硬件以及新合作伙伴提供的服务。

所谓的开放,就是无论运行在何种硬件平台下,都可以按照统一的标准进行整合和规划。Sun ONE品牌下面有从基础的操作系统环境到高端的门户服务、目录服务等全线产品,为传统企业信息化提供全套工具。企业原有资源、系统经过Sun ONE延伸,有了良好的集成和统一的接口。

Sun ONE强调的是开发与配置按需服务,它为企业量身搭建符合他们需求的信息系统架构,帮助他们实现内部的有效管理,实现对外与合作伙伴及用户的沟通。在这样一种结构下,企业可以降低成本,降低复杂性,提高资产回报率。 该平台支持且适用于由自由联盟计划(Liberty Alliance Project)推出的联合网络身份认证的Liberty Alliance 1.0 技术规范。以支持Liberty Alliance 1.0 技术规范为特色,Sun ONE不仅有助于商业机构和非商业机构维护其重要身份信息的保密性,同时还从经济上受益于网络联合身份认证的业务合作伙伴。

第三章 系统结构

3.1 系统环境

3.1.1前端系统

(1) 开发环境:

(a) 硬件环境:

普通PC机:奔腾2.4G Hz CPU512M DDR内存,17寸纯平显示器、显存64M80G硬盘

(b) 软件环境:

操作系统:    Windows 2000 Server SP4 , IE6.0SP1

 (2) 运行环境:

(a) 硬件环境:

普通PC机:CPU 主频500MHz以上、内存频率128MHz以上

(b) 软件环境:

WINDOWS系列操作系统 IE5.0以上

3.1.2后台系统

(1) 开发环境:

(a) 硬件环境:

普通PC机:奔腾2.4G Hz CPU512M DDR内存,17寸纯平显示器、显存64M80G硬盘

 (b) 软件环境:

操作系统:Windows 2000 Server SP4

服务器: Sun ONE Application Server 7.0Sun ONE Directory Server 5.1Sun ONE Identity Server 6.0

数据库:PointBaseMySql

开发语言:Java(JSPServletJavaBean)HTMLJava ScriptSQL

开发工具和编译器:Sun ONE Studio5.0JDK1.4.2

(2) 运行环境:

(a) 硬件环境:

普通PC机:CPU 主频2G Hz 以上,内存512M以上

 (b) 软件环境:

操作系统:Windows 2000 Server系列

服务器: Sun ONE Application Server 7.0Sun ONE Directory Server 5.01Sun ONE Identity Server 6.0

数据库:PointBaseMySql

3.2 功能设计

3.2.1 系统拓扑结构:

系统采用当今流行的B/S结构,使用Sun ONE Application Server作为应用程序服务器,Sun ONE Identity Server作为身份管理服务器,Sun ONE Directory Server作为身份存储库。如图31所示:


3.2.2 功能设计:

基于Sun ONE的校园身份管理系统的功能模块如图32所示:


该校园身份管理系统包括3个子系统:

l         身份管理子系统:具有用户信息管理、身份认证、权限分配等功能

l         图书管理子系统:配合实现单点登录的子系统

图书管理系统中有两种用户:图书馆管理员和普通读者

图书馆管理员具有:图书管理、借书管理、还书管理、罚金管理、读者管理、基本代码维护、查询等权限

普通读者具有:读者信息查询、图书信息查询、已借图书信息查询等权限

l         校园邮件子系统:配合实现单点登录的子系统

邮件系统具有:收信、发信、管理信件等功能。每个用户有四个个人文件夹,分别是收件箱、发件箱、草稿箱、回收站,用于邮件的管理。

第四章Sun ONE Identity Server 应用分析

4.1 Sun ONE Identity Server 简介

Sun ONE Identity Server 6.0是业界第一个基于开放性标准的网络认证解决方案。它采用了Java技术,遵循Liberty联盟原则,符合SAML(安全断言标记语言)XML(可扩展标记语言)的技术规范。Sun ONE Identity Server 6.0也是第一个商用的身份认证管理解决方案。它将身份认证管理、访问管理、委托管理、目录服务和联盟服务等都集成到一个产品中。作为Sun全方位的身份认证解决方案中的一个关键组件,Sun ONE Identity Server 6.0建立在Sun ONE目录服务器的基础之上,并利用了Sun ONE Meta Directory的整合能力。

这一Sun ONE身份认证服务器通过降低应用开发、安全管理和桌面员工安置的费用,大大减少了企业的IT成本。

Sun ONE Identity Server 6.0的一个关键性能是,可以能通过SAMLLiberty的技术规范,完成内、外部对机构防火墙的联合认证。现在,越来越多的客户选择Sun为其提供具有高缩放性和可用性的解决方案。这既保护了他们原有的投资,又为他们开辟了新的业务途径。

作为Sun开放网络(Sun ONE)环境中必不可少的组成部分,Sun ONE身份认证服务器(旧称iPlanet目录服务器访问管理版)包括身份管理解决方案所具有的核心组件:

l         在多个Web和应用服务器之间实现安全访问控制。

l         具有委托功能的集中管理特性。

l         用于存储身份的高性能、高可用性以及高可扩展性存储库。

身份认证服务器软件有助于解决现今商业挑战,同时为执行下一代战略做好充分准备。

4.2 Sun ONE Identity Server 的基本组件

Sun ONE身份认证服务器包含三个关键性身份管理组件:策略服务、管理服务和身份存储库。

l         策略服务:集中实施访问,并针对基于Web的资源提供单点登录功能。

l         管理服务:可扩展、集中地进行身份、策略和服务管理(可以委托)。

l         身份存储库:使用Sun ONE Directory Server5.1 ,作为存储身份认证策略和服务信息的存储库。各种机构都可以重复利用现有身份,而不是针对每项新服务重新输入数据和进行过多的管理工作。

(1)     策略服务

Sun ONE身份认证服务器取用一种公用身份验证和授权基础结构取代在单独的Web服务器和应用服务器上进行临时的和针对应用的身份验证和授权方法。

管理员可以通过每个用户一个帐户的原则针对多项服务集中执行访问控制。可以给每个用户分配一个或多个角色,这有助于简化针对大规模但成份不同的群体的管理。单点登录授权服务使用户能够访问多个服务器上的所有其有权访问的Web资源(即使是在不同DNS域中),而无需进行多次身份验证。

Web单点登录(SSO):用户一旦通过某项服务的身份验证,就可以使用其他已授权的Web服务,而无需针对每项服务重新进行身份验证。SSO是通过一个发送到用户的Web浏览器的令牌来实现的。此令牌可以是标准的浏览器CookieULR重写功能。

身份验证:各种机构可以选择各种身份验证方法,从简单的用户名和密码、像RADIUSSafeword令牌卡这样的企业方法,到PKI证书。可以把身份验证方法链接在一起来增强安全性。支持的身份验证方法包括:

l         LDAP用户ID/密码

l         x.509v3数字证书

l         RADIUS

l         SafeWord令牌卡

l         UNIX身份验证服务

l         匿名

公用的服务提供商接口(SPI)可以用来增加其他身份验证方法。

授权和角色:管理员通过应用到在Sun ONE目录服务中建立的角色的策略控制身份验证和授权。策略定义基于URL的资源(网页、应用或服务)的访问。角色与策略相关连,用来指出该角色可以提供何种服务,以及该角色控制哪一组用户的访问权限。

(2)     管理服务

Sun ONE身份认证服务器包括基于Web浏览器的可扩展的用户身份、策略和服务管理。可以针对多个Web服务器和应用服务器集中管理,但也可以将管理委托给其他管理员(如本地组管理员和外部合作伙伴),甚至可以委托给最终用户。委托功能允许顶级管理员把管理工作量和成本直接分配给各个业务单位、部门和最终用户。

委托模式具有极高的可配置性,因而允许基于用户组以及基于允许管理的用户的特征进行委托。例如,部门管理员可以具有管理该部门内几乎任何方面的权限,而电子邮件管理员则可以获得仅管理与电子邮件用户的电子邮件相关的设置的权限。

另外,还支持自我管理功能,该功能允许最终用户管理其配置文件,例如,更改密码或更新其家庭地址。此功能有助于节约管理成本。

(3)     身份存储库

Sun ONE身份认证服务器包含有Sun ONE Directory Server,作为身份存储库,提供一个存储用户信息以及角色、访问控制和客户应用程序配置数据的公用存储区。它还具有把数据项组织成为树型结构以及从逻辑上把数据项组织成为动态组。

       Sun ONE Directory Server的特点包括:

l         针对每个系统支持数百万个项目的多数据库体系结构。

l         双向多主复制,实现高可用性,从而消除单一故障点。

l         联机备份、配置更改和架构更新,实现对关键任务服务进行24x7支持。

4.3 Sun ONE Identity Server API 分析

Sun ONE Identity Server的提供了一系列Package,用于实现身份管理,这些Package包括:

com.iplanet.am.sdk,

com.iplanet.am.util,

com.iplanet.log,

com.iplanet.services.cdm,

com.iplanet.sso,

com.sun.identity.authentication,

com.sun.identity.authentication.spi,

com.sun.identity.log,

com.sun.identity.log.spi,

com.sun.identity.policy,

com.sun.identity.policy.client,

com.sun.identity.policy.interfaces,

com.sun.identity.saml,

com.sun.identity.saml.assertion,

om.sun.identity.saml.common,

com.sun.identity.saml.plugins,

com.sun.identity.saml.protocol,

com.sun.identity.saml.xmlsig,

com.sun.identity.sm, com.sun.liberty

其中用于单点登录的最主要的Packagecom.iplanet.sso,下面我来详细介绍一下这个Package中的主要类和方法:

Package com.iplanet.sso

Interface Summary

SSOToken

The SSOToken class represents a "single sign on"(SSO) token.

SSOTokenEvent

The SSOTokenEvent class represents an SSO token event.

SSOTokenID

The SSOTokenID class is used to identify an SSOToken object.

SSOTokenListener

The SSOTokenListener interface needs to be implemented by the applications to receive SSO token events.

  Class Summary

SSOTokenManager

The class SSOTokenManager is a final class that provides interfaces to create, get, and validate SSOTokens.

  Exception Summary

SSOException

An SSOException is thrown when there are errors related to SSOToken operations.

 

SSOToken类代表一个单点登录的令牌(Token)。它包含 SSO 令牌相关的数据,例如认证方法,认证水平,发送请求的客户端(浏览器)的主机名,也包含Session相关的信息,例如最大的Session时间,最大的Session空闲时间和当前Session空闲时间。

SSOTokenEvent 类代表一个 SSO 的令牌事件,即SSO令牌的改变。下列各项是可能的 SSO令牌事件类型: SSO_TOKEN_IDLE_TIMEOUT(超过最大Session空闲时间),SSO_TOKEN_MAX_TIMEOUT 超过最大Session时间)以及 SSO_TOKEN_DESTROY(令牌被销毁)。

SSOTokenID 类用来识别一个 SSO令牌对象。它包含一个随机的字符串和服务器的名字。SSOTokenID中的随机的字符串在一个给定的服务器上是唯一的。

SSOTokenListener当一个SSO令牌事件到达时,SSOTokenListener对象开始生效。这时, SSOTokenListener 对象中的ssoTokenChanged()方法就会被应用程序所调用。

SSOTokenManager类是一个Final类,不能够被继承,它提供接口创建,获取,并且验证SSO的令牌是否有效。它是一个Singleton,我们可以调用 SSOTokenManager.getInstance() 方法来获得这个类的实例。

SSOException:当有关SSOToken的错误发生时,会抛出SSOException异常。

4.4 Sun ONE Identity Server特点以及扩展

l         一致的安全性——整合的身份验证服务使各种应用能够使用所有受支持的身份验证方法,而不是针对每个身份验证方法的各种应用逐个添加支持。Sun ONE身份认证服务器取代了针对实施Web资源访问的临时性和一次性访问控制。与单独推出的Sun ONE Web代理服务器(旧称iPlanet Web代理服务器)一起使用,Sun ONE身份认证服务器可以为几乎所有Web通信提供统一的保护——而不考虑是何种平台或应用程序。

l         强大的安全性——通过提供单点进行所有身份验证尝试,可以检测到并阻止强力(brute-force)攻击,从而可以提高整体安全性。利用Sun ONE身份认证服务器,可以根据各个帐户失败的身份验证尝试总数来实施帐户封锁,而不管进行每次尝试所用的身份验证方法(用户ID/密码、硬件卡等)是什么。此功能可防止攻击者根据每种身份验证方法进行无限次数的尝试。所有日志文件数据(如身份验证、授权和管理事件)都可以整合到一个符合JDBC技术的数据库。报告和监视产品——从通信分析到侵入窃密检测——都可以从第三方供应商获得。

l         通过单点登录提高了工作效率—— Web单点登录方法允许用户仅需登录一次即可访问其经过授权的多种应用,从而提高了用户的工作效率。这有助于通过减少向咨询台请求重设密码的呼叫来降低管理成本。

l         降低管理成本——大型用户群体和许多应用会使管理面临严峻挑战。Sun ONE身份认证服务器的策略驱动型管理方式是对企业级权限进行集中式管理,与对每个用户实施管理的方式不同的是Sun ONE身份认证服务器只向用户分配一个角色或多个角色,并通过与角色相关的策略来管理对应用的访问。另外,Sun ONE身份认证服务器为管理员提供了向其他管理员(甚至最终用户)委托管理权限的能力。这使管理大规模雇员、客户和合作伙伴群体更为容易。

l         公用身份认证平台——通过一个公用的并可复用的身份管理层,各个公司可以把时间花费在构建满足其核心业务要求的应用,而不是开发访问实施和管理工具。一旦企业建立一个公用身份管理基础结构,新的应用和服务就可以通过API和开放标准重复使用同样的信息。

 

Sun ONE身份认证服务器提供了有助于企业解决现今身份认证问题的基础,并为未来提供新的服务创造了条件。

第五章SSO在校园身份管理系统中的实现

5.1 单点登录(SSO)的实现

5.1.1 实现原理

Sun ONE Identity Server 6.0里,支持两种不同方式的SSO,一种是针对Web方式的应用,另一种是非Web方式的应用。对于Web的应用,实现方式有两种:

l         一个是基于Proxy AgentSun为很多主流的Web ServerApplication Server都提供了相应版本的Proxy Agent,把Proxy Agent装在Web ServerApplication Server上面,让Proxy Agent截获客户端发送过来的对资源的请求,然后强制对该请求进行访问控制,通过认证的客户端会由Identity Server 上的Session Server发一个SSO Token(令牌),在Token里会包含有Session的信息,以及客户的一些信息。SSO Token是通过Web浏览器的CookiesURLRewriting来存储SSOToken的;

l         另一种则是用Sun ONE Identity Server 所提供的SSOAPI函数去手工写一些程序来实现Proxy Agent的功能,从而获得SSOToken

 

对于非Web方式的应用来说,只能用Sun ONE Identity Server 所提供的SSOAPI函数去手工写一些程序来获得SSOToken

 

5.1.2 基于Web的 SSO 流程

 


51基于webSSO流程示意图

基于WebSSO的工作流程如图51所示:UserWeb浏览器或支持Http协议的客户端,User发送请求到它所要访问的应用程序或资源,当它访问Mail服务器时,Mail服务器上所部署的Proxy Agent(或验证程序)会把请求截获,检查这个Request是否包含SSOToken(令牌)。第一次访问时当然没有这个Token,对于这个RequestProxy Agent(或验证程序)会把它重定向到Sun ONE Identity Server 上,Identity Server接到这个请求,就会把管理员预先配置好的一些需要用户进行认证的页面发送到浏览器,客户在经过认证之后,Identity Server会建立一个SSOToken,把Token返回给浏览器。客户端浏览器 再次用SSOToken去访问它原来所要访问的应用程序,当Proxy Agent(或验证程序)再次接受到请求会发现请求中包含SSOToken,它会用Token上存储的用户信息去Identity Server上把这个用户相应的Policy(策略)的设置取出来进行对比,看这个用户是否有访问该资源的权限,如果有就允许访问,如果没有则拒绝访问。

经过了这样一次认证之后,客户端再访问同一个Identity Server 所控制的域(Domain)里面的其他应用的时候就不用再进行第二次的认证了。比如说它再去访问Library Application(图书管理系统)时,图书管理系统上的Proxy Agent(或验证程序)就会发现这个请求时带有SSOToken的,它就会用Token里的Session信息取得相应的策略数据,然后同样进行一次策略的比较,看这个用户是否有权限访问资源,从而避免了再次认证。

5.2 跨域单点登录(CDSSO)的实现

同一个企业可能有不同的域名,如微软有microsoft.commsn.comhotmail.com等不同的域名,如果要在多个不同的域之间实现单点登录,就会用到跨域单点登录(Cross Domain SSO)。用户对每个不同域名得到一个Cookie,在Cookie里有SSOTokenIdentity Server通过在自己上面加装一个跨域SSO控制器(Cross Domain SSO Controller)来完成的,这个控制器会和安装在每个域的Web Server上面的Cross Domain SSOServlet进行通讯来合作完成,给用户发放针对于每个域的Cookie,从而实现跨域单点登录的任务。

SUNSSO解决方案是基于Cookie的,所以它也很容易的实现了跨域的SSO。在配置了跨域SSO的情况下,某个用户在一个域中经过Identity验证后,能够访问被同一个Identity服务器保护的另一个域的网络资源。比如说,一个Identity服务器位于Domain 1并且作为验证服务提供者,用户在Domain 1中被Identity验证,因此Token是在Domain 1中设置的。另有一Server B位于Domain 2并且受Agent保护,而保护Server B的是位于Domain 2的另一个Identity服务器,Domain 2中的Identity服务器以Domain 1中的Identity服务器作为验证服务器。

假如User A经过位于Domain 1中的Identity服务器进行验证以后,他接着访问Domain 2中的Server B,位于Domain 2中的Agent会检查该请求是否拥有一个SSO Token,结果是没有属于Domain 2的令牌。在配置了跨域SSO的情况下,Agent会将用户请求重定向到位于Domain 2中的Identity Server的跨域SSO Servlet,接着该组件会将用户的请求重定向到位于Domain 1中的Identity Server服务器中的跨域处理组件,也就是跨域SSO控制器,因为位于Domain 1中的Identity Server是验证服务器。Domain 1中的Identity Server接收到属于Domain 1Cookie,负责处理SSO的服务向 Domain 2中的Identity Server发送一个SSO TokenDomain 2的验证服务验证来自Domain 1SSO Token并且为用户创建一个属于Domain 2SSO Token,最后为用户设置属于Domain 2Cookie。在该用户具有访问Server B权限的条件下,用户可以访问他所请求的URL

以图形化方式表示的跨域SSO流程如图52所示。

 


52跨域SSO实现示意图

目前,由于时间关系以及试验条件的限制,我们对于跨域单点登录的解决方案还停留在理论分析阶段,没有具体实现。这一部分将是我们系统的改进的重点。

5.3 Web服务的部署

目前,本系统实现了域内单点登录的功能,服务具体部署如下。

我们共在三台电脑上部署Web服务,称为服务器ABC,都安装了Windows 2000 Server 操作系统并升级为Sp4。服务器A升级为域服务器,并安装Win2000 ServerDNS服务,服务器ABC均把服务器A做为首选DNS服务器。服务器B装有Sun ONE Identity ServerSun ONE Directory ServerSun ONE Application Server提供身份管理、权限分配、访问限制等功能。服务器C装有Sun ONE Application ServerMySQL数据库服务器,提供Web电子邮件服务。服务器A还装有Sun ONE Application ServerPoint Base数据库服务器,提供Web图书管理服务。服务器ABC的域名分别为library.bishe.comnk-zja.bishe.commail.bishe.com

5.4校园身份管理系统中单点登录的具体实现

5.4.1 Sun ONE Identity Server的配置

首先在IE浏览器输入:http://nk-zja.bishe.com:58080/amconsole进入Identity Server的登录界面,使用管理员帐号amadmin登录,进入管理页面。在视图下拉列表中选择用户,可以添加和删除用户,这里我们添加了四个测试用户,use1use2user3user4。如图53所示:


在视图的下拉列表中选择角色,进入角色管理页面,我们在这里添加了三个角色,System Email UserSystem Library AdminSystem Library User,如图     54所示。其中System Email User具有访问邮箱系统的权限,System Library Admin具有图书馆管理员的权限,System Library User具有图书馆普通读者的权限。


 

然后,我们将用户添加到这三个角色,即给用户分配权限。将user1user2user4三个用户添加到System Email User这一角色;将用户user1添加到System Library Admin这一角色;将user2user3两个用户添加到System Library User 这一角色。如图55,图56和图57所示。

从而使user1具有了System Email UserSystem Library Admin的权限,user2具有了System Email UserSystem Library User的权限,user3具有了System Library User的权限,user4具有了System Email User的权限。

55设置用户权限




56设置用户权限



57设置用户权限

 

System Email UserSystem Library AdminSystem Library User这三个角色的权限分配和资源访问需要在具体程序中进行控制。

5.4.2 编码实现

l         代码1:验证用户登录程序的核心代码:

// 从登录页面获取用户信息

String UserName = request.getParameter("username");

String Password = request.getParameter("password");

String gotoURL = request.getParameter("goto");

boolean userok = false;

String orgName = "dc=bishe,dc=com";

String indexName = "";

AuthContext.IndexType indexType;

// 验证用户信息

if (UserName != null && UserName.length() > 0)

{

       // verify against table

       AuthContext lc = null;

       try

       {

          lc = new AuthContext(orgName);

         indexType = AuthContext.IndexType.MODULE_INSTANCE;

         indexName = "LDAP";

         System.out.println("LDAPLogin: Obtained login context");

         lc.login(indexType, indexName);

     }

     catch (LoginException le)

       {

              …….

     }

     Callback[] callbacks = null;

       // get information requested from module

       while (lc.hasMoreRequirements())

       {

              callbacks = lc.getRequirements();

         if (callbacks != null)

              {

                     int i = 0;

              for (i = 0; i < callbacks.length; i++)

                     {

                          ........... // 完成回掉过程

                     }

                     lc.submitRequirements(callbacks);

              }

       }//end while

       if (lc.getStatus() == AuthContext.Status.SUCCESS)

       {

              // 登录成功

              userok = true;

       }

       else if (lc.getStatus() == AuthContext.Status.FAILED)

       {

              //登录失败

     }

       else

       {

              //未知情况

       }

       if (userok)  //如果登录成功,则创建Token,将用户信息写入Cookie

       {

              String tokenid = lc.getSSOToken().getTokenID().toString();

              String cName = (new com.iplanet.am.util.SystemProperties()).get("com.iplanet.am.Cookie.name");

              Cookie newCookie = new Cookie(cName,tokenid);

              newCookie.setDomain("bishe.com");

         newCookie.setPath("/");

              response.addCookie(newCookie);

              if(gotoURL ==null)

                     gotoURL = request.getContextPath();

              response.sendRedirect(gotoURL);

              return;

       }

}

response.sendRedirect("SSOFailure.jsp"); //如果登录失败,则跳转到错误页面

 

此段程序用于验证用户的身份。首先,从登录页面的提交中获取用户名和密码的信息,然后与身份存储库(Sun ONE 目录服务器)中存储的用户信息进行比较,如果身份存储库中包含该用户的信息,并且用户名、密码正确,则登录成功,否则登录失败。如果登录成功则授予该用户一个令牌(Token),并将用户的信息写入Cookie,然后转到资源列表页面。相反,如果失败则抛出异常或定位到错误页面

l         代码2:验证Token是否有效的核心代码:

     boolean loggedIn = false;

     SSOTokenManager manager;

     SSOToken ssoToken;

//    String roleDN = "cn=System Library User,dc=bishe,dc=com";

//    String roleDN = "cn=System Library Admin,dc=bishe,dc=com";

     String roleDN = "cn=System Email User,dc=bishe,dc=com";

     // 该函数用于验证用户的角色

     AMUser validate(SSOToken Token ,String systemRole) throws Exception

     {

        Set roleSet=null;

        AMStoreConnection amsc = new AMStoreConnection(Token);

        AMUser user=amsc.getUser(Token.getPrincipal().getName());

        if(systemRole == null)

            return user;

        roleSet = user.getRoleDNs();

        Iterator it = roleSet.iterator();

        String role;

        while(it.hasNext())

        {

            role = (String)it.next();

            if(role.equals(systemRole))

            return user;

        }

        throw new Exception("no role");

    }

    //检查用户的令牌是否有效

try

{

        manager = SSOTokenManager.getInstance();

        ssoToken = manager.createSSOToken(request);

        if(ssoToken != null && manager.isValidToken(ssoToken))

        {  

            SSOToken oldToken = (SSOToken)session.getAttribute("SSOToken");

            if(oldToken!=null&& oldToken.getTokenID().toString().equals(ssoToken.getTokenID().toString()))

            {

                loggedIn = true;

                break;

            }

            System.out.println("validate a new token and get user inform");

            AMUser user = validate(ssoToken,roleDN);               

            String uid =(String)user.getAttribute("uid").iterator().next();

            // Session中写入信息

            session.invalidate();

            session = request.getSession(true);

            session.setAttribute("uid",uid);

            session.setAttribute("SSOToken",ssoToken);            

            loggedIn = true;

        }

        catch (Exception e)

        {

            ……

        }

    if(!loggedIn) {

        response.sendRedirect("SSOFailure.jsp");

        return;

    }

 

此段程序嵌在具有访问限制的Web页面的头部,用于检查用户的令牌(Token)和用户的身份。如果令牌有效,并且该用户具有访问这个页面的权限,则显示该Web页面的信息,同时将用户的信息写入Session中,供以后的Web程序取用。如果令牌失效,或该用户没有访问这个页面的权限,则定向到错误页面,让用户用具有访问权限的帐号重新登录。


代码3:用户注销程序的核心代码:

    try

    {

        SSOTokenManager manager = SSOTokenManager.getInstance();

        SSOToken ssoToken = manager.createSSOToken(request);

    if(ssoToken != null && manager.isValidToken(ssoToken))

    {

        //丢弃令牌

            manager.destroyToken(ssoToken);

            //删除Cookie

            String cName = (new com.iplanet.am.util.SystemProperties()).get("com.iplanet.am.cookie.name");

            Cookie deletecookie = new Cookie(cName,null);

            deletecookie.setDomain("bishe.com");

            deletecookie.setPath("/");

            deletecookie.setMaxAge(0);

            response.addCookie(deletecookie);

            //清除Session信息

            session.invalidate();

            if(gotoURL ==null)

            gotoURL = request.getContextPath();

            response.sendRedirect(gotoURL);

        }

}

catch (com.iplanet.sso.SSOException e)

    {

        response.sendRedirect("SSOFailure.jsp");

    }

 

此段程序用于注销用户,防止用户有忘记关闭浏览器而被其他用户使用其资源。注销程序包括三个步骤,使令牌失效,删除Cookie信息,清除Session信息,从而保证了系统的安全性。

第六章 总结与展望

6.1 总结

我们只是在实验室环境下实现了一个十分简单的单点登录系统。仅仅是对单点登录系统的设计与实现做了一些有益的探索,主要在于尝试了用户电子身份标识的自动安全传递和多个系统之间的信任关系建立,并利用它们来实现单点登录。现在出现的技术趋势是在网络上建立一个统一的、标准的安全认证机制,这样在不远的将来便可以实现全网络的单点登录,当然这还需要人们不断地进行研究和扩充。

6.2 系统的不足与展望

目前,本单点登录系统的设计方案,适用范围基本上局限于一个企业网或校园网,还不能扩展到跨域的网络环境。由于条件限制,我们主要基于一台认证服务器来进行认证工作,如果是有多台认证服务器,我们可以进一步研究如何使它们之间可以建立信任关系,使之由一个认证服务器所管理的客户可以访问在另一个认证服务器管理域中的资源。要达到完善的网络身份认证需要涉及联合身份认证及各种服务资源的定位,从现在的发展趋势来看,认证技术与目录技术相结合,是实现全网络的联合认证与资源访问的一个有效手段。

另外,由于条件和时间的限制,我们并没能完全发挥出Sun ONE Identity Server身份管理与安全性方面的作用。在本系统的实现中,我们主要应用了其身份管理的功能,实现了其中最为基本的部分。Sun ONE是一个很庞大的体系,有许多强大的功能与扩展等待我们去学习和探索。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. java优化占用内存的方法(一)

    原文出自【雪的痕迹】原文地址:http://www.java3z.com/cwbwebhome/article/article8/852.htmljava做的系统给人的印象是什么?占内存!说道这句话就会有N多人站出来为java辩护,并举出一堆的性能测试报告来证明这一点。其实从理论上来讲java做的系统并不比其他语言开发出来的系…...

    2024/4/27 22:33:41
  2. 字符与字符串中的'\0', '0', 0;strlen()函数求字符串长度计算方法(sizeof()验证)

    先问一个问题:如下字符数组or字符串,用strlen函数求长度各是多少? /*01*/char * str1 = "abc"; /*02*/char * str2 = "ab\0c";/*03*/char * str3 = "ab\\0c";/*04*/char * str4 = "abc0c";/*05*/char arr0[5] = {1, 2, 3, 4, 5}…...

    2024/4/17 17:15:16
  3. TCP三次握手过程详解(一)

    TCP(Transmission Control Protocol) 传输控制协议TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接。位码即tcp标志位,有6种标示: SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) UR…...

    2024/4/17 17:15:40
  4. 10分钟教你用Python打造一个AI贪吃蛇

    愉快的开始 最近在修一门叫Python基础的课,然后匆忙之中做了这个AI贪吃蛇想交个大作业,结果老师的结课作业是给定了题目,我真是……首先说明一点哈,此AI非彼AI。今天要讲的AI贪吃蛇还是传统意义上遍历图的找路算法编写的,并不是利用机器学习进行学习控制的哈。 关于贪吃蛇…...

    2024/4/28 3:08:15
  5. 《C++游戏开发》源代码编译图文指南

    《C++游戏开发》《Creating Games In C++》 这本书的源代码 不是 一般的难编译成功,给的工程文件还是错的,相信大多数买这本书的人都没有编译成功过,所以我特写此文章帮助大多数白菜们。记得转载的时候不要抹掉我的名字呀,我写文章也很辛苦的。write by DKink|棼紫 2008.4.…...

    2024/4/17 17:15:11
  6. PB字符串处理函数

    Fill()功能建立一个由指定字符串填充的指定长度的字符串。语法Fill ( chars, n )参数chars:string类型,指定用于重复填充的字符串n:long类型,指定由该函数返回的字符串的长度返回值String。函数执行成功时返回n个字符的字符串,该字符串以参数chars中的字符串重复填充而成。…...

    2024/4/28 0:46:55
  7. TCP 三次握手建立连接,四次挥手断开连接,图解详细分析

    继文章 http://blog.csdn.net/simonchi/article/details/41722511 之后,我觉得有必要来详细的说一下TCP的三次握手和四次挥手的过程,帮助大家理解这个过程。 首先来看一下tcpdump抓取的网络数据包,如何抓包分析参考 上面给出的链接图中红色框选的是三次握手建立连接 第一…...

    2024/4/17 17:16:23
  8. 内存泄漏的检测、几种常见场景及解决方法

    文章参考:http://blog.nimbledroid.com/2016/05/23/memory-leaks.html使用AndroidStudio检测内存泄漏:http://wetest.qq.com/lab/view/99.html一.内存泄漏的原因一般内存泄漏(traditional memory leak)的原因是:由忘记释放分配的内存导致的。 逻辑内存泄漏(logical memory l…...

    2024/4/19 16:52:58
  9. linux中搭建邮件服务器

    邮件服务器概述 使用Email很容易,但是Internet的邮件系统是通过很复杂的几个系统组成的,对于最终用户而言,我们熟悉的Outlook,Foxmail等都是用来收信和发信的,称之为MUA:Mail User Agent,邮件用户代理。 MUA并非直接将邮件发送至收件人手中,而是通过MTA:Mail Transfer…...

    2024/4/17 17:16:17
  10. Cocos2d-x简单游戏代码实现|第一部分:开始场景

    这个植物大战僵尸的小游戏Demo 虽然下,但是基本包括了:1.植物的选取、僵尸的攻击、发射子弹;2.太阳的生成、碰撞检测等功能;第一部分:Cocos2d-x简单游戏<植物大战僵尸>代码实现|第一部分:开始场景第二部分:Cocos2d-x简单游戏<植物大战僵尸>代码实现|第二部分…...

    2024/4/11 18:47:11
  11. GridView截取某一列字符串的长度,

    在Gridview中,如果你的某一列字符串的长度过长,不做处理的话.那么将显示的奇丑无比, 可以采取设置样式,将其显示为定长,可以在点击查看的时候,在另一个页面对其进行显示首先在前台设置样式<style type="text/css">.listover150{width:150px;text-align:left;o…...

    2024/4/11 18:47:11
  12. Wireshark基本介绍和TCP三次握手

    转自:http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html之前写过一篇博客:用 Fiddler 来调试HTTP,HTTPS。 这篇文章介绍另一个好用的抓包工具wireshark, 用来获取网络数据封包,包括http,TCP,UDP,等网络协议包。记得大学的时候就学习过TCP的三次握手协议,…...

    2024/4/11 18:47:29
  13. JVM内存管理机制和垃圾回收机制(1)

    JVM内存管理机制Jvm内存管理机制java中是把内存的管理交给java虚拟机来管的,有java虚拟机中的垃圾回收机制来清理内存Java虚拟机(Java virtualmachine)实现了Java语言最重要的特征:即平台无关性。平台无关性原理:编译后的 Java程序(.class文件)由 JVM执行。JVM屏蔽了与具…...

    2024/4/19 20:20:10
  14. oracle中实现截取字符串(substr)、查找字符串位置(instr)、替换字符串(replace)

     (1)oracle中实现截取字符串:substr substr(string, start_position, [length]) 其中,string是元字符串,start_position为开始位置,length是可选项,表示子字符串的位数。 例子: substr(ABCDEFG, 0); -- 返回结果是:ABCDEFG,从0位开始截取后面所有 substr(ABCD…...

    2024/4/20 2:36:36
  15. 用 wireshark 抓取 TCP 三次握手和四次挥手的过程

    一:打开 wireshark 监听本地网卡,由于我连接的是 wifi ,监听无线网络连接。二:由于这次实验抓取的是百度网站,可以在 cmd 命令行模式下 ping 下百度网址的地址,可得 ip 地址,然后在过滤器上设置 ip.addr==14.215.177.38,然后打开百度的首页,回到 wireshark 再次刷新下,…...

    2024/4/20 3:11:07
  16. linux 系统在终端中用SMTP协议发邮件

    首先了解一下邮件的工作原理: 电子邮件工作原理电子邮件的工作过程遵循客户-服务器模式。每份电子邮件的发送都要涉及到发送方与接收方,发送方式构成客户端,而接收方构成服务器,服务器含有众多用户的电子信箱。发送方通过邮件客户程序,将编辑好的电子邮件向邮局服务器(SM…...

    2024/4/17 17:18:40
  17. 获取字符串的长度(strlen/length)

    size_t length = strlen(savaDalta.extrData1);// char extraData1[32]; 1、char * str = "abc";//等价于char str[] = "abc";int length = strlen(str); 2、string str = "abc";int length = str.length();...

    2024/4/17 17:16:41
  18. Java虚拟机内存调优经验

    转载自 http://www.cnblogs.com/jackyrong/archive/2010/01/21/1653163.html 尊重别人的劳动成果就是尊重自己Java内存组成 1) 堆 运行时数据区域,所有类实例和数组的内存均从此处分配。Java 虚拟机启动时创建。对象的堆内存由称为垃圾回收器 的自动内存管理系统回收。 堆…...

    2024/4/17 17:16:41
  19. wirshark 常用操作及 tcp 三次握手过程实例分析

    本文 来自 csdn ucser http://blog.csdn.net/perfectpdl,转载注明出处,谢谢。wireshark是非常流行的网络封包分析软件,功能十分强大。可以截取各种网络封包,显示网络封包的详细信息,Fiddler是在windows上运行的程序,专门用来捕获HTTP,HTTPS的。wireshark能获取HTTP,也能…...

    2024/4/17 19:00:46
  20. 贪吃蛇纯c代码

    #include<stdio.h> #include<time.h> #include<windows.h> #include<stdlib.h>#define U 1 #define D 2 #define L 3 #define R 4 //蛇的状态,U:上 ;D:下;L:左 R:右typedef struct SNAKE //蛇身的一个节点 {int x;int y;struct SNAKE *ne…...

    2024/4/18 7:43:47

最新文章

  1. 【TensorFlow深度学习】数据统计在深度学习中的重要性

    数据统计在深度学习中的重要性 1. 数据统计的基础概念2. 数据统计在TensorFlow中的实现2.1 张量范数2.2 归约操作2.2.1 计算最大值和最小值2.2.2 计算均值和总和 2.3 损失函数的统计2.3.1 均方误差 2.4 模型性能的统计2.4.1 准确率 3. 数据统计在模型训练中的应用3.1 学习率调整…...

    2024/4/28 6:21:43
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. Docker Desktop+WSL2安装到自定义路径

    现在大多数软件实在太“流氓”了&#xff0c;在安装过程中&#xff0c;根本不让你选择安装路径&#xff0c;默认安装到$HOME下&#xff08;windows C盘&#xff09;&#xff0c;随着软件的使用增多&#xff0c;可能磁盘空间不够&#xff0c;这个时候就想着&#xff0c;看看某些…...

    2024/4/27 13:24:41
  4. 蓝桥杯 - 受伤的皇后

    解题思路&#xff1a; 递归 回溯&#xff08;n皇后问题的变种&#xff09; 在 N 皇后问题的解决方案中&#xff0c;我们是从棋盘的顶部向底部逐行放置皇后的&#xff0c;这意味着在任何给定时间&#xff0c;所有未来的行&#xff08;即当前行之下的所有行&#xff09;都还没…...

    2024/4/23 22:35:42
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/26 18:09:39
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/28 3:28:32
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/27 4:00:35
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/27 9:01:45
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57