服务器端配置请参考: http://www.cnblogs.com/sunshineatnoon/p/4064632.html

工具:myeclipse或者javaee-eclipse

1.启动javaee-eclipse,我启动的时候遇到了java was started but returned exit code=1的错误,搜了一下解决的方法大概有两类:

(1)eclipse目录不能有中文(我就是这个问题)

(2)修改eclipse目录下的eclipse.ini文件,在-vmargs这一行前面加上两行,一行是-vm,令一行是javaw.exe的路径,就像这样:

-vm
E:\Program Files\Java\jdk1.7.0\bin\javaw.exe

大多数情况下基本就没问题了,还有人是因为java内存分配不足引起的,网上有答案,这里就不提了。

2.eclipse中新建File->New->Other->Web->Dynamic Web Project,创建一个名叫CasClient的web工程,注意新建的时候要把Generate web.xml deployment descriptor勾选上,否则后面要手动添加web.xml文件。

3.把\cas-client-3.2.1\modules下的所有jar包拷贝到j2eeeclipseWorkSpace\CasClient\WebContent\WEB-INF\lib下。

4.把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>casclient1</display-name> <!-- 用于单点退出,该监听器用于实现单点登出功能,通知其他应用单点登出 -->
<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>CASFilter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<!-- 设置登录的URL地址 -->
<param-value>https://localhost:8443/cas/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>CASFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <!-- 该过滤器负责对Ticket的校验 -->
<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>https://localhost:8443/cas</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 Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <!-- 该过滤器负责实现HttpServletRequest请求的包裹,允许开发者通过HttpServletRequest的getRemoteUser()获取SSO登录的用户 -->
<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> <!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->
<filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

5.在j2eeeclipseWorkSpace\CasClient\WebContent\目录下新建index.jsp文件

 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ page import="org.jasig.cas.client.authentication.AttributePrincipal" %>
<!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>casClient1</title>
</head>
<body>
<%
//AttributePrincipal principal = (AttributePrincipal)request.getUserPrincipal();
//String userName = principal.getName();
%>
<br />--------------------------------------------<br />
<h1>登录成功,CAS客户端1。</h1><br />
<!-- <h2>当前登录用户:</h2><br /> -->
<a href="http://localhost:8080/CasClient2/index.jsp">进入客户端2</a><br />
<a href="https://localhost:8443/cas/logout">退出</a><br />
</body>
</html>

6.在\apache-tomcat-7.0.56\webapps\下新建一个文件夹叫CasClient文件夹,然后把\j2eeeclipseWorkSpace\Cas Client\WebContent\下的两个文件夹META-INF和WEB-INF,还有index.jsp文件拷贝到刚才创建的CasClient文件夹下.

7.为了验证单点登录,用上述6步方法再创建一个CasClient2工程,也把它相应的文件拷贝到\apache-tomcat-7.0.56\webapps\CasClient下,注意CasClient2中index.jsp需要做的修改,上述15行改为:

<h1>登录成功,CAS客户端2。</h1><br />

17行改为:

 <a href="http://localhost:8080/CasClient/index.jsp">进入客户端1</a><br />

这样就可以从CasClient2跳转到CasClient界面。

8.验证单点登录系统:浏览器打开页面http://localhost:8080/CasClient,这是会跳转到cas的登录页面,如下图:

注意到红色部分可以帮助我们理解CAS的工作原理,当用户访问cas client对应的资源时,被重定向到cas server并且将用户想要访问的资源用GET的方式添加在url尾部(上述红框)发送给server,方便在登录成功后直接跳转到相应的资源。

然后我们用数据库中的用户名密码登录(与mysql的对接详情参见cas server配置,链接在博文最上方),登录成功后的页面如下:

然后我们可以直接点击“进入客户端2”跳转到CasClient2,或者直接在浏览器里面输入http://localhost:8080/CasClient2跳转到CasClient2页面,如下图所示:

可以看到从CAS客户端1进入到CAS客户端2完全不需要重新登录,从CAS客户端2再次跳转回到CAS客户端1页不需要重新登录,即实现了单点登录。

在上述的过程中,我还解决了三个bug:

1.一个是提示java.security.cert.CertificateException: No name matching localhost found,解决的方法参考http://www.cnblogs.com/dycg/archive/2013/04/04/2999012.html,即重新生成一边证书(详情参见cas server配置),在回答名字和姓氏的时候,确保回答的是localhost(或者你的域名)。

2.这时用新生成的证书替换原来的证书,又报错SunCertPathBuilderException: Unable To Find Valid Certification Path To Requested Target,这个的原因和解决方法这里http://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/解释的很清楚了,主要是服务端的证书没有被认证,从上述网址中总结的解决方法如下:

  (1)下载InstallCert.java(国外网站上大神写的解决这个问题的java文件,我把它down下来放在自己的网盘上了,大神网页参见参考资料[4])。

  (2)cd到InstallCert.java所在目录下编译运行InstallCert.java:

  然后根据提示选择相应的证书(应该是输入1),就会在InstallCert.java所在的目录下生成一个jssecacerts文件。

  (3)拷贝上述生成的jssecacerts文件到$JAVA_HOME\jre\lib\security目录下。

  (4)重新打开网页,就没有问题了。

3.部署CasClient的时候,tomcat出现错误:java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addFilter

解决方法是在\apache-tomcat-7.0.57\conf\context.xml的<Context></Context>两个标签之前插入<Loader delegate="true" />;[5]

参考资料:

[1]http://bh-keven.iteye.com/blog/1317793

[2]http://www.cnblogs.com/dycg/archive/2013/04/04/2999012.html

[3]http://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/

[4]https://blogs.oracle.com/gc/entry/unable_to_find_valid_certification

[5]http://nvry.iteye.com/blog/1726163

【Tech】单点登录系统CAS客户端demo的更多相关文章

  1. java单点登录系统CAS的简单使用

    转:http://blog.csdn.net/yunye114105/article/details/7997041 背景 有几个相对独立的java的web应用系统, 各自有自己的登陆验证功能,用户在 ...

  2. 单点登录系统CAS筹建及取得更多用户信息的实现

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  3. 开源单点登录系统CAS入门

    一.什么是CAS CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目.CAS 具有以 ...

  4. 【Tech】单点登录系统CAS服务器端搭建及实现用户名密码由MYSQL数据库验证

    CAS是YALE大学发起的一个开源项目,旨在为web应用系统提供一种可靠的单点登录方法.它主要分为client和server端,server端负责对用户的认证工作,client端负责处理对客户端受保护 ...

  5. cas单点登录系统:客户端(client)详细配置(包含统一单点注销配置)

    最近一直在研究cas登录中心这一块的应用,分享一下记录的一些笔记和心得.后面会把cas-server端的配置和重构,另外还有这几天再搞nginx+cas的https反向代理配置,以及cas的证书相关的 ...

  6. cas单点登录系统:客户端(client)详细配置

    最近一直在研究cas登录中心这一块的应用,分享一下记录的一些笔记和心得.后面会把cas-server端的配置和重构,另外还有这几天再搞nginx+cas的https反向代理配置,以及cas的证书相关的 ...

  7. 单点登录系统cas资料汇总

    http://jasig.github.io/cas/4.0.x/index.html           主页 https://jasigcas.herokuapp.com              ...

  8. CAS单点登录系统入门--分布式登录验证

    1.开源单点登录系统CAS入门 1.1 什么是单点登录 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要 ...

  9. CAS实现的单点登录系统

    单点登录(single sign on ),简称SSO. 纯属学习用,对来自网络的部分如果侵害了您的权力,请联系我.QQ:262800095 SSO的定义是在多个应用系统中,用户只需要登录一次就可以访 ...

随机推荐

  1. nc 查看端口是否 联通

    nc 47.9.16.1 3306 如果卡住,说明 该IP的这个端口 访问不通, 防火墙拦截了

  2. Intent跳转系统的应用

    1.从google搜索内容    Intent intent = new Intent();    intent.setAction(Intent.ACTION_WEB_SEARCH);    int ...

  3. OBS (open boardcast server)结构分析

    一,简介 OBS(open boardcast server),是一个用于直播的开源软件. 官方网站:https://obsproject.com/ 代码托管地址:https://github.com ...

  4. 数据库的SQL模式

    1.定义:何为MySQL的严格模式,简单来说就是MySQL自身对数据进行严格的校验(格式.长度.类型等),比如一个整型字段我们写入一个字符串类型的数据,在非严格模式下MySQL不会报错,同样如果定义了 ...

  5. azure iothub create-device-identity样例报错: unable to find valid certification path ,及iothub-explorer Error: CERT_UNTRUSTED

    https://docs.microsoft.com/zh-cn/azure/iot-hub/iot-hub-java-java-getstarted 在IDEA中执行上述的代码,会出现下面的报错信息 ...

  6. 【BZOJ1803】Spoj1487 Query on a tree III 主席树+DFS序

    [BZOJ1803]Spoj1487 Query on a tree III Description You are given a node-labeled rooted tree with n n ...

  7. 《从零开始学Swift》学习笔记(Day 8)——小小常量、变量大作用

    原创文章,欢迎转载.转载请注明:关东升的博客   计算机语言学习中都有常量和变量,他们几乎是我编写代码的灵魂了,离开他们我真的是“活不了” 常量是标识符的前面加上关键字let.常量其值在使用过程中不会 ...

  8. 网络摄像机进行互联网视频直播录像方案的选择,EasyNVS or EasyCloud or EasyGBS?

    背景需求 互联网视频直播越来越成为当前大势:直播的需求往往都伴随在录像的需求,对于录像,不同的场景又有不同的方案选择: 本篇博客将会介绍对应的几种录像方案,可以帮助有互联网录像需求的用户进行对应的录像 ...

  9. Object类有哪些公用方法?

    Object是所有类的父类,任何类都默认继承Object. clone 保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedExce ...

  10. hdu 4627 The Unsolvable Problem【hdu2013多校3签到】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4627 The Unsolvable Problem Time Limit: 2000/1000 MS ( ...