精华内容
下载资源
问答
  • 每当有人问起我的工作:嗯…CDN…内容分发网络,做过站长的说就懂,普通人哪里知道CDN是个什么鬼。

    前言:

    每当有人问起我的工作:嗯…CDN…内容分发网络,做过站长的一说就懂,普通人哪里知道CDN是个什么鬼。
    百度百科官方解答:https://baike.baidu.com/item/CDN/420951


    内容分发网络(Content Delivery Network,CDN)通过将站点内容发布至遍布全球的海量加速节点,使其用户可就近获取所需内容,避免因网络拥堵、跨运营商、跨地域、跨境等因素带来的网络不稳定、访问延迟高等问题,有效提升下载速度、降低响应时间,提供流畅的用户体验。

    通俗描述:

    例子:就好比你的手机信号一样,基于就近的基站信号塔才能够获得更强的信号和网速,通话时通过最近的信号塔然后光缆信号传输到被通话的另一方信号塔。如果你附近没有信号塔,或者信号塔离你上百公里之远,那么你可能会感到手机信号弱,网速慢等问题。
    转到CDN来讲,无异于是为网站等应用网络加速,如果一个普通网站服务器在广州,那么用户在北京访问,几千公里再快他也会有零点几秒的延时,当然此过程用户可能感受不到,如果是全国各地用户同时访问?那么这一台服务器将要承受来自于全国各地无数的请求,如果每个用户都占用这个服务器一些带宽,那么总有人会卡慢。


    如果我们换个思路解决问题,通过全球全国各地部署类似于信号塔的节点服务器。下图为中国境内检测:

    未加速效果:

    未加速效果

    加速后效果:

    加速后效果

    这里我们明显可以看到加速前部分地区良好,但全国访问平均不是很好,大部分都是较差的网络延时,更不用说带宽传输速度了。
    但经过加速后,全国速度延时明显提升,基本99.9%的网络传输都是非常快的,并且最慢节点也比未加速的效果要好。


    通俗原理:

    未加速效果:
    北京移动用户连接至广州电信服务器30ms

    加速后效果:
    北京移动用户直连就近北京移动线路节点1ms
    北京联通用户直连就近北京联通线路节点1ms
    北京电信用户直连就近北京电信线路节点1ms

    通过提前预热或首次拉取源站(服务器)数据,进行缓存至当前节点。

    1:用户首次访问的情况下(无缓存)则系统请求源站拉取数据,得到的数据将缓存到该节点,并将数据返回给用户。
    2:用户非首次访问的情况下(有缓存)则系统自动返回硬盘、内存中的缓存数据返回给用户。

    通过加速后对比,我们看到 移动就近连接移动等等…通过不跨运营商减少延时,再通过就近节点减少延时,同时网速将极大的得到提升。
    这一切得益于全球调度系统,通过对所有请求无感调度至就近节点,也可能直接讲你调度至最近的一个个人家庭共享路由器,这之间可能你将离最近的节点不超过几百米的距离,网速和速度可想而知有多快。


    架构图:

    网站加速

    网站加速

    下载加速

    下载加速

    音视频加速

    音视频加速

    动静态加速

    我的日常工作内容:

    • 起床:几点?没点!为什么?如果任何一个客户的加速出现问题,那么将造成的该网站的所有用户无法正常使用,如果这个客户有上万用户,那么出现的问题将在1分钟内影响上万用户,可想而知后果是什么。
    • 救援:几乎每天起床都是被电话整起来,深夜或者无人值守的时候那些破坏分子开始发动了所谓的DDoS CC等等攻击,当然这些问题CDN系统那能够自主完成并解决。我所需要的就是解决那些需要人工排查的问题。
    • 工单:解决线上用户提交的不紧急的大小问题。如果一个问题从排查到解决需要20分钟,一天将有1/3的时间在此消耗。
    • 客服:解决在线客户的各类问答和调整部署方案。
    • 审核:审核各用户提交的线路整改切换的任务,审核各用户提交的提现等申请。
    • 采购:全球节点?那么当然需要每个地区去寻找更合适的机房合作,挑选机器成了很漫长而又难抉择的问题。因为涉及成本核算,CDN主要影响因素是带宽和防御,那么首先考虑带宽和防御,再综合考虑运营商线路,BGP CN2 CMI 163 169等等线路都需要满足。
    • 部署:既然采购到了新机器,那么当然要将其部署上线,用正式使用。
    • 测试:在机器上线前当然要进行模拟线上生产环境进行测试。待测试完成后上线后再次进行线上测试。
    • 更新:通过一些工单和客户反馈进行功能开发调整等等,以确保各类功能和配置满足现用户需求或未来需求。

    当然上面的几条是每天的日常类,有些也并未在上面提及,例如如何寻找一个靠谱的服务商厂家,也例如如何对瘫痪的机器进行检查排除故障。

    欲戴皇冠必承其重,捡钱也需要弯腰付出,要饭也需要跪地拿碗,不是如此又如何有金钱支撑?

    每天遇到形形色色的客户,有的人普普通通,有的人恭恭敬敬,有的人骂骂咧咧,十几亿人何其不有。
    每当别人提起某个行业有多么多么挣钱,你要知道,别人不是傻子,别人都告诉你了藏宝图,你觉得会有颗粒稻谷吗?任何一个行业 工作都是很艰辛的,每个人都在自述自己的工作苦楚,那么谁又是在此中独树一帜呢?

    谨记:

    你的运气就像硬币一样每天都在翻转,三面人生:一夜暴富、一夜破产、直直站立毫无变化,相信技术的力量。
    互联网的一次机遇,足以让一个人乃至整个家庭发生巨变。
    未曾亲身经历,何来感同身受。

    LayuiCdn-MCCRNFC.SNLoong

    展开全文
  • 知识:数组,函数调用 思路:定义个数组,包含到十二月各月的天数,由键盘输入年、月、日,将之前月份的天数累加,再加上当前的天数就是总天数。如果该年是闰年,总天数要加一。 程序代码: #include <...

    知识点:数组函数调用

    思路:定义一个数组,包含一到十二月各月的天数,由键盘输入年、月、日,将之前月份的天数累加,再加上当前的天数就是总天数。如果该年是闰年,总天数要加一。

    程序代码:

    #include <stdio.h>
    int fun(int x,int y,int z)
    {
    	int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    	int i,sum=0;
    	for(i=0;i<y;i++)
    	{
    		sum=sum+a[i];
    	}
    	sum=sum+z;
    	if(x % 400 == 0 || x % 100 != 0 && x % 4 == 0)
    		sum=sum+1;
    	return  sum;
    }
    int main()
    {
    	int year,month,day;
    	printf("请输入年、月、日:\n");
    	scanf("%d %d %d",&year,&month,&day);
    	printf("%d年%d月%d日是该年的第%d天\n",year,month,day,fun(year,month,day));
    	getchar();
    	getchar();
    	return 0;
    }

    运行结果:

     

    展开全文
  • 这种情况基本是由于开始时间并不是当天早上8:00开始的,检查方法是在“文件-->选项”-->"常规"中可以设置日期的显示格式,如下图,改成显示几点几分钟的格式,然后再检查一下那个开始时间是不是从早上8:00开始,很...

    看以下界面就明白了:

        

           如上图所示,某活动项工期为1个工作日,开始时间应该是当天,也就是开始时间与完成时间都是2016年8月23日才对,但工具中显示的完成时间为2016年8月24日,给人的感觉误以为工期为2个工作日;

            这种情况基本是由于开始时间并不是当天早上8:00开始的,检查方法是在“文件-->选项”-->"常规"中可以设置日期的显示格式,如下图,改成显示几点几分钟的格式,然后在‘’日程”中检查一下那个开始时间是不是从早上8:00开始,很可能不是。我们通常输入工期1d,软件的理解是8h,如果开始时间是早上9:00开始的,那么完成时间就变成了第二天的9:00完成了,因为第一天有7个小时,第二天再取1个小时从8:00到9:00,所以完成时间就变成了第二天。


    设置完成后,返回任务界面,开始时间及完成时间 格式已经发生改变,如下图:


    工具默认应该是9:00开始,如下图:


    把默认开始时间设置为8:00 ,默认结束时间为:17:00 点击确定按钮


    再次返回任务界面,新建一个Project文件,添加任务,就可以看到想要的开始时间及完成时间了,如下图:


      

        另外,提醒一下,不要在桌面上右键选择“新建”一个Project文件,这样情况下基本上第一天的开始时间就变成了9:00,这可能是软件的漏洞,可以直接在程序中打开Project,或者点击桌面的Project图标,或者在某一个文件打开的情况下,在“文件”-->“新建”一个空白文件。



    展开全文
  • 登录之CAS SSO从入门到精通(第一天

    万次阅读 多人点赞 2015-02-14 20:05:42
    啊。。。。。。it's quite a long time。好久没更新博客了,有一年之久了,一直在...好了,废话少说,开始我们架构师之路的新的历程,SSO-单登录。什么是单登录?什么是SSO?SSO就是单登录!!!SSO即Single Sign

    啊。。。。。。it's quite a long time。


    好久没更新博客了,有一年之久了,一直在忙于公司的一些项目。2014年到2015年工作太忙,我也接触到了新的领域,认识了新的同事。


    对于一些经常跟我博客的读者们深深说一声抱歉。


    同时,也在新的一年将到之际,祝各位新春愉快,羊年洋洋洋。


    好了,废话少说,开始我们架构师之路的新的历程,SSO-单点登录。


    另外想以此SSO系列教程献给我那身体不太好的同事-小白同志,祝小白同志身体一直健康

                                                                                                                                                              ——叫你废话少说你还再啰嗦,你还说,好了,关掉,开始正经话题。

    什么是单点登录?什么是SSO?


    SSO就是单点登录!!!大笑


    SSO即Single Sign On。


    可是为什么我们要单点登录呢?为什么不能把所有的系统做成一个war包里呢?

    道理很简单啊,如果这个银行这个企业全是你一家公司里的一个项目组包下来了,然后是从头开始开发,你当然可以把所有的功能模块做到一个WAR工程中啊。


    可是很多时侯我们是做一个工程或者是两个工程然后需要和另一个工程去做结合,每个工程都有一个入口地址,对吧?那么我们从用户的角度出发来说:


    如果一个企业的工作人员需要操作4,5个不同的系统如:HR系统、报销系统、进销存系统还有企业内的eLearning系统和SAP系统,那么他要登录5次对不对?要登录5次?


    那么有人说了,为什么这么麻烦呢?我们不能把所有的系统除了一个主系统,然后让用户只要登录一次,再把其它系统的链接以菜单的形式挂在主系统的菜单点,然后去除登录功能,这样用户不就可以只需要登录一次了呢?


    答案当然是:你可以这样做。


    可是安全性呢?


    因此我们引入了单点登录的概念,我们可以想一下,用户面对10几个系统,这10几个系统只有一个“表皮”(主页),在这个主页中有许多的外挂连接,连向10几个子系统,这10几个子系统每个都需要根据用户名和密码来判断用户是否对于本系统有无操作权限?但是用户只需要在这个“表皮”上登录一次,当他点每一个菜单链接时,系统会自动把用户名和密码做一次匹配然后根据权限系统来判断该用户是否具有相应的权限,进而使得用户可以通过主页再链入不同的子系统中,这就是单点登录。


    或许是中文翻译的问题,我们就从Single Sign On这3个字来理解,只需登录一记,啊。。。这就对了,多个系统我只需要登录一次。


    我们进一步设想一下,其实用户还是登录了两次,为什么呢?


    对于正规的企业来说都有一个“域登录”,即WINDOWS域我们又称之为Active Directory,简称AD域,用户打开WIN7,WIN8, WINDOWS SERVER。。。bla...bla...bla...what every啦。


    此时他需要输入域帐号,登录一次。


    然后他进入WINDOWS桌面后,打开IE,点开公司内部OA系统,做报销或者是做请假,又登录一次。


    其实是两次登录。


    因此做的好的SSO,因该是怎么样啊?


    即让用户登录一次,就是用户一旦登录了公司的AD域后,他在IE里打开公司内部的一些网址都无需再做登录了,因为用户的AD域帐户就是它的系统帐户。


    如:公司内每个员工的邮箱帐号,它打开OUTLOOK后就自动连上了相关的MAIL服务器,然后该员工的AD域帐号加上@xxx.xxx这样的格式,这不就是他公司的邮件地址了,对吧?


    对不对?这就是一个SSO的活生生的例子。


    那么很多时候,确实,为了安全,我们可以让员工在登录了AD域后再打开IE,然后输入公司内的OA网址时再登录一次,这样做其实也是可以,而公司内的OA一般不仅仅只是一个系统,它一定一定是连接着多个子系统。


    比如说我们一个公司的OA系统是一个EAR,它下挂有10多个WAR。




    甚至一些公司还会外接如:SalesForce, SAP等其它系统,因此我们把员工打开的这层公司OA系统的最外面的这层“皮”,称之为PORTAL。


    对的,PORTAL里一定含有SSO,在此先提一下。

    下面是一些著名的调查公司显示的统计数据:

    • 用户每天平均16分钟花在身份验证任务上 - 资料来源:IDS
    • 频繁的IT用户平均有21个密码 - 资料来源:NTA Monitor Password Survey
    • 49%的人写下了其密码,而67%的人很少改变它们
    • 每79秒出现一起身份被窃事件 - 资料来源:National Small Business Travel Assoc
    • 全球欺骗损失每年约12B - 资料来源:Comm Fraud Control Assoc
    使用“单点登录”整合后,只需要登录一次就可以进入多个系统,而不需要重新登录,这不仅仅带来了更好的用户体验,更重要的是降低了安全的风险和管理的消耗。


    请看下面的统计数据:


    • 提高IT效率:对于每1000个受管用户,每用户可节省$70K
    • 帮助台呼叫减少至少1/3,对于10K员工的公司,每年可以节省每用户$75,或者合计$648K
    • 生产力提高:每个新员工可节省$1K,每个老员工可节省$350 - 资料来源:Giga
    • ROI回报:7.5到13个月 - 资料来源:Gartner   
    另外,使用“单点登录”还是SOA时代的需求之一。在面向服务的架构中,服务和服务之间,程序和程序之间的通讯大量存在,服务之间的安全认证是SOA应用的难点之一,应此建立“单点登录”的系统体系能够大大简化SOA的安全问题,提高服务之间的合作效率。


    以下是一个标准的企业内通过SSO来集成各个系统间的认证与权限的模型图


    好了,以上基本知识普及完毕开始我们的SSO实现。

    CAS SSO

    SSO实现有很多产品,我们今天选用的这个是耶鲁大学发明的CAS SSO服务器。这个CAS SSO是目前我看到过的功能较全的,使用也是最简单的配置式SSO服务器,它基于SPRING的原理,因此这个配置文件我们看起来因当是相当的熟悉的。


    它分为Server版和Client版2个模块,同时它对于一些其它功能特性如:数据库、LDAP协议(就是WINDOWS AD域使用的协议)、安全等还提供了一系列的插件。因此,在本例中,我使用的是:


    Server端:

    Cas Server 3.5.2


    Client端:

    Cas Client 3.2.1


    注:

    请严格按照我的版本号进行试验。


    什么叫Server端 ,什么叫Client端?

    看上图,假设我们有3个War包。

    • 一个叫cas-server.war,它放在tomcat里;
    • 一个叫cas-sample-site1.war,它放在jboss里;
    • 一个叫cas-sample-site2.war,它放在jboss里;

    那么位于tomcat里的cas-server.war,它就是我们的CAS的Server端,位于jboss里的两个war就是我们CAS的client端。

    SSO中的Server端与Client端概念搞清后,我们现在就开始布署吧。

    布署cas-server

    先说一下我们的环境:
     版本号 web端口
    tomcat69090
    jboss78080


    我们把Server端解压得到以下这样的一个文件夹


    它里面含了一堆的东西,关键在于以下这个文件夹


    进入该文件夹,找到这样一个war包。



    把这个war包解压后重命名成cas-server.war,放于tomcat的webapp目录中去,启动tomcat一切无误后即可。



    然后我们打开一个ie,输入http://localhost:9090/cas-server会得到以下这个界面,那就说明你的cas sso已经安装成功了。


    配置CAS SERVER

    添加依赖包

    在本例中我们将使用Oracle数据库中自建一个用户表来管理我们的用户名和密码,因此:

    1. 将oracle的ojdbc6.jar放入tomcat的lib目录内D:\tomcat\lib
    2. 将cas-server-3.5.2-release\cas-server-3.5.2\modules下的这几个文件拷入tomcat\webapp\cas-server\web-inf\lib目录内


    修改配置文件

    CAS SSO的好处在于它的配置文件是完全spring的,你只要懂spring就可以非常容易的在里面去添加修改自己的一些功能,我们在第一天的教程中为了尽量简单,我们只需要改动一个文件,它就是:

    tomcat\webapps\cas-server\WEB-INF目录下的

    deployerConfigContext.xml文件


    我们用纯文件编辑器打开它,找到下面这行:

    <bean  class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />

    把它注释掉

    <!--
    <bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
    -->
    然后再在它下面添加如下内容

    <!--
       <bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
    -->
    
    
    <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
          <property name="dataSource" ref="dataSource" ></property>
          <property name="sql" value="select password from sys_user where user_id=?" ></property>
    </bean>

    好,这边我们看到了一个dataSource对吧,EASY,来。。。


    <!--
              <bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
    -->
              <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
                <property name="dataSource" ref="dataSource" ></property>
                <property name="sql" value="select password from sys_user where user_id=?" ></property>
              </bean>
    	</list>
    </property>
    </bean>
    
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
        <property name="username" value="ymk" />
        <property name="password" value="password_1" />
    </bean>

    注意我加的这个dataSource的bean和刚才那段配置代码之间的位置对应关系哦,别胡乱搞一个回车就乱加一行哦。


    全加完了,怎么样啦?完成了吗?


    还没,CAS SSO严格意义上来说需要J2EE APP SERVER里实现HTTPSSSL的双向认证模式才能正常使用,但是我们因为这个是教程,因此不想搞了太麻烦,我们可以在“不使用HTTPS认证”的情况下也可以使用CAS SSO。


    为此,我们要关闭CAS SSO的HTTPS认证模式,编辑:


    tomcat\webapps\cas-server\WEB-INF\spring-configuration目录下的

    ticketGrantingTicketCookieGenerator.xml文件


    找到下面这行

    <bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
    	p:cookieSecure="true"
    	p:cookieMaxAge="-1"
    	p:cookieName="CASTGC"
    	p:cookiePath="/cas" />
    </beans>
    把这边的p:cookieSecure从true改为 false即可。


    然后我们在oracle中建一个用户表吧,建表语句如下:

    CREATE TABLE SYS_USER
    (
    	"USER_ID" VARCHAR2(16), 
    	"PASSWORD" VARCHAR2(8), 
    	 CONSTRAINT "PK_SYS_USER" PRIMARY KEY ("USER_ID")
    );

    该表中含有一条记录:


    这就是我们的用于测试的单点登录的用户名和密码了,很简单吧?


    全部保存后,重启tomcat,一切无误,然后我们打开一个ie,输入http://localhost:9090/cas-server会得到以下这个界面,那就说明你的cas sso已经安装成功了。


    我们在用户名中输入sso, 在密码一栏中输入aaaaaa,然后看到下面这个界面,即代表我们的cas server和我们的数据库已经完全连上了。


    如果我们不按照sys_user表中的用户名和密码就随意输入用户名和密码,那我们便会得到这样的结果:


    将不同的工程连接上cas server以实现单点登录


    按照这个图,我们将会有2个不同的war包

    • 一个叫cas-sample-site1.war,它放在jboss里;
    • 一个叫cas-sample-site2.war,它放在jboss里;
    我们在我们的eclipse里创建两个这样的war工程即可,这是非常简单的事,这2个工程都含有一个 index.jsp文件。


    cas-sample-site1

    在它的index.jsp文件中含有如下内容:

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>cas sample site1</title>
    </head>
    <body>
    <h1>cas sample site1</h1>
    
    <a href="http://localhost:8080/cas-sample-site2/index.jsp">cas-sample-site2</a>
    
    </br>
    <a href="http://localhost:9090/cas-server/logout">退出</a>
    </body>
    </html>

    cas-sample-site2

    在它的index.jsp文件中含有如下内容:

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>cas sample site2</title>
    </head>
    <body>
    <h1>cas sample site2</h1>
    <a href="http://localhost:8080/cas-sample-site1/index.jsp">cas-sample-site1</a>
    </br>
    <a href="http://localhost:9090/cas-server/logout">退出</a>
    </body>
    </html>

    这两个war工程都有一个lib目录,确保它们的lib目录里都有这样几个jar


    look, 注意要有cas-client-core-3.2.1.jar哦,它来自于:cas-client-3.2.1-release\cas-client-3.2.1\modulescas-client-3.2.1-release.zip解压出来的内容。


    这两个工程的web.xml可以说是完全一模一样,我们来看:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
      <display-name>cas-sample-site2</display-name>
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>    
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
       <listener>
    		<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
      </listener>
    	
      <filter>
    		<filter-name>CAS Single Sign Out Filter</filter-name>
    		<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
      </filter>
      <filter-mapping>
    		<filter-name>CAS Single Sign Out Filter</filter-name>
    		<url-pattern>*</url-pattern>
      </filter-mapping>
    
      <filter>
    		<filter-name>CAS Validation Filter</filter-name>
    		<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
    		<init-param>
    			<param-name>casServerUrlPrefix</param-name>
    			<param-value>http://localhost:9090/cas-server</param-value>
    		</init-param>
    		<init-param>
    			<param-name>serverName</param-name>
    			<param-value>http://localhost:8080</param-value>
    		</init-param>
    		<init-param>
    			<param-name>useSession</param-name>
    			<param-value>true</param-value>
    		</init-param>
    		<init-param>
    			<param-name>redirectAfterValidation</param-name>
    			<param-value>true</param-value>
    		</init-param>
      </filter>
      <filter-mapping>
    		<filter-name>CAS Validation Filter</filter-name>
    		<url-pattern>*</url-pattern>
      </filter-mapping>
    
      <filter>
    		<filter-name>CAS Filter</filter-name>
    		<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
    		<init-param>
    			<param-name>casServerLoginUrl</param-name>
    			<param-value>http://localhost:9090/cas-server/login</param-value>
    		</init-param>
    		<init-param>
    			<param-name>serverName</param-name>
    			<param-value>http://localhost:8080</param-value>
    		</init-param>
      </filter>
      <filter-mapping>
    		<filter-name>CAS Filter</filter-name>
    		<url-pattern>*</url-pattern>
      </filter-mapping>
    
      <filter>
    		<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
    		<filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
      </filter>
      <filter-mapping>
    		<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
    		<url-pattern>*</url-pattern>
      </filter-mapping>
    </web-app>


    看到了没有,有这么一堆的listener和filter,而且它们一个不能漏,并且它们的顺序也是绝对不能够错的,一定要按照下面这个从上至下的顺序:

    1. org.jasig.cas.client.session.SingleSignOutHttpSessionListener
    2. org.jasig.cas.client.session.SingleSignOutFilter
    3. org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
    4. org.jasig.cas.client.authentication.AuthenticationFilter
    5. org.jasig.cas.client.util.HttpServletRequestWrapperFilter
    漏了一个,或者顺序错了,你将会发生下列情况:
    1. 可以正常登录,无法统一注销,即然是单点登录,那么我在任意一个站点上点“注销“是不是也因该是统一注销啊?
    2. 可以登录,可以统一注销,但是拿不到cas-server上登录的用户的user session,如果我们是两个系统,那么这两个系统是不是都有web sesssion?较常用的就是user session,那么如果你的顺序配错了,或者是你漏配了一个,你是得不到cas-server上传过来的用户的一些登录信息的,这个很糟糕,这将会为我们后面的编程开发带来烦恼
    3. 不能登录
    至于为什么会得到这样的一些结果?

    嘿嘿!

    我们在后面的课程中会来分析cas 单点登录的源码(这个过程一点不变态,很简单的,一说就通,跟着我的教程一步步走不难的),在深入源码中后你就可以看出为什么这几个东西它们有严格意义上的顺序的关系了。

    在这个web.xml文件里我们可以看到有两处出现了下面的这样的东西:

    <init-param>
    		<param-name>casServerUrlPrefix</param-name>
    		<param-value>http://localhost:9090/cas-server</param-value>
    </init-param>
    <init-param>
    		<param-name>serverName</param-name>
    		<param-value>http://localhost:8080</param-value>
    </init-param>


    记住,上面的那行代表我们的cas server的服务器所在的地址,当用户用上面的cas-server的登录界面登录成功后,cas server 会自动跳回用户在ie地址里输入的子系统地址的首页。

    如:我们先输入http://localhost:8080/cas-sample-site1,此时系统会先跳到http://localhost:9090/cas-server/login的画面要求用户先去做一次登录。


    那么cas server它是怎么知道子系统地址的首页位于哪个地址(哪台服务器上)的呢,那么你要”注册“这个地址给cas server。


    因此,第二行就是我们的具体的子系统的首页所在的地址。


    这样的地方在我们的web.xml文件中一共出现了两处:

    • 一处位于org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
    • 一处位于org.jasig.cas.client.authentication.AuthenticationFilter
    这2处如果没配好,你会遇到下列问题:
    • 登录后无法正常跳回子系统的首页
    • 无法正常退出
    • 无法做系统间切换时的跳转
    因此一定要注意啦!!!


    我们把两个工程通过ECLIPSE布署在JBOSS7上,然后运行起来吧。


    别忘了启动我们的Tomcat里的cas server哦。




    全部启动完毕后我们在IE浏览器里输入:http://localhost:8080/cas-sample-site1 


    此时浏览器显示如下画面




    我们在cas server的登录画面输入我们数据库表sys_user中的相应的用户名与密码后,再来看此时的浏览器它会跑到哪儿去?




    点击cas-sample-site2这个链接呢?




    然后点击“退出”这个链接




    此时我们再在浏览器里输入:http://localhost:8080/cas-sample-site2--有时浏览器有缓存,它还是会显示cas-sample-site2的首页,这时你可以点一下F5或者是刷新按钮(这个可以通过代码来避免jsp或者是html页中使用缓存来做到)



    look!

    由于是统一注销,因此一旦注销,两个WEB都无法访问了,必须要求“统一登录一下”,于是我们再次输入用户名和密码

    对不对。


    好了,第一天不讲太多,从明天开始我们会依次开始讲:


    1. 如何使用LDAP即模拟WINDOWS AD域的登录模式


    2. 如何在不同的web工程间获取“统一登录”时的用户信息即userprincipal


    3. 如何改造CAS SSO自带的登录界面


    4. 如何使得我们的CAS SSO可以支持类似于淘宝这种“多租户”的概念


    差不多所有内容预计在5-6课左右,敬请期待。 




    展开全文
  • 分析:大家都知道,每年的总共日期,要么就是365,要么就是366,具体是取决于闰年还是平年,更确切的说就是每年二月是28还是29,归结到这个问题,有个关键的认识,就是求解这一年是闰年(366)还是...
  • 【1】了解Max Script这是Max内置的脚本语言,可以很方便用来完成一些程序化或者快速完成...【2】开始搭建个我们的编程环境我习惯了c++的高亮和自动补全,如果叫我用max自带的那个editor来做我会觉得十分痛苦。所以我
  • 7-16 然后是几点(15 分)

    千次阅读 2018-02-25 08:37:24
    7-16 然后是几点(15 分)有时候人们用四位数字表示个时间,比如1106表示11点零6分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。读入两个数字,第个数字以这样的四位数字表示当前时间,第二个...
  • PAT练习基础编程题目之 然后是几点

    千次阅读 2016-01-09 13:20:44
    读入两个数字,第个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,即5点30分表示为530。注意,第二个...
  • 每年甚至每个月都有各种促销节,最有名的就是双十一和年货节了,不过现在马上就是六月份了,又是盛夏人们囤衣服的时候,按照往年惯例会淘宝自然不会错过这个大促好时机,最近有人问小编淘宝618活动几天,接下来就为...
  • C语言之计算某天为年中第几天

    万次阅读 2017-05-21 11:58:11
    输入某年某月某日,判断这一天是这一年的第天?程序分析:以5月21日为例,应该先把前5个月的加起来,然后再加上21天即本年的第天;这里还有一个特殊情况,那就是2月份的天数和闰年平年有关,如果是闰年且输入...
  • 关于裁员几点看法及建议

    千次阅读 多人点赞 2019-11-26 07:20:00
    最近网易裁员事件引起广泛关注,昨天网易针对此事,也发了声明,到底谁对谁错,孰是孰非?我们作为吃瓜观众实在是知之甚少,所以不敢妄下定论。身处软件开发这个行业,近两年来,对...
  • PAT-然后是几点(简单编程题)

    千次阅读 2015-12-24 09:45:00
    读入两个数字,第个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,即5点30分表示为530。注意,第二个...
  • 2)个活动的最晚开始几天不影响,或者个活动可以耽搁的时间,是有公式计算的 3)关键路径为起点到终点权值加起来最大的路径 直接例题 首先,关键路径为最大(大)的总值,计算可以得到ABCEFJ=18,所以关键路径的...
  •  如上图所示,某活动项工期为1个工作日,开始时间应该是当天,也就是开始时间与完成时间都是2016年8月23日才对,但工具中显示的完成时间为2016年8月24日,给人的感觉误以为工期为2个工作日;  这种情况基本是由于...
  • 程序员的一天是怎样过的?

    千次阅读 2019-05-20 16:17:07
    1、早上8到公司,看15分钟微博,做一天的计划。 2、10开个晨会,然后工作到12。 3、中午出去吃个饭+聊天,1半回来。 4、晚上6下班,公司吃免费的晚餐,然后加班到8到9点。 5、锻炼半个小时身体,洗澡看...
  • 昨天廊坊,北京等很多地方迎来了的场暴雨,十年不遇的大暴雨,从下午 6整整下到了今天早上4左右。早上起来,散步在安静的校园,看着一片一片的雨滩,昨日发生的点点滴滴,又次映射到我的脑海……  ...
  • 直接取精确的时间范围进行比较,当天时间范围为为000至2359 ) select * from 某张表 t where t.SCAN_DATE_TIME between to_date('2019-02-19 00:00:00','YYYY-MM-DD HH24:mi:ss') and to_date('2019-...
  • 这是一篇本应在很后面才会写到的回忆,只不过由于今天接到腾讯的电话,所以决定先写了,大概会持续写数篇吧。... 这一天,我忽然决定学学web开发,这个我在前面的《菜鸟从零开始的第一个应用上线记》中也写了一些,
  • // 从这里开始进行所有的绘制 int DrawGLScene(GLvoid) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 清除屏幕和深度缓存 glLoadIdentity();// 重置当前的模型观察矩阵  //设置图元颜色  ...
  • 关于DBN的几点思考

    千次阅读 2013-12-12 10:48:59
    关于DBN我一直有以下三个问题: 1.什么是complementary priors? 2.为什么说RBM展开后可以当成sigmoid belief network with tied ...经过这几天的冥思苦想,我得出来了一些对于我个人来说比较可以接受的解释,这
  • java 获取前一天日期

    万次阅读 2018-11-28 17:39:33
    用Java获取前一天日期: calendar.add(Calendar.DAY_OF_MONTH, -1);   -1 代表当天前一天的日期,如果将 -1 改成 0,得到的会是当前的日期。以此类推 可以用Java得到以当前时间为准的前天或者后天的日期 ...
  • 一开始以为要和软件在同一目录下就把 Coocox的驱动(CoMDKPlugin-1.3.1.exe)果断安装在了“右键KEIL软件->查找目标位置”的那个目录下,反复安装好次都不好使额。后来安装在它的上层目录,这才好使。在debug里面...
  • 年,Python 的受欢迎程度可谓是扶摇直上,加入 Python 学习大营的人越来越多。不过,随之而来的是,竞争越来越激烈。迷茫的声音也越来越多,我经常看到粉丝在后台...
  • 大概在3年以前,我就开通了个人微信公众号:业余草(yyucao),只不过没...之前的微信公众号帐号的粉丝一直没有大的提升,最近开始逐步加强了运营的动作,粉丝从每天10个之内飙升到每天200以上,下面是几点总结。
  • 疯掉的一天

    千次阅读 2019-10-24 14:58:38
    接触测试工作的第一天 对于换行业的小白来说,真是不知道从哪里开始下手,一筹莫展,练习做wps,练习做表格,结果努力半天方向不对; 网上找一些实习测试的工作,更新简历投了好多份,太不理想了,接到一个诈骗...
  • 贾浩楠 萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI很快啊!华为鸿蒙2.0,这就来了。目前,鸿蒙2.0已经开放公测,不少华为用户已经开始上手体验了。据华为消费者业务软件部总裁...
  • 最后一天

    千次阅读 热门讨论 2011-05-19 10:53:00
    今天是在杭最后一天,难得有这个无业游民没人管的状态,本打算再闲两天回去,结果天太热,没什么地方好去,算了买了张晚上的车票,回去吧,早点开始新的生活 有意识地看了看以前的日志,回想这年离职的...
  • 程序一点点地写,日子一天天地过。

    万次阅读 多人点赞 2011-09-07 23:20:10
    我还记得那我上班正忙,被团恶心的程序和堆变态的需求折磨着,我那伟大的母亲大人特地打电话嘱咐我:“新婚姻法告诉我们,男人的车子不可靠了,房子不可靠了,女人必须得靠自己!” 字正腔圆,铿锵有力,顿时...
  • 午饭前,项目组同事挑起了这个话题,由于是马上要到饭了,所以没有细聊,但公认的结论是,从零开始准备个项目,花费的工作量不小。 由于最近我参与了个全新的web项目,有切身的体验,所以记录下来。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 876,206
精华内容 350,482
关键字:

一天开始是几点开始