- 浏览: 500165 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (301)
- Swing技术 (1)
- Linux (1)
- Javascript (22)
- 数据结构和算法 (3)
- J2SE (36)
- workflow (5)
- 设计模式 (14)
- web service (19)
- Ajax (14)
- 中间件 & 服务器 (8)
- 多线程 (9)
- Oracle (52)
- sys & soft (10)
- JMS (3)
- sso (9)
- android (11)
- struts2 (10)
- web协议 (2)
- 分布式 (2)
- PM (2)
- OLAP (3)
- Redis (2)
- Hibernate (7)
- ibatis (2)
- SQLServer (1)
- maven (3)
- Spring (7)
- Jsp (2)
- slf4j (1)
- jQuery (15)
- 权限 (1)
- 系统集成 (1)
- 笔记 (1)
- Freemarker (2)
- 项目管理 (1)
- eclipse (3)
- GIS (1)
- NoSql (3)
- win10 (1)
- win10网络 (2)
- 底层 (3)
- 数据库 (0)
最新评论
-
kabuto_v:
请问那种图,uml图是怎么画出来的呢?是您自己手工画的,还是有 ...
FastJSON 序列化、反序列化实现 -
梦行Monxin商城系统:
电商实例、业务并发、网站并发及解决方法 -
rockethj8:
client 㓟有一个参数是可以忽略一些URL 不进行验证登录 ...
SSO 之 (单点登录)实施中遇到的几个问题 -
mengxiangfeiyan:
好啊。。。。。
Oracle删除表,删除数据以及恢复数据、利用现有表创建新表
http://www.sparkfood.com/2010/0821/3907.html
环境篇
一、所需软件
Jdk:jdk1.6.0_13
Apache:httpd-2.2.15-win32-x86-openssl-0.9.8m-r2
Tomcat:apache-tomcat-6.0.10
jks2pfx:证书导出工具
memcache:memcached-1.2.1-win32(需要memcache集群环境)
二、安全证书生成
1、keytool
Apache、tomcat、jdk需要使用安全证书,进windows command窗口生成证书,命令如下:
--生成证书库
keytool -genkey -alias 800jit -keyalg RSA -keystore d:/cert/800jitkey
--从证书库中到处证书
keytool -export -file d:/cert/800jit.crt -alias 800jit -keystore d:/cert/800jitkey
--把证书导入jdk的证书库
keytool -import -keystore d: /jdk1.6.0_13/jre/lib/security/cacerts -file d:/cert/800jit.crt -alias 800jit
--生成Apache服务器的SSL连接需要配置私钥文件和证书文件
D:\casex\jks2pfx>JKS2PFX.bat .keystore 800jitkey tomcat server_dev00
生成的server_dev00.crt,server_dev00.key放到D:/work/Apache2.2/conf/
2、openssl
openssl req -config ..\conf\openssl.cnf -new -out olymtech.csr
openssl rsa -in privkey.pem -out olymtech.key
openssl x509 -in olymtech.csr -out olymtech.cert -req -signkey olymtech.key -days 3650
openssl x509 -in olymtech.cert -out olymtech.der.crt -outform DER
keytool -import -keystore d:/work/jdk1.6.0_13/jre/lib/security/cacerts -file d:/casex/ssl/olymtech.crt -alias olymtech
keytool -import -keystore D:/casex/800jitkey -file D:/casex/cas-doc/ssl/olymtech.crt -alias olymtech
三、Apache配置
Apache+ssl+虚拟机
--修改http.conf文件
取消注释 LoadModule ssl_module modules/mod_ssl.so
取消注释 Include conf/extra/httpd-ssl.conf
取消注释 Include conf/extra/httpd-vhosts.conf
ProxyPass /cas balancer://cas lbmethod=bytraffic stickysession=jsessionid
<proxy balancer://cas/>
BalancerMember ajp://192.168.1.190:10009/cas loadfactor=1 route=jvm1
BalancerMember ajp://192.168.1.190:8009/cas loadfactor=1 route=jvm2
</proxy>
--修改httpd-ssl.conf
在<VirtualHost _default_:443>下增加
ProxyPass /cas balancer://cas/ lbmethod=bytraffic stickysession=jsessionid
ProxyPassReverse /cas balancer://cas/
SSLProxyEngine On
修改
SSLCertificateFile "D:/work/Apache2.2/conf/server_dev00.crt"
SSLCertificateKeyFile "D:/work/Apache2.2/conf/server_dev00.key"
--修改httpd-vhosts.conf
在<VirtualHost *:80>下增加
ProxyPass /cas balancer://cas/ lbmethod=bytraffic stickysession=jsessionid
ProxyPassReverse /cas balancer://cas/
四、Tomcat配置
修改server.xml
--配置ssl
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="d:/work/apache-tomcat-6.0.10/conf/800jitkey"
keystorePass="111111" />
五、session共享(Tomcat)
六、memcache集群
CAS SERVER篇
一、CAS 原理介绍
访问流程图
主要原理:用户第一次访问一个CAS 服务的客户web 应用时(访问URL : ),部署在客户web 应用的cas AuthenticationFilter ,会截获此请求,生成service 参数,然后redirect 到CAS 服务的login 接口,url为 ,认证成功后,CAS 服务器会生成认证cookie ,写入浏览器,同时将cookie 缓存到服务器本地,CAS 服务器还会根据service 参数生成ticket,ticket 会保存到服务器,也会加在url 后面,然后将请求redirect 回客户web 应用,url 为 。这时客户端的AuthenticationFilter 看到ticket 参数后,会跳过,由其后面的TicketValidationFilter 处理,TicketValidationFilter 会利用httpclient 工具访问cas 服务的/serviceValidate 接口, 将ticket 、service 都传到此接口,由此接口验证ticket 的有效性,TicketValidationFilter 如果得到验证成功的消息,就会把用户信息写入web 应用的session里。至此为止,SSO 会话就建立起来了,以后用户在同一浏览器里访问此web 应用时,AuthenticationFilter 会在session 里读取到用户信息,所以就不会去CAS 认证,如果在此浏览器里访问别的web 应用时,AuthenticationFilter 在session 里读取不到用户信息,会去CAS 的login 接口认证,但这时CAS 会读取到浏览器传来的cookie ,所以CAS 不会要求用户去登录页面登录,只是会根据service 参数生成一个ticket ,然后再和web 应用做一个验证ticket 的交互。
二、CAS 服务端的处理逻辑
CAS 服务端总共对外定义了9 个接口,客户端通过访问这9 个接口与服务端交互,这9个接口为:
接口
说明
备注
/login
认证接口
/logout
退出接口,负责销毁认证cookie
/validate
验证ticket 用的接口,CAS1.0 定义
/serviceValidate
验证ticket 用的接口,CAS2.0 定义,返回xml 格式的数据
/proxy
支持代理认证功能的接口
/proxyValidate
支持代理认证功能的接口
/CentralAuthenticationService
用于和远程的web services 交互
/remoteLogin(新增)
认证接口
/directLogin(新增)
认证接口
详细说明:
/login:
登录流程这部分要考虑到不同种类用户凭证的获取方案,以及客户应用传来的service 、gateway 、renew 参数的不同取值组合,CAS 为了实现流程的高度可配置性,采用了Spring Web Flow 技术。通过CAS 发布包里的login-webflow.xml 、cas-servlet.xml 、applicationContext.xml 这3 个文件,找出 了登录有关的所有组件,画出处理流程图。
CAS 默认的登录处理流程
第一次访问Web 应用的流程走向
已经登录web1 后,访问web1 的资源(web1 没有启动session ),或访问web2 的资源
注:
1 : InitialFlowSetupAction: 是流程的入口。用 request.getContextPath() 的值来设置 cookie 的 Path 值, Cookie 的 path 值是在配置文件里定义的,但这个 Action 负责将 request.getContextPath() 的值设置为 Cookie 的 path 值,这是在 cas 部署环境改变的情况下,灵活地设置 cookie path 的方式;把 cookie 的值以及 service 参数的值放入 requestContext 的 flowscope 里。
2 : GenerateServiceTicketAction 此 Action 负责根据 service 、 GTC cookie 值生成 ServiceTicket 对象, ServiceTicket 的 ID 就是返回给客户应用的 ticket 参数,如果成功创建 ServiceTicket ,则转发到 WarnAction ,如果创建失败,且 gateway 参数为 true ,则直接redirect 到客户应用, 否则则需要重新认证。
3 : viewLoginForm 这是登录页面, CAS 在此收集用户凭证。 CAS 提供的默认实现是 /WEB-INF/view/jsp/simple/ui/casLoginView.jsp 。
4 : bindAndValidate 对应 AuthenticationViaFormAction 的 doBind 方法,该方法负责搜集登录页面上用户录入的凭证信息(用户名、密码等),然后把这些信息封装到 CAS 内部的 Credentials 对象中。用户在 casLoginView.jsp 页面上点击提交后,会触发此方法。
5:submit 对应 AuthenticationViaFormAction 的 submit 方法 , 如果 doBind 方法成功执行完, 则触发 submit 方法,此方法负责调用centralAuthenticationService 的 grantServiceTicket 方法,完成认证工作,如果认证成功,则生成 TicketGrantingTicket 对象,放在缓存里, TicketGrantingTicket 的 ID 就是 TGC Cookie 的 value 值。
6 : warn CAS 提供了一个功能:用户在一个 web 应用中跳到另一个 web 应用时, CAS 可以跳转到一个提示页面,该页面提示用户要离开一个应用进入另一个应用,可以让用户自己选择。用户在登录页面 viewLoginForm 上选中了 id=”warn” 的复选框,才能开启这个功能。
WarnAction 就检查用户有没有开启这个功能,如果开启了,则转发到showWarnView, 如果没开启,则直接redirect 到客户应用。
7 :SendTicketGrantingTicketAction 此Action 负责为response 生成TGC Cookie ,cookie 的值就是 AuthenticationViaFormAction 的submit 方法生成的 TicketGrantingTicket 对象的 ID 。
8 : viewGenerateLoginSuccess 这是 CAS 的认证成功页面。
/logout: ( 对应实现类 org.jasig.cas.web.LogoutController )
处理逻辑:
1) removeCookie
2) 在服务端删除TicketGrantingTicket 对象(此对象封装了cookie 的value 值)
3 )redirect 到退出页面,有2 种选择:
if(LogoutController 的followServiceRedirects 属性为true 值,且url 里的service 参数非空){
redirect 到 sevice 参数标识的url
}
else{
redirect 到内置的casLogoutView (cas/WEB-INF/view/jsp/default/ui/casLogoutView.jsp ),如果url 里有url 参数,则此url 参数标识的链接会显示在casLogoutView 页面上。
}
/serviceValidate: (对应实现类 org.jasig.cas.web.ServiceValidateController )
处理逻辑:
如果service 参数为空或ticket 参数为空,则转发到failureView (/WEB-INF/view/jsp/default/protocol/2.0/casServiceValidationFailure.jsp )
验证ticket 。以ticket 为参数,去缓存里找ServiceTicketImpl 对象,如果能找到,且没有过期,且ServiceTicketImpl 对象对应的service 属性和service 参数对应,则验证通过,验证通过后,请求转发至casServiceSuccessView (cas/WEB-INF/view/jsp/default/protocol/2.0/casServiceValidationSuccess.jsp ),验证不通过,则转发到failureView 。
三、认证相关的概念及流程
概念
Credentials 用户提供的用于登录用的凭据信息,如用户名/ 密码、证书、IP 地址、Cookie 值等。比如 UsernamePasswordCredentials ,封装的是用户名和密码。CAS 进行认证的第一步,就是把从UI 或request 对象里取到的用户凭据封装成Credentials 对象,然后交给认证管理器去认证。
AuthenticationHandler 认证Handler, 每种AuthenticationHandler 只能处理一种Credentials ,如AbstractUsernamePasswordAuthenticationHandler 只负责处理 U sernamePasswordCredentials 。
Principal 封装用户标识,比如 SimplePrincipal, 只是封装了用户名。认证成功后, credentialsToPrincipalResolvers 负责由Credentials 生成 Principal 对象。
CredentialsToPrincipalResolvers 负责由 Credentials 生成 Principal 对象,每种 CredentialsToPrincipalResolvers 只处理 一种Credentials ,比如 UsernamePasswordCredentialsToPrincipalResolver 负责从 U sernamePasswordCredentials 中取出用户名,然后将其赋给生成的 SimplePrincipal 的 ID 属性。
AuthenticationMetaDataPopulators 负责将 Credentials 的一些属性赋值给 Authentication 的 attributes 属性。
Authentication Authentication是认证管理器的最终处理结果, Authentication 封装了 Principal ,认证时间,及其他一些属性(可能来自 Credentials )。
AuthenticationManager 认证管理器得到 Credentials 对象后,负责调度AuthenticationHandler 去完成认证工作,最后返回的结果是 Authentication 对象。
CentralAuthenticationService CAS 的服务类,对 Web 层提供了一些方法。该类还负责调用 AuthenticationManager 完成认证逻辑。
序列图
类图
四、
CAS的核心就是其Ticket,及其在Ticket之上的一系列处理操作。CAS的主要票据有TGT、ST、PGT、PGTIOU、PT,其中TGT、ST是CAS1.0协议中就有的票据,PGT、PGTIOU、PT是CAS2.0协议中有的票据。
一 名词解释
TGT(Ticket Grangting Ticket)
TGT是CAS为用户签发的登录票据,拥有了TGT,用户就可以证明自己在CAS成功登录过。TGT封装了Cookie值以及此Cookie值对应的用户信息。用户在CAS认证成功后,CAS生成cookie,写入浏览器,同时生成一个TGT对象,放入自己的缓存,TGT对象的ID就是cookie的值。当HTTP再次请求到来时,如果传过来的有CAS生成的cookie,则CAS以此cookie值为key查询缓存中有无TGT ,如果有的话,则说明用户之前登录过,如果没有,则用户需要重新登录。
ST(Service Ticket)
ST是CAS为用户签发的访问某一service的票据。用户访问service时,service发现用户没有ST,则要求用户去CAS获取ST。用户向CAS发出获取ST的请求,如果用户的请求中包含cookie,则CAS会以此cookie值为key查询缓存中有无TGT,如果存在TGT,则用此TGT签发一个ST,返回给用户。用户凭借ST去访问service,service拿ST去CAS验证,验证通过后,允许用户访问资源。
PGT(Proxy Granting Ticket)
Proxy Service的代理凭据。用户通过CAS成功登录某一Proxy Service后,CAS生成一个PGT对象,缓存在CAS本地,同时将PGT的值(一个UUID字符串)回传给Proxy Service,并保存在Proxy Service里。Proxy Service拿到PGT后,就可以为Target Service(back-end service)做代理,为其申请PT。
PGTIOU(Proxy Granting Ticket IOU)
PGTIOU是CAS协议中定义的一种附加票据,它增强了传输、获取PGT的安全性。
PGT的传输与获取的过程:Proxy Service调用CAS的serviceValidate接口验证ST成功后,CAS首先会访问pgtUrl指向的https url,将生成的 PGT及PGTIOU传输给proxy service,proxy service会以PGTIOU为key,PGT为value,将其存储在Map中;然后CAS会生成验证ST成功的xml消息,返回给Proxy Service,xml消息中含有PGTIOU,proxy service收到Xml消息后,会从中解析出PGTIOU的值,然后以其为key,在map中找出PGT的值,赋值给代表用户信息的Assertion对象的pgtId,同时在map中将其删除。
PT(Proxy Ticket)
PT是用户访问Target Service(back-end service)的票据。如果用户访问的是一个Web应用,则Web应用会要求浏览器提供ST,浏览器就会用cookie去CAS获取一个ST,然后就可以访问这个Web应用了。如果用户访问的不是一个Web应用,而是一个C/S结构的应用,因为C/S结构的应用得不到cookie,所以用户不能自己去CAS获取ST,而是通过访问proxy service的接口,凭借proxy service的PGT去获取一个PT,然后才能访问到此应用。
二 代码解析
CAS Ticket类图
TicketGrantingTicket 的 grantServiceTicket方法
方法声明:public synchronized ServiceTicket grantServiceTicket(final String id,final Service service, final ExpirationPolicy expirationPolicy, final boolean credentialsProvided)
方法描述:
1:生成SerivceTicketImpl
2:更新属性:
this.previousLastTimeUsed = this.lastTimeUsed;
this.lastTimeUsed = System.currentTimeMillis();
this.countOfUses++;
3:给service对象的principal属性赋值
4:将service对象放入map services
ServiceTicket 的 grantTicketGrantingTicket方法
方法声明:
public TicketGrantingTicket grantTicketGrantingTicket(final String id, final Authentication authentication,final ExpirationPolicy expirationPolicy)
方法描述:在CAS3.3对CAS2.0协议的实现中,PGT是由ST签发的,调用的就是ServiceTicket的grantTicketGrantingTicket方法。方法返回的TicketGrantingTicket对象,表征的是一个PGT对象,其中的ticketGrantingTicket属性的值是签发ST的TGT对象。
TicketGrantingTicket 的 expire方法
方法声明:void expire()
方法描述:
在CAS的logout接口实现中,要调用TGT对象的expire方法,然后会在缓存中清除此TGT对象。
expire方法的内容:循环遍历 services 中的Service对象,调用其logoutOfService方法。具体Service实现类中的logoutOfService方法的实现,要通知具体的应用,客户要退出。
三、TGT、ST、PGT、PT关系
1:ST是TGT签发的。用户在CAS上认证成功后,CAS生成TGT,用TGT签发一个ST,ST的ticketGrantingTicket属性值是TGT对象,然后把ST的值redirect到客户应用。
2:PGT是ST签发的。用户凭借ST去访问Proxy service,Proxy service去CAS验证ST(同时传递PgtUrl参数给CAS),如果ST验证成功,则CAS用ST签发一个PGT,PGT对象里的ticketGrantingTicket是签发ST的TGT对象。
3:PT是PGT签发的。Proxy service代理back-end service去CAS获取PT的时候,CAS根据传来的pgt参数,获取到PGT对象,然后调用其grantServiceTicket方法,生成一个PT对象。
TGT、ST、PGT、PT之间的关联关系
CAS CLIENT篇
CASFilter 参数说明:
参数
是否必须
说明
com.olymtech.cas.client.filter.loginUrl
是
指定 CAS 提供登录页面的 URL
com.olymtech.cas.client.filter.validateUrl
是
指定 CAS 提供 service ticket 或 proxy ticket 验证服务的 URL
com.olymtech.cas.client.filter.serverName
是
指定客户端的域名和端口,是指客户端应用所在机器而不是 CAS Server 所在机器,该参数或 serviceUrl 至少有一个必须指定
com.olymtech.cas.client.filter.serviceUrl
否
该参数指定过后将覆盖 serverName 参数,成为登录成功过后重定向的目的地址
com.olymtech.cas.client.filter.wrapRequest
否
如果指定为 true,那么 CASFilter 将重新包装 HttpRequest,并且使 getRemoteUser() 方法返回当前登录用户的用户名
com.olymtech.cas.client.filter.noFilter
否
设置不过滤的路径,语法如下:/name1/,/name2,
com.olymtech.cas.client.filter.proxyCallbackUrl
否
用于当前应用需要作为其他服务的代理(proxy)时获取 Proxy Granting Ticket 的地址
com.olymtech.cas.client.filter.authorizedProxy
否
用于允许当前应用从代理处获取 proxy tickets,该参数接受以空格分隔开的多个 proxy URLs,但实际使用只需要一个成功即可。当指定该参数过后,需要修改 validateUrl 到 proxyValidate,而不再是 serviceValidate
com.olymtech.cas.client.filter.renew
否
如果指定为 true,那么受保护的资源每次被访问时均要求用户重新进行验证,而不管之前是否已经通过
com.olymtech.cas.client.filter.gateway
否
指定 gateway 属性
应用整合篇
一、JAVA程序整合
1、 应用配置说明(结合cas client)
导入key到本地jdk(tomcat使用的jdk必须)
keytool -import -keystore d:/work/jdk1.6.0_13/jre/lib/security/cacerts -file d:/casex/800jit.crt -alias 800jit
在ie中导入证书800jit.crt
修改web程序的web.xml添加
<!-- 用于单点退出 -->
<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>
<filter-name>CAS Filter</filter-name>
<filter-class>com.olymtech.cas.client.filter.CASFilter</filter-class>
<init-param>
<param-name>com.olymtech.cas.client.filter.loginUrl</param-name>
<param-value>https://cas.server.com/cas/login</param-value>
</init-param>
<init-param>
<param-name>com.olymtech.cas.client.filter.validateUrl</param-name>
<param-value>https://cas.server.com/cas/serviceValidate</param-value>
</init-param>
<init-param>
<param-name>com.olymtech.cas.client.filter.serverName</param-name>
<param-value>saas.server.com</param-value>
</init-param>
<init-param>
<param-name>com.olymtech.cas.client.filter.wrapRequest</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在jsp/servlet中得到登陆数据:
<%@ page language="java" import="com.olymtech.cas.client.filter.CASFilterRequestWrapper"%>
<%
CASFilterRequestWrapper reqWrapper=new CASFilterRequestWrapper(request);
String username = reqWrapper.getRemoteUser();
%>
二、.NET程序整合
附件
ssl.rar(证书)
http.conf(apache配置文件)
httpd-ssl.conf(apache配置文件)
httpd-vhosts.conf(apache配置文件)
server.xml(tomcat配置文件)
AppSsoDemo-java.rar(java整合例子,包含所需jar包)
环境篇
一、所需软件
Jdk:jdk1.6.0_13
Apache:httpd-2.2.15-win32-x86-openssl-0.9.8m-r2
Tomcat:apache-tomcat-6.0.10
jks2pfx:证书导出工具
memcache:memcached-1.2.1-win32(需要memcache集群环境)
二、安全证书生成
1、keytool
Apache、tomcat、jdk需要使用安全证书,进windows command窗口生成证书,命令如下:
--生成证书库
keytool -genkey -alias 800jit -keyalg RSA -keystore d:/cert/800jitkey
--从证书库中到处证书
keytool -export -file d:/cert/800jit.crt -alias 800jit -keystore d:/cert/800jitkey
--把证书导入jdk的证书库
keytool -import -keystore d: /jdk1.6.0_13/jre/lib/security/cacerts -file d:/cert/800jit.crt -alias 800jit
--生成Apache服务器的SSL连接需要配置私钥文件和证书文件
D:\casex\jks2pfx>JKS2PFX.bat .keystore 800jitkey tomcat server_dev00
生成的server_dev00.crt,server_dev00.key放到D:/work/Apache2.2/conf/
2、openssl
openssl req -config ..\conf\openssl.cnf -new -out olymtech.csr
openssl rsa -in privkey.pem -out olymtech.key
openssl x509 -in olymtech.csr -out olymtech.cert -req -signkey olymtech.key -days 3650
openssl x509 -in olymtech.cert -out olymtech.der.crt -outform DER
keytool -import -keystore d:/work/jdk1.6.0_13/jre/lib/security/cacerts -file d:/casex/ssl/olymtech.crt -alias olymtech
keytool -import -keystore D:/casex/800jitkey -file D:/casex/cas-doc/ssl/olymtech.crt -alias olymtech
三、Apache配置
Apache+ssl+虚拟机
--修改http.conf文件
取消注释 LoadModule ssl_module modules/mod_ssl.so
取消注释 Include conf/extra/httpd-ssl.conf
取消注释 Include conf/extra/httpd-vhosts.conf
ProxyPass /cas balancer://cas lbmethod=bytraffic stickysession=jsessionid
<proxy balancer://cas/>
BalancerMember ajp://192.168.1.190:10009/cas loadfactor=1 route=jvm1
BalancerMember ajp://192.168.1.190:8009/cas loadfactor=1 route=jvm2
</proxy>
--修改httpd-ssl.conf
在<VirtualHost _default_:443>下增加
ProxyPass /cas balancer://cas/ lbmethod=bytraffic stickysession=jsessionid
ProxyPassReverse /cas balancer://cas/
SSLProxyEngine On
修改
SSLCertificateFile "D:/work/Apache2.2/conf/server_dev00.crt"
SSLCertificateKeyFile "D:/work/Apache2.2/conf/server_dev00.key"
--修改httpd-vhosts.conf
在<VirtualHost *:80>下增加
ProxyPass /cas balancer://cas/ lbmethod=bytraffic stickysession=jsessionid
ProxyPassReverse /cas balancer://cas/
四、Tomcat配置
修改server.xml
--配置ssl
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="d:/work/apache-tomcat-6.0.10/conf/800jitkey"
keystorePass="111111" />
五、session共享(Tomcat)
六、memcache集群
CAS SERVER篇
一、CAS 原理介绍
访问流程图
主要原理:用户第一次访问一个CAS 服务的客户web 应用时(访问URL : ),部署在客户web 应用的cas AuthenticationFilter ,会截获此请求,生成service 参数,然后redirect 到CAS 服务的login 接口,url为 ,认证成功后,CAS 服务器会生成认证cookie ,写入浏览器,同时将cookie 缓存到服务器本地,CAS 服务器还会根据service 参数生成ticket,ticket 会保存到服务器,也会加在url 后面,然后将请求redirect 回客户web 应用,url 为 。这时客户端的AuthenticationFilter 看到ticket 参数后,会跳过,由其后面的TicketValidationFilter 处理,TicketValidationFilter 会利用httpclient 工具访问cas 服务的/serviceValidate 接口, 将ticket 、service 都传到此接口,由此接口验证ticket 的有效性,TicketValidationFilter 如果得到验证成功的消息,就会把用户信息写入web 应用的session里。至此为止,SSO 会话就建立起来了,以后用户在同一浏览器里访问此web 应用时,AuthenticationFilter 会在session 里读取到用户信息,所以就不会去CAS 认证,如果在此浏览器里访问别的web 应用时,AuthenticationFilter 在session 里读取不到用户信息,会去CAS 的login 接口认证,但这时CAS 会读取到浏览器传来的cookie ,所以CAS 不会要求用户去登录页面登录,只是会根据service 参数生成一个ticket ,然后再和web 应用做一个验证ticket 的交互。
二、CAS 服务端的处理逻辑
CAS 服务端总共对外定义了9 个接口,客户端通过访问这9 个接口与服务端交互,这9个接口为:
接口
说明
备注
/login
认证接口
/logout
退出接口,负责销毁认证cookie
/validate
验证ticket 用的接口,CAS1.0 定义
/serviceValidate
验证ticket 用的接口,CAS2.0 定义,返回xml 格式的数据
/proxy
支持代理认证功能的接口
/proxyValidate
支持代理认证功能的接口
/CentralAuthenticationService
用于和远程的web services 交互
/remoteLogin(新增)
认证接口
/directLogin(新增)
认证接口
详细说明:
/login:
登录流程这部分要考虑到不同种类用户凭证的获取方案,以及客户应用传来的service 、gateway 、renew 参数的不同取值组合,CAS 为了实现流程的高度可配置性,采用了Spring Web Flow 技术。通过CAS 发布包里的login-webflow.xml 、cas-servlet.xml 、applicationContext.xml 这3 个文件,找出 了登录有关的所有组件,画出处理流程图。
CAS 默认的登录处理流程
第一次访问Web 应用的流程走向
已经登录web1 后,访问web1 的资源(web1 没有启动session ),或访问web2 的资源
注:
1 : InitialFlowSetupAction: 是流程的入口。用 request.getContextPath() 的值来设置 cookie 的 Path 值, Cookie 的 path 值是在配置文件里定义的,但这个 Action 负责将 request.getContextPath() 的值设置为 Cookie 的 path 值,这是在 cas 部署环境改变的情况下,灵活地设置 cookie path 的方式;把 cookie 的值以及 service 参数的值放入 requestContext 的 flowscope 里。
2 : GenerateServiceTicketAction 此 Action 负责根据 service 、 GTC cookie 值生成 ServiceTicket 对象, ServiceTicket 的 ID 就是返回给客户应用的 ticket 参数,如果成功创建 ServiceTicket ,则转发到 WarnAction ,如果创建失败,且 gateway 参数为 true ,则直接redirect 到客户应用, 否则则需要重新认证。
3 : viewLoginForm 这是登录页面, CAS 在此收集用户凭证。 CAS 提供的默认实现是 /WEB-INF/view/jsp/simple/ui/casLoginView.jsp 。
4 : bindAndValidate 对应 AuthenticationViaFormAction 的 doBind 方法,该方法负责搜集登录页面上用户录入的凭证信息(用户名、密码等),然后把这些信息封装到 CAS 内部的 Credentials 对象中。用户在 casLoginView.jsp 页面上点击提交后,会触发此方法。
5:submit 对应 AuthenticationViaFormAction 的 submit 方法 , 如果 doBind 方法成功执行完, 则触发 submit 方法,此方法负责调用centralAuthenticationService 的 grantServiceTicket 方法,完成认证工作,如果认证成功,则生成 TicketGrantingTicket 对象,放在缓存里, TicketGrantingTicket 的 ID 就是 TGC Cookie 的 value 值。
6 : warn CAS 提供了一个功能:用户在一个 web 应用中跳到另一个 web 应用时, CAS 可以跳转到一个提示页面,该页面提示用户要离开一个应用进入另一个应用,可以让用户自己选择。用户在登录页面 viewLoginForm 上选中了 id=”warn” 的复选框,才能开启这个功能。
WarnAction 就检查用户有没有开启这个功能,如果开启了,则转发到showWarnView, 如果没开启,则直接redirect 到客户应用。
7 :SendTicketGrantingTicketAction 此Action 负责为response 生成TGC Cookie ,cookie 的值就是 AuthenticationViaFormAction 的submit 方法生成的 TicketGrantingTicket 对象的 ID 。
8 : viewGenerateLoginSuccess 这是 CAS 的认证成功页面。
/logout: ( 对应实现类 org.jasig.cas.web.LogoutController )
处理逻辑:
1) removeCookie
2) 在服务端删除TicketGrantingTicket 对象(此对象封装了cookie 的value 值)
3 )redirect 到退出页面,有2 种选择:
if(LogoutController 的followServiceRedirects 属性为true 值,且url 里的service 参数非空){
redirect 到 sevice 参数标识的url
}
else{
redirect 到内置的casLogoutView (cas/WEB-INF/view/jsp/default/ui/casLogoutView.jsp ),如果url 里有url 参数,则此url 参数标识的链接会显示在casLogoutView 页面上。
}
/serviceValidate: (对应实现类 org.jasig.cas.web.ServiceValidateController )
处理逻辑:
如果service 参数为空或ticket 参数为空,则转发到failureView (/WEB-INF/view/jsp/default/protocol/2.0/casServiceValidationFailure.jsp )
验证ticket 。以ticket 为参数,去缓存里找ServiceTicketImpl 对象,如果能找到,且没有过期,且ServiceTicketImpl 对象对应的service 属性和service 参数对应,则验证通过,验证通过后,请求转发至casServiceSuccessView (cas/WEB-INF/view/jsp/default/protocol/2.0/casServiceValidationSuccess.jsp ),验证不通过,则转发到failureView 。
三、认证相关的概念及流程
概念
Credentials 用户提供的用于登录用的凭据信息,如用户名/ 密码、证书、IP 地址、Cookie 值等。比如 UsernamePasswordCredentials ,封装的是用户名和密码。CAS 进行认证的第一步,就是把从UI 或request 对象里取到的用户凭据封装成Credentials 对象,然后交给认证管理器去认证。
AuthenticationHandler 认证Handler, 每种AuthenticationHandler 只能处理一种Credentials ,如AbstractUsernamePasswordAuthenticationHandler 只负责处理 U sernamePasswordCredentials 。
Principal 封装用户标识,比如 SimplePrincipal, 只是封装了用户名。认证成功后, credentialsToPrincipalResolvers 负责由Credentials 生成 Principal 对象。
CredentialsToPrincipalResolvers 负责由 Credentials 生成 Principal 对象,每种 CredentialsToPrincipalResolvers 只处理 一种Credentials ,比如 UsernamePasswordCredentialsToPrincipalResolver 负责从 U sernamePasswordCredentials 中取出用户名,然后将其赋给生成的 SimplePrincipal 的 ID 属性。
AuthenticationMetaDataPopulators 负责将 Credentials 的一些属性赋值给 Authentication 的 attributes 属性。
Authentication Authentication是认证管理器的最终处理结果, Authentication 封装了 Principal ,认证时间,及其他一些属性(可能来自 Credentials )。
AuthenticationManager 认证管理器得到 Credentials 对象后,负责调度AuthenticationHandler 去完成认证工作,最后返回的结果是 Authentication 对象。
CentralAuthenticationService CAS 的服务类,对 Web 层提供了一些方法。该类还负责调用 AuthenticationManager 完成认证逻辑。
序列图
类图
四、
CAS的核心就是其Ticket,及其在Ticket之上的一系列处理操作。CAS的主要票据有TGT、ST、PGT、PGTIOU、PT,其中TGT、ST是CAS1.0协议中就有的票据,PGT、PGTIOU、PT是CAS2.0协议中有的票据。
一 名词解释
TGT(Ticket Grangting Ticket)
TGT是CAS为用户签发的登录票据,拥有了TGT,用户就可以证明自己在CAS成功登录过。TGT封装了Cookie值以及此Cookie值对应的用户信息。用户在CAS认证成功后,CAS生成cookie,写入浏览器,同时生成一个TGT对象,放入自己的缓存,TGT对象的ID就是cookie的值。当HTTP再次请求到来时,如果传过来的有CAS生成的cookie,则CAS以此cookie值为key查询缓存中有无TGT ,如果有的话,则说明用户之前登录过,如果没有,则用户需要重新登录。
ST(Service Ticket)
ST是CAS为用户签发的访问某一service的票据。用户访问service时,service发现用户没有ST,则要求用户去CAS获取ST。用户向CAS发出获取ST的请求,如果用户的请求中包含cookie,则CAS会以此cookie值为key查询缓存中有无TGT,如果存在TGT,则用此TGT签发一个ST,返回给用户。用户凭借ST去访问service,service拿ST去CAS验证,验证通过后,允许用户访问资源。
PGT(Proxy Granting Ticket)
Proxy Service的代理凭据。用户通过CAS成功登录某一Proxy Service后,CAS生成一个PGT对象,缓存在CAS本地,同时将PGT的值(一个UUID字符串)回传给Proxy Service,并保存在Proxy Service里。Proxy Service拿到PGT后,就可以为Target Service(back-end service)做代理,为其申请PT。
PGTIOU(Proxy Granting Ticket IOU)
PGTIOU是CAS协议中定义的一种附加票据,它增强了传输、获取PGT的安全性。
PGT的传输与获取的过程:Proxy Service调用CAS的serviceValidate接口验证ST成功后,CAS首先会访问pgtUrl指向的https url,将生成的 PGT及PGTIOU传输给proxy service,proxy service会以PGTIOU为key,PGT为value,将其存储在Map中;然后CAS会生成验证ST成功的xml消息,返回给Proxy Service,xml消息中含有PGTIOU,proxy service收到Xml消息后,会从中解析出PGTIOU的值,然后以其为key,在map中找出PGT的值,赋值给代表用户信息的Assertion对象的pgtId,同时在map中将其删除。
PT(Proxy Ticket)
PT是用户访问Target Service(back-end service)的票据。如果用户访问的是一个Web应用,则Web应用会要求浏览器提供ST,浏览器就会用cookie去CAS获取一个ST,然后就可以访问这个Web应用了。如果用户访问的不是一个Web应用,而是一个C/S结构的应用,因为C/S结构的应用得不到cookie,所以用户不能自己去CAS获取ST,而是通过访问proxy service的接口,凭借proxy service的PGT去获取一个PT,然后才能访问到此应用。
二 代码解析
CAS Ticket类图
TicketGrantingTicket 的 grantServiceTicket方法
方法声明:public synchronized ServiceTicket grantServiceTicket(final String id,final Service service, final ExpirationPolicy expirationPolicy, final boolean credentialsProvided)
方法描述:
1:生成SerivceTicketImpl
2:更新属性:
this.previousLastTimeUsed = this.lastTimeUsed;
this.lastTimeUsed = System.currentTimeMillis();
this.countOfUses++;
3:给service对象的principal属性赋值
4:将service对象放入map services
ServiceTicket 的 grantTicketGrantingTicket方法
方法声明:
public TicketGrantingTicket grantTicketGrantingTicket(final String id, final Authentication authentication,final ExpirationPolicy expirationPolicy)
方法描述:在CAS3.3对CAS2.0协议的实现中,PGT是由ST签发的,调用的就是ServiceTicket的grantTicketGrantingTicket方法。方法返回的TicketGrantingTicket对象,表征的是一个PGT对象,其中的ticketGrantingTicket属性的值是签发ST的TGT对象。
TicketGrantingTicket 的 expire方法
方法声明:void expire()
方法描述:
在CAS的logout接口实现中,要调用TGT对象的expire方法,然后会在缓存中清除此TGT对象。
expire方法的内容:循环遍历 services 中的Service对象,调用其logoutOfService方法。具体Service实现类中的logoutOfService方法的实现,要通知具体的应用,客户要退出。
三、TGT、ST、PGT、PT关系
1:ST是TGT签发的。用户在CAS上认证成功后,CAS生成TGT,用TGT签发一个ST,ST的ticketGrantingTicket属性值是TGT对象,然后把ST的值redirect到客户应用。
2:PGT是ST签发的。用户凭借ST去访问Proxy service,Proxy service去CAS验证ST(同时传递PgtUrl参数给CAS),如果ST验证成功,则CAS用ST签发一个PGT,PGT对象里的ticketGrantingTicket是签发ST的TGT对象。
3:PT是PGT签发的。Proxy service代理back-end service去CAS获取PT的时候,CAS根据传来的pgt参数,获取到PGT对象,然后调用其grantServiceTicket方法,生成一个PT对象。
TGT、ST、PGT、PT之间的关联关系
CAS CLIENT篇
CASFilter 参数说明:
参数
是否必须
说明
com.olymtech.cas.client.filter.loginUrl
是
指定 CAS 提供登录页面的 URL
com.olymtech.cas.client.filter.validateUrl
是
指定 CAS 提供 service ticket 或 proxy ticket 验证服务的 URL
com.olymtech.cas.client.filter.serverName
是
指定客户端的域名和端口,是指客户端应用所在机器而不是 CAS Server 所在机器,该参数或 serviceUrl 至少有一个必须指定
com.olymtech.cas.client.filter.serviceUrl
否
该参数指定过后将覆盖 serverName 参数,成为登录成功过后重定向的目的地址
com.olymtech.cas.client.filter.wrapRequest
否
如果指定为 true,那么 CASFilter 将重新包装 HttpRequest,并且使 getRemoteUser() 方法返回当前登录用户的用户名
com.olymtech.cas.client.filter.noFilter
否
设置不过滤的路径,语法如下:/name1/,/name2,
com.olymtech.cas.client.filter.proxyCallbackUrl
否
用于当前应用需要作为其他服务的代理(proxy)时获取 Proxy Granting Ticket 的地址
com.olymtech.cas.client.filter.authorizedProxy
否
用于允许当前应用从代理处获取 proxy tickets,该参数接受以空格分隔开的多个 proxy URLs,但实际使用只需要一个成功即可。当指定该参数过后,需要修改 validateUrl 到 proxyValidate,而不再是 serviceValidate
com.olymtech.cas.client.filter.renew
否
如果指定为 true,那么受保护的资源每次被访问时均要求用户重新进行验证,而不管之前是否已经通过
com.olymtech.cas.client.filter.gateway
否
指定 gateway 属性
应用整合篇
一、JAVA程序整合
1、 应用配置说明(结合cas client)
导入key到本地jdk(tomcat使用的jdk必须)
keytool -import -keystore d:/work/jdk1.6.0_13/jre/lib/security/cacerts -file d:/casex/800jit.crt -alias 800jit
在ie中导入证书800jit.crt
修改web程序的web.xml添加
<!-- 用于单点退出 -->
<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>
<filter-name>CAS Filter</filter-name>
<filter-class>com.olymtech.cas.client.filter.CASFilter</filter-class>
<init-param>
<param-name>com.olymtech.cas.client.filter.loginUrl</param-name>
<param-value>https://cas.server.com/cas/login</param-value>
</init-param>
<init-param>
<param-name>com.olymtech.cas.client.filter.validateUrl</param-name>
<param-value>https://cas.server.com/cas/serviceValidate</param-value>
</init-param>
<init-param>
<param-name>com.olymtech.cas.client.filter.serverName</param-name>
<param-value>saas.server.com</param-value>
</init-param>
<init-param>
<param-name>com.olymtech.cas.client.filter.wrapRequest</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在jsp/servlet中得到登陆数据:
<%@ page language="java" import="com.olymtech.cas.client.filter.CASFilterRequestWrapper"%>
<%
CASFilterRequestWrapper reqWrapper=new CASFilterRequestWrapper(request);
String username = reqWrapper.getRemoteUser();
%>
二、.NET程序整合
附件
ssl.rar(证书)
http.conf(apache配置文件)
httpd-ssl.conf(apache配置文件)
httpd-vhosts.conf(apache配置文件)
server.xml(tomcat配置文件)
AppSsoDemo-java.rar(java整合例子,包含所需jar包)
发表评论
-
sso 之 搜狐单点登陆实现方案
2013-09-11 23:42 1513http://blog.chinaunix.net/uid-2 ... -
淘宝如何跨域获取 Cookie 分析
2013-08-24 11:36 1229淘宝如何跨域获取 Cookie 分析 http://denge ... -
sso 入门
2013-07-08 00:53 947http://www.cnblogs.com/kingcucu ... -
SSO(单点登录)实现机制讲解
2013-07-08 00:49 1495http://blog.csdn.net/yan_dk/art ... -
sso 之 CAS 之 跨域 Ajax 登录实践
2013-07-07 02:01 0http://www.iteye.com/topic/1111 ... -
sso 之 新浪微博如何实现 SSO
2013-07-07 02:00 0http://www.iteye.com/topic/1039 ... -
sso 之 用CAS实现SSO----简单tomcat实例配置
2013-07-07 01:46 0http://mljavalife.iteye.com/blo ... -
SSO 之 (单点登录)实施中遇到的几个问题
2013-07-07 01:45 24986http://blog.csdn.net/yan_dk/art ... -
sso 之 详细设计说明书(下篇)
2013-07-07 01:41 1499http://cailin.iteye.com/blog/14 ... -
SSO单点登录解决方案
2013-07-07 01:01 1171http://www.blogjava.net/Jack200 ... -
java单点登录_设计一
2012-10-31 22:56 1030http://www.blogjava.net/ ...
相关推荐
一、项目简介 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷 二、技术实现 jdk版本:1.8 及以上 ide工具:IDEA或者eclipse 数据库: mysql5.5及以上 后端:spring+springboot+mybatis+maven+mysql 前端: vue , css,js , elementui 三、系统功能 1、系统角色主要包括:管理员、用户 2、系统功能 前台功能包括: 用户登录 车位展示 系统推荐车位 立即预约 公告展示 个人中心 车位预定 违规 余额充值 后台功能: 首页,个人中心,修改密码,个人信息 用户管理 管理员管理 车辆管理 车位管理 车位预定管理,统计报表 公告管理 违规管理 公告类型管理 车位类型管理 车辆类型管理 违规类型管理 轮播图管理 详见 https://flypeppa.blog.csdn.net/article/details/146122666
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql 部署环境:maven 数据库工具:navica 更多毕业设计https://cv2022.blog.csdn.net/article/details/124463185
内容为Python程序设计的思维导图,适用于新手小白进行浏览,理清思路
2024-Stable Diffusion全套资料(软件+关键词+模型).rar
mmexport1741417035005.png
COMSOL三维锂离子电池全耦合电化学热应力模型:模拟充放电过程中的多物理场耦合效应及电芯内应力应变情况,COMSOL锂离子电池热应力全耦合模型,comsol三维锂离子电池电化学热应力全耦合模型锂离子电池耦合COMSOL固体力学模块和固体传热模块,模型仿真模拟电池在充放电过程中由于锂插层,热膨胀以及外部约束所导致的电极的应力应变情况结果有电芯中集流体,电极,隔膜的应力应变以及压力情况等,电化学-力单向耦合和双向耦合 ,关键词: 1. COMSOL三维锂离子电池模型; 2. 电化学热应力全耦合模型; 3. 锂离子电池; 4. 固体力学模块; 5. 固体传热模块; 6. 应力应变情况; 7. 电芯中集流体; 8. 电极; 9. 隔膜; 10. 电化学-力单向/双向耦合。,COMSOL锂离子电池全耦合热应力仿真模型
基于传递矩阵法的一维层状声子晶体振动传输特性及其优化设计与应用,声子晶体传递矩阵法解析及应用,Matlab 一维层状声子晶体振动传输特性 传递矩阵法在声子晶体的设计和应用中具有重要作用。 通过调整声子晶体的材料、周期和晶格常数等参数,可以设计出具有特定带隙结构的声子晶体,用于滤波、减震、降噪等应用。 例如,通过调整声子晶体的周期数和晶格常数,可以改变带隙的位置和宽度,从而实现特定的频率范围内的噪声控制。 此外,传递矩阵法还可以用于分析和优化声子晶体的透射谱,为声学器件的设计提供理论依据。 ,Matlab; 一维层状声子晶体; 振动传输特性; 传递矩阵法; 材料调整; 周期和晶格常数; 带隙结构; 滤波; 减震; 降噪; 透射谱分析; 声学器件设计,Matlab模拟声子晶体振动传输特性及优化设计研究
头部姿态估计(HeadPose Estimation)-Android源码
永磁同步电机FOC、MPC与高频注入Simulink模型及基于MBD的代码生成工具,适用于Ti f28335与dspace/ccs平台开发,含电机控制开发文档,永磁同步电机控制技术:FOC、MPC与高频注入Simulink模型开发及应用指南,提供永磁同步电机FOC,MPC,高频注入simulink模型。 提供基于模型开发(MBD)代码生成模型,可结合Ti f28335进行电机模型快速开发,可适用dspace平台或者ccs平台。 提供电机控制开发编码器,转子位置定向,pid调试相关文档。 ,永磁同步电机; FOC控制; MPC控制; 高频注入; Simulink模型; 模型开发(MBD); Ti f28335; 电机模型开发; dspace平台; ccs平台; 编码器; 转子位置定向; pid调试。,永磁同步电机MPC-FOC控制与代码生成模型
light of warehouse.zip
内容概要:文章深入讨论了工业乙醇发酵的基本原理及工艺流程,特别是在温度和气体排放(如CO2及其他有害气体)影响下的发酵效果分析。文章介绍了乙醇发酵的重要环节,如糖分解、代谢路径、代谢调控以及各阶段的操作流程,重点展示了如何通过Matlab建模和仿真实验来探索这两个关键环境因素对发酵过程的具体影响。通过动态模型仿真分析,得出合适的温度范围以及适时排除CO2能显著提升发酵产乙醇的效果与效率,从而提出了基于仿真的优化发酵生产工艺的新方法。 适用人群:从事生物工程相关领域研究的科学家、工程师及相关专业师生。 使用场景及目标:适用于实验室环境、学术交流会议及实际生产指导中,以提升研究人员对该领域内复杂现象的理解能力和技术水平为目标。 其他说明:附录中有详细的数学公式表达和程序代码可供下载执行,便于有兴趣的研究团队重复实验或者继续扩展研究工作。
本资源包专为解决 Tomcat 启动时提示「CATALINA_HOME 环境变量未正确配置」问题而整理,包含以下内容: 1. **Apache Tomcat 9.0.69 官方安装包**:已验证兼容性,解压即用。 2. **环境变量配置指南**: - Windows 系统下 `CATALINA_HOME` 和 `JAVA_HOME` 的详细配置步骤。 - 常见错误排查方法(如路径含空格、未生效问题)。 3. **辅助工具脚本**:一键检测环境变量是否生效的批处理文件。 4. **解决方案文档**:图文并茂的 PDF 文档,涵盖从报错分析到成功启动的全流程。 适用场景: - Tomcat 9.x 版本环境配置 - Java Web 开发环境搭建 - 运维部署调试 注意事项: - 资源包路径需为纯英文,避免特殊字符。 - 建议使用 JDK 8 或更高版本。
这是一款仿照京东商城的Java Web项目源码,完美复现了360buy的用户界面和购物流程,非常适合Java初学者和开发者进行学习与实践。通过这份源码,你将深入了解电商平台的架构设计和实现方法。欢迎大家下载体验,提升自己的编程能力!
系统选用B/S模式,后端应用springboot框架,前端应用vue框架, MySQL为后台数据库。 本系统基于java设计的各项功能,数据库服务器端采用了Mysql作为后台数据库,使Web与数据库紧密联系起来。 在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。
这是一款专为大学生打造的求职就业网JavaWeb毕业设计源码,功能齐全,界面友好。它提供简历投递、职位搜索、在线交流等多种实用功能,能够帮助你顺利进入职场。无论你是想提升技术水平还是寻找灵感,这个源码都是不可多得的资源。快来下载,让你的求职之路更加顺畅吧!
useTable(1).ts
实验一: 1、进行CCS6.1软件的安装,仿真器的设置,程序的编译和调试; 2、熟悉CCS软件中的C语言编程; 3、使用按键控制LED跑马灯的开始与停止、闪烁频率; 4、调试Convolution、FFT、FIR、FFT-FIR实验,编制IIR算法并调试,并在CCS软件上给出实验结果。 实验二: 1、利用定时器周期中断或下溢中断和比较器比较值的修改来实现占空比可调的PWM波形; 2、改变PWM占空比控制LED灯的亮暗,按键实现10级LED灯亮暗调整; 3、模拟数字转换,转换过程中LED指示,并在变量窗口显示转换结果; 4、数字模拟转换,产生一个正弦波,转换过程中LED指示,转换完成后在CCS调试窗口显示波形。 实验三: 1、SCI异步串行通信实验; 2、SPI及IIC同步串行通信实验; 3、CAN现场总线串行通信实验; 4、传输过程中LED指示。 实验四: 1、电机转速控制实验。
LINUX系统管理与配置.docx
chromedriver-mac-x64-136.0.7055.0.zip
地级城市驻地,dbf 地级城市驻地,prj 地级城市驻地.sbn 9 地级城市驻地.sbx 地级城市驻地.shp 地级城市驻地.shx 9 国界线.dbf 国界线.prj 国界线.sbne 国界线.sbx 国界线.shp 国界线.shx )经纬网.dbf ]经纬网.prj 经纬网.sbn 经纬网.sbx 经纬网.shp 经纬网.shx 全国县级统计数据.dbf 全国县级统计数据,prj 全国县级统计数据.sbr 全国县级统计数据.sbx 全国县级统计数据.shp 全国县级统计数据.shx )省会城市.dbf 省会城市,prj 省会城市.sbn 省会城市.sbx 省会城市.shp 省会城市.shx 省级行政区.dbf 省级行政区,pn 省级行政区.sbn 省级行政区,sbx 9 省级行政区.shp 9 6 省级行政区,shx 县城驻地.dbf 县城驻地,prj 擷垃岑械鰣媛城驻地.sbr 藶勇瑁鴎隐城驻地.sbx 县蓿玨蒴城驻地.shp 苽6城驻地,shx 线状省界.dbf 线状省界,prj 1线状首界,sbn 线状省界.sbx 线状首界.shp 线状省界,shx 线状县界,dbf □]