锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
澹版槑錛氭湰鏂囩郴JavaEye緗戠珯鍙戝竷鐨勫師鍒涘崥瀹㈡枃绔狅紝鏈粡浣滆呬功闈㈣鍙紝涓ョ浠諱綍緗戠珯杞澆鏈枃錛屽惁鍒欏繀灝嗚拷絀舵硶寰嬭矗浠伙紒
CAS 鍗曠偣鐧誨綍瀹夎絎旇4
--- asp.net client绔殑璁劇疆
1銆侀鍏堜慨鏀箇eb.Config鏂囦歡錛屽姞鍏ヤ互涓嬭緗細
<authentication mode="Forms" >
<forms name="casauth" loginUrl="login.aspx" />
</authentication>
<authorization>
<deny users="?" />
</authorization>
鏈漢瀵?net涓嶆槸寰堢啛鎮夛紝鎰熻榪欓噷鐨勯厤緗被浼糺ava web搴旂敤紼嬪簭涓殑榪囨護鍣紝褰撶敤鎴瘋闂畐eb欏墊椂棣栧厛璺寵漿鍒發ogin.aspx欏甸潰榪涜楠岃瘉銆?
2銆佸姞鍏ヤ互涓媍#浠g爜鍒發ogin.aspx欏甸潰鐨勫姞杞戒簨浠朵腑錛?
//CAS 韜喚楠岃瘉 鏈嶅姟鍣ㄥ湴鍧
private const string CASHOST = "https://sso.gzps.net:8443/cas/";
protected void Page_Load(object sender, EventArgs e)
{
System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();
// Look for the "ticket=" after the "?" in the URL
string tkt = Request.QueryString["ticket"];
// This page is the CAS service=, but discard any query string residue
string service = Request.Url.GetLeftPart(UriPartial.Path);
// First time through there is no ticket=, so redirect to CAS login
if (tkt == null || tkt.Length == 0)
{
string redir = CASHOST + "login?" +
"service=" + service;
Response.Redirect(redir);
return;
}
// Second time (back from CAS) there is a ticket= to validate
string validateurl = CASHOST + "serviceValidate?" +
"ticket=" + tkt + "&"+
"service=" + service;
StreamReader Reader = new StreamReader( new WebClient().OpenRead(validateurl));
string resp = Reader.ReadToEnd();
// I like to have the text in memory for debugging rather than parsing the stream
// Some boilerplate to set up the parse.
NameTable nt = new NameTable();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None);
XmlTextReader reader = new XmlTextReader(resp, XmlNodeType.Element, context);
string netid = null;
// A very dumb use of XML. Just scan for the "user". If it isn't there, its an error.
while (reader.Read())
{
if (reader.IsStartElement()) {
string tag = reader.LocalName;
if (tag=="user")
netid = reader.ReadString();
}
}
// if you want to parse the proxy chain, just add the logic above
reader.Close();
// If there was a problem, leave the message on the screen. Otherwise, return to original page.
if (netid == null)
{
Label1.Text = "CAS returned to this application, but then refused to validate your identity.";
}
else
{
Session["UserName"] = netid;
Label1.Text = "Welcome " + netid;
FormsAuthentication.RedirectFromLoginPage(netid, false); // set netid in ASP.NET blocks
}
}
}
浠ヤ笂浠g爜鍙傜収浜唈a-sig緗戠珯鐨勮В鍐蟲柟妗堬細http://www.ja-sig.org/wiki/display/CASC/ASP.NET+Forms+Authentication
3銆佷互涓鴻繖鏍峰氨鍙互浜嗭紝榪愯鏃跺彲浠ヨ煩鍒皊so鏈嶅姟鍣ㄨ繘琛岄獙璇侊紝浣嗚煩杞互鍚庢姤浠ヤ笅閿欒錛?
" System.Net.WebException銆?鍩虹榪炴帴宸插叧闂?鏃犳硶寤虹珛涓庤繙紼嬫湇鍔″櫒淇′換鍏崇郴 "銆?
搴旇涓嶤AS Server绔畨瑁呬簡鏁板瓧璇佷功錛岃?net Client绔茍娌℃湁瀹夎鐩稿簲鐨勮瘉涔︽湁鍏熾?
鍙互閫氳繃閰嶇疆IIS鏈嶅姟鍣紝鏀寔HTTPS SSL鍗忚瀹炵幇瀹夊叏鏁版嵁浜ゆ崲涓粙緇嶇殑姝ラ瀵煎叆CAS 鏈嶅姟绔殑鏁板瓧璇佷功,鎴栬呴氳繃http://support.microsoft.com/kb/823177/涓婁粙緇嶇殑瑙e喅鏂規榪涜澶勭悊錛?
瀹炵幇綾?
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class MyPolicy : ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint
, X509Certificate certificate
, WebRequest request
, int certificateProblem) {
//Return True to force the certificate to be accepted.
return true;
} // end CheckValidationResult
} // class MyPolicy
瀹㈡埛绔唬鐮佷腑鍖呭惈涓嬪垪浠g爜錛?
System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();
鎵鏈変唬鐮佽闄勪歡WebSite.rar,灝嗗叾閮ㄧ講鍒頒綘鐨処IS鏈嶅姟鍣ㄥ氨鍙互浜嗐?
鍏充簬IIS鏈嶅姟鍣ㄧ殑璁劇疆瑙?a target="_blank">asp.net涓澶滈熸垚鏁欑▼
鏈枃鐨勮璁轟篃寰堢簿褰╋紝嫻忚璁ㄨ>>
JavaEye鎺ㄨ崘
涓浗棰嗗厛鐨勭數瀛愬晢鍔$綉绔欙紞娣樺疂緗戞嫑璐ょ撼澹紝璇氳仒Java宸ョ▼甯?/span>
鏂囩珷鏉ユ簮:http://lib.javaeye.com/blog/166619
]]>
澹版槑錛氭湰鏂囩郴JavaEye緗戠珯鍙戝竷鐨勫師鍒涘崥瀹㈡枃绔狅紝鏈粡浣滆呬功闈㈣鍙紝涓ョ浠諱綍緗戠珯杞澆鏈枃錛屽惁鍒欏繀灝嗚拷絀舵硶寰嬭矗浠伙紒
CAS 鍗曠偣鐧誨綍瀹夎絎旇3
-- 涓巃cegi闆嗘垚
鍦ㄦ垜鐨勯」鐩腑搴旂敤浜哸cigi瀹夊叏妗嗘灦,浠ヤ笅鏄粨鍚坹ale cas鍗曠偣鐧誨綍緋葷粺榪涜鐨勭浉鍏抽厤緗?
<!-- ========= Acegi as a CAS Client鐨勯厤緗?============ -->
<bean id="authenticationProcessingFilter"
class="org.acegisecurity.ui.cas.CasProcessingFilter">
<property name="authenticationManager"
ref="authenticationManager" />
<property name="authenticationFailureUrl"
value="/login.do?login_error=1" />
<property name="defaultTargetUrl" value="/main.do" />
<property name="filterProcessesUrl">
<value>/j_acegi_cas_security_check</value>
</property>
<property name="rememberMeServices" ref="rememberMeServices" />
<property name="exceptionMappings">
<value>
org.acegisecurity.AuthenticationServiceException=/login.do?login_error=user_not_found_error
org.acegisecurity.BadCredentialsException=/login.do?login_error=user_psw_error
org.acegisecurity.concurrent.ConcurrentLoginException=/login.do?login_error=too_many_user_error
org.acegisecurity.DisabledException=/login.do?login_error=disabled_user_error
</value>
</property>
</bean>
<bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
<property name="authenticationEntryPoint">
<ref local="casProcessingFilterEntryPoint"/>
</property>
<property name="accessDeniedHandler">
<bean
class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
<property name="errorPage"
value="/errors/accessDenied.jsp" />
</bean>
</property>
</bean>
<!-- cas config -->
<bean id="casProcessingFilterEntryPoint" class="org.acegisecurity.ui.cas.CasProcessingFilterEntryPoint">
<property name="loginUrl"><value>https://sso.gzps.net:8443/cas/login</value></property>
<property name="serviceProperties"><ref local="serviceProperties"/></property>
</bean>
<bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
<property name="providers">
<list>
<ref local="casAuthenticationProvider"/>
</list>
</property>
</bean>
<bean id="casAuthenticationProvider" class="org.acegisecurity.providers.cas.CasAuthenticationProvider">
<property name="casAuthoritiesPopulator"><ref bean="casAuthoritiesPopulator"/></property>
<property name="casProxyDecider"><ref local="casProxyDecider"/></property>
<property name="ticketValidator"><ref local="casProxyTicketValidator"/></property>
<property name="statelessTicketCache"><ref local="statelessTicketCache"/></property>
<property name="key"><value>my_password_for_this_auth_provider_only</value></property>
</bean>
<bean id="casProxyTicketValidator" class="org.acegisecurity.providers.cas.ticketvalidator.CasProxyTicketValidator">
<property name="casValidate"><value>https://sso.gzps.net:8443/cas/proxyValidate</value></property>
<property name="serviceProperties"><ref local="serviceProperties"/></property>
</bean>
<!--
<bean id="casProxyDecider" class="org.acegisecurity.providers.cas.proxy.AcceptAnyCasProxy" />
-->
<bean id="casProxyDecider" class="org.acegisecurity.providers.cas.proxy.RejectProxyTickets" />
<bean id="serviceProperties" class="org.acegisecurity.ui.cas.ServiceProperties">
<property name="service">
<value>http://localhost:8080/aio/j_acegi_cas_security_check</value>
</property>
<property name="sendRenew">
<value>false</value>
</property>
</bean>
<bean id="statelessTicketCache" class="org.acegisecurity.providers.cas.cache.EhCacheBasedTicketCache">
<property name="cache">
<bean class="org.springframework.cache.ehcache.EhCacheFactoryBean">
<property name="cacheManager">
<bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/>
</property>
<property name="cacheName" value="userCache"/>
</bean>
</property>
</bean>
<bean id="casAuthoritiesPopulator" class="org.acegisecurity.providers.cas.populator.DaoCasAuthoritiesPopulator">
<property name="userDetailsService"><ref local="userDetailsService"/></property>
</bean>
<bean id="casProcessingFilter" class="org.acegisecurity.ui.cas.CasProcessingFilter">
<property name="authenticationManager"><ref local="authenticationManager"/></property>
<property name="authenticationFailureUrl"><value>/casfailed.jsp</value></property>
<property name="defaultTargetUrl"><value>/</value></property>
<property name="filterProcessesUrl"><value>/j_acegi_cas_security_check</value></property>
</bean>
<!-- ======================================================= -->
鏈枃鐨勮璁轟篃寰堢簿褰╋紝嫻忚璁ㄨ>>
JavaEye鎺ㄨ崘
涓浗棰嗗厛鐨勭數瀛愬晢鍔$綉绔欙紞娣樺疂緗戞嫑璐ょ撼澹紝璇氳仒Java宸ョ▼甯?/span>
鏂囩珷鏉ユ簮:http://lib.javaeye.com/blog/165980
]]>
澹版槑錛氭湰鏂囩郴JavaEye緗戠珯鍙戝竷鐨勫師鍒涘崥瀹㈡枃绔狅紝鏈粡浣滆呬功闈㈣鍙紝涓ョ浠諱綍緗戠珯杞澆鏈枃錛屽惁鍒欏繀灝嗚拷絀舵硶寰嬭矗浠伙紒
CAS 鍗曠偣鐧誨綍瀹夎絎旇2
1.淇敼cas/webapp/WEB-INF/deployerConfigContext.xml
鍔犲叆浠ヤ笅瀹氫箟:
<!-- 鏁版嵁婧愬畾涔?-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close">
<property name="driverClassName" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
</bean>
<!--
passwordEncoder銆浣跨敤Md5綆楁硶鍔犲瘑
-->
<bean id="passwordEncoder"
class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" autowire="byName">
<constructor-arg value="MD5"/>
</bean>
2.灞忚斀鍘熸湁楠岃瘉鏂規硶:
<!--
<bean
class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
-->
3.鍔犲叆閫氳繃璁塊棶鏁版嵁搴撹繘琛岄獙璇佺殑handler:
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="sql" value="select password from CORE_USERS where logid=?" />
<property name="passwordEncoder" ref="passwordEncoder"/>
<property name="dataSource" ref="dataSource" />
</bean>
4.淇敼cas\webapp\WEB-INF\cas.properties,瀹氫箟鏁版嵁搴撹繛鎺ヨ祫婧?鏈緥瀛愭槸榪炴帴鐨刼racle鏁版嵁搴?
db.driver=oracle.jdbc.driver.OracleDriver
db.url=jdbc\:oracle\:thin\:@192.168.1.1\:1521\:xxxx
db.username=xxxx
db.password=xxxx
5.澧炲姞鐩稿叧jar鍖呭埌cas\webapp\WEB-INF\lib\鐩綍涓?
cas-server-support-jdbc-3.2.jar (cas榪炴帴鏁版嵁搴撶殑鏀寔鍖?
ojdbc14.jar (榪炴帴oracle鏁版嵁鐨刯dbc椹卞姩紼嬪簭)
鏈枃鐨勮璁轟篃寰堢簿褰╋紝嫻忚璁ㄨ>>
JavaEye鎺ㄨ崘
涓浗棰嗗厛鐨勭數瀛愬晢鍔$綉绔欙紞娣樺疂緗戞嫑璐ょ撼澹紝璇氳仒Java宸ョ▼甯?/span>
鏂囩珷鏉ユ簮:http://lib.javaeye.com/blog/165538
]]>
澹版槑錛氭湰鏂囩郴JavaEye緗戠珯鍙戝竷鐨勫師鍒涘崥瀹㈡枃绔狅紝鏈粡浣滆呬功闈㈣鍙紝涓ョ浠諱綍緗戠珯杞澆鏈枃錛屽惁鍒欏繀灝嗚拷絀舵硶寰嬭矗浠伙紒
瀹夎JA-SIG SSO緋葷粺絎旇1
(鍏充簬閰嶇疆璁塊棶鏁版嵁搴撶殑鐢ㄦ埛琛ㄨ瀹夎JA-SIG SSO緋葷粺絎旇2)
(涓巃cegi緇撳悎閰嶇疆瑙?a target="_blank">瀹夎JA-SIG SSO緋葷粺絎旇3)
(ASP.NET client绔殑璁劇疆瑙?a target="_blank">瀹夎JA-SIG SSO緋葷粺絎旇4)
ps:閰嶇疆涓殑鏂囦歡璺緞鏍規嵁鑷繁鐨勫疄闄呮儏鍐電殑璁懼畾
1.瀹夎JA-SIG 鍒?TOMCAT;
JA-SIG涓嬭澆鍦板潃:
http://www.ja-sig.org/products/cas/downloads/index.html
2.鐢熸垚鏁板瓧璇佷功,瑙佹壒澶勭悊鏂囦歡"cas 鐢熸垚鏁板瓧璇佷功.bat";
3.閰嶇疆Tomcat鐨凥TTPS鏈嶅姟,淇敼server.xml
<Connector protocol="org.apache.coyote.http11.Http11Protocol"
port="8443" minSpareThreads="5" maxSpareThreads="75"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="C:/Documents and Settings/Administrator/.keystore" keystorePass="changeit"
truststoreFile="D:/Java/jdk1.6.0_02/jre/lib/security/cacerts"
clientAuth="false" sslProtocol="TLS"/>
4.瀵煎嚭 SERVER 鐨勮瘉涔︼紝鐢ㄦ潵緇欐墍鏈夐渶瑕佺敤鍒扮殑瀹㈡埛绔鍏?瑙?瀵煎嚭 cas 鏁板瓧璇佷功.bat"
5.鍦ㄥ鎴風鐨?JVM 閲屽鍏ヤ俊浠葷殑 SERVER 鐨勮瘉涔?( 鏍規嵁鎯呭喌鏈夊彲鑳介渶瑕佺鐞嗗憳鏉冮檺 ),瑙?瀵煎叆 cas 璇佷功.bat"錛?
5.淇敼瀹㈡埛绔湇鍔$▼搴?鍔犲叆cas榪囨護鍣?淇敼web.xml
<!-- CAS -->
<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
<param-value>https://sso.gzps.net:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
<param-value>https://sso.gzps.net:8443/cas/serviceValidate</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
<param-value>88.148.29.54:8080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
鏈枃鐨勮璁轟篃寰堢簿褰╋紝嫻忚璁ㄨ>>
JavaEye鎺ㄨ崘
涓浗棰嗗厛鐨勭數瀛愬晢鍔$綉绔欙紞娣樺疂緗戞嫑璐ょ撼澹紝璇氳仒Java宸ョ▼甯?/span>
鏂囩珷鏉ユ簮:http://lib.javaeye.com/blog/165196
]]>
globalScope錛氭寚瀹氬叏灞浣滅敤鑼冨洿
<context-param>
聽 聽 <param-name>globalScope</param-name>
聽 聽 <param-value>default</param-value>
</context-param>
contextConfigLocation錛氭寚瀹氶厤緗甴andler鐨勬枃浠剁殑浣嶇疆銆傝繖浜涢厤緗枃浠舵弿榪頒簡瀹㈡埛绔姞鍏?紱誨紑鐨勫姩浣滆Е鍙戝悗璋冪敤鐨勫鐞嗘柟娉曪紝浣滅敤鑼冨洿銆傚湪鎻忚堪鐨勬椂鍊欏彲浠ヤ嬌鐢ㄩ氶厤絎︽潵鎻忚堪澶氫釜鏂囦歡錛?br /><context-param>
聽 聽 <param-name>contextConfigLocation</param-name>
聽 聽 <param-value>/WEB-INF/red5-*.xml</param-value>
</context-param>
locatorFactorySelector錛氱▼搴忕殑鏍逛笂涓嬫枃錛岄氬父鏄?red5.xml"
<context-param>
聽 聽 <param-name>locatorFactorySelector</param-name>
聽 聽 <param-value>red5.xml</param-value>
</context-param>
parentContextKey錛氱埗綰т笂涓嬫枃錛岄氬父鏄?default.context"
<context-param>
聽 聽 <param-name>parentContextKey</param-name>
聽 聽 <param-value>default.context</param-value>
</context-param>
log4jConfigLocation錛氭棩蹇楅厤緗枃浠剁殑浣嶇疆
<context-param>
聽 聽 <param-name>log4jConfigLocation</param-name>
聽 聽 <param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
webAppRootKey錛氱▼搴忕殑鍏ㄥ眬鍞竴鍚?br /><context-param>
聽 聽 <param-name>webAppRootKey</param-name>
聽 聽 <param-value>/myapp</param-value>
</context-param>
瀵逛簬姣忎竴涓狧andler閰嶇疆鏂囦歡鏈灝戦渶瑕佹湁涓変釜bean
Context錛氱敤鏉ュ獎灝勮礬寰勫埌鏌愪釜浣滅敤鑼冨洿銆佹悳绱㈡湇鍔″拰Handler錛屽畠鏈変竴涓繚鐣欑殑鍚嶅瓧"web.context"銆?鍏墮粯璁ょ殑綾諱負org.red5.server.Context
<bean id="web.context" class="org.red5.server.Context"
聽 聽聽聽autowire="byType" />
瀵逛簬娌℃湁涓涓簲鐢ㄧ▼搴忓彧搴旇鏈変竴涓狢ontext錛屼絾鏄悓涓涓狢ontext鍙互琚涓綔鐢ㄨ寖鍥村叡浜?br />Scope錛氭瘡涓涓簲鐢ㄧ▼搴忔渶灝戞湁涓涓綔鐢ㄨ寖鍥達紝鐢ㄦ潵灝唄andler榪炴帴鍒癱ontext鍜屾湇鍔″櫒銆備綔鐢ㄨ寖鍥村彲浠ュ緩绔嬩竴媯墊爲錛屾瘡涓涓鎴風榪炴帴鍒版爲涓婄殑涓涓妭鐐癸紝鑰屽叡浜璞″瓨鍦ㄤ簬浣滅敤鑼冨洿閲屻傚彲浠ユ妸浣滅敤鑼冨洿鐪嬩綔鏄亰澶╁鎴栬呯▼搴忓疄渚嬨傞粯璁ょ殑浣滅敤鑼冨洿閫氬父鏄痺eb.scope錛屼笉榪囪繖鍚嶅瓧鏄彲浠ヤ換鎰忓彇鐨勩?br />瀵逛簬bean鏈変互涓嬪睘鎬э細
server錛氫笌鍏ㄥ眬鏈嶅姟鍣?red5.server"鐩稿叧銆?br />parent錛氭寚瀹氬綋鍓嶄綔鐢ㄨ寖鍥寸殑鐖惰寖鍥達紝閫氬父鏄?global.scope"
context錛氬綋鍓嶄綔鐢ㄨ寖鍥寸殑鏈嶅姟鍣ㄤ笂涓嬫枃錛屼竴鑸寚瀹氫負"web.context"
handler錛氬搴斿綋鍓嶄綔鐢ㄨ寖鍥寸殑handler
contextPath錛氱敤鏉ヨ繛鎺ュ埌褰撳墠浣滅敤鑼冨洿鐨勮礬寰?br />virtualHosts錛氫竴涓富鏈哄悕鎴朓P鐨勫垪琛紝鐢ㄦ潵鎻忚堪铏氭嫙涓繪満鐨勪綅緗紝鍒楄〃欏圭洰涔嬮棿鐢ㄩ楀彿鍒嗛殧寮銆?br /><bean id="web.scope" class="org.red5.server.WebScope"
聽 聽聽聽init-method="register">
聽 聽 <property name="server" ref="red5.server" />
聽 聽 <property name="parent" ref="global.scope" />
聽 聽 <property name="context" ref="web.context" />
聽 聽 <property name="handler" ref="web.handler" />
聽 聽 <property name="contextPath" value="/myapp" />
聽 聽 <property name="virtualHosts" value="localhost, 127.0.0.1" />
</bean>
涓轟簡搴旂敤紼嬪簭閰嶇疆鏂逛究鐨勯渶瑕侊紝鍙互灝?contextPath"鍜?virtualHosts"鏀懼埌鍙﹀涓涓崟鐙殑灞炴ф枃浠墮噷杈癸紝鑰屽湪榪欓噷浣跨敤鍙橀噺鏉ヨ〃紺猴紝涓烘闇瑕佹坊鍔犱竴涓壒鍒殑bean鏉ユ寚瀹氬睘鎬ф枃浠剁殑浣嶇疆銆?br /><bean id="placeholderConfig"聽 聽聽聽class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
聽 聽 <property name="location" value="/WEB-INF/red5-web.properties" />
</bean>
鍋囪鍦ㄥ睘鎬ф枃浠秗ed5-web.properties閲屾湁濡備笅鐨勬暟鎹細
webapp.contextPath=/myapp
聽聽webapp.virtualHosts=localhost, 127.0.0.1
鍒欎笂杈圭殑bean鐨?contextPath"鍜?virtualHosts"灞炴у嵆鍙嬌鐢ㄥ彉閲忔潵鎸囧畾鍊?br />聽聽<property name="contextPath" value="http://www.ruyiblog.com/${webapp.contextPath}" />
聽 聽<property name="virtualHosts" value="http://www.ruyiblog.com/${webapp.virtualHosts}" />
瀵逛簬"contextPath"鍙互瑙嗕負鏄竴涓牴浣滅敤鑼冨洿銆備綘鍙互鍦ㄩ厤緗ソ鐨?contextPath"璺緞鍚庤竟闅忔剰娣誨姞鍏朵粬鐨勮礬寰勶紝鑰岃繛鎺ュ埌榪欎簺璺緞鐨勫鎴風灝嗗姩鎬佸垱寤哄彟澶栫殑浣滅敤鑼冨洿錛岃繖浜涗綔鐢ㄨ寖鍥翠嬌鐢ㄧ殑鏄悓鏍風殑handler錛屼絾鎷ユ湁鑷繁鐨勫睘鎬с佸叡浜璞″拰媧誨姩嫻併?br />handler錛氭瘡涓涓笂涓嬫枃闇瑕佷竴涓猦andler鏉ュ搷搴旂敤鎴瘋繛鎺ャ佺寮浣滅敤鑼冨洿鏃剁殑鍔ㄤ綔錛宧andler瀹炵幇浜嗗緢澶氭柟娉曪紝鐢ㄦ埛鍙互璋冪敤浠ヨ揪鍒扮壒瀹氱殑鐩殑銆傝繖涓猦andler蹇呴』瀹炵幇"org.red5.server.api.IScopeHandler"鎺ュ彛錛屽綋鐒墮拡瀵瑰叡浜璞″拰嫻佺殑璁塊棶榪樺簲璇ュ疄鐜板叾浠栫殑鎺ュ彛銆?br />鍦?org.red5.server.adapter.ApplicationAdapter"鍙互鎵懼埌涓涓兘澶熺敤浣滃熀綾葷殑渚嬪瓙錛屽悓鏃惰繕搴旇澶氬鍙傜収鏂囨。浠ュ緱鍒版洿澶氱粏鑺傘?br />鏌愪釜浣滅敤鑼冨洿鐨刪andler鍙互濡備笅鎸囧畾錛?br /><bean id="web.handler"
聽 聽聽聽class="the.path.to.my.Application"
聽 聽聽聽singleton="true" />
鍏朵腑"id"灞炴ф槸涓婅竟瀹氫箟鐨勪綔鐢ㄨ寖鍥撮噷鎸囧畾鐨勩?br />濡傛灉浣犱笉闇瑕佷換浣曟湇鍔$鐨勯昏緫澶勭悊錛屽彲浠ヤ嬌鐢≧ed5榛樿鎻愪緵鐨刪andler
<bean id="web.handler"
聽 聽聽聽class="org.red5.server.adapter.ApplicationAdapter"
聽 聽聽聽singleton="true" />
handler鐨勪緥瀛?br />聽聽package the.path.to.my;
聽聽import org.red5.server.adapter.ApplicationAdapter;
聽聽public class Application extends ApplicationAdapter {
聽 聽 public Double add(Double a, Double b){
聽 聽聽 聽return a + b;
聽 聽 }
聽聽}
榪欓噷鍋囪浣跨敤涓婅竟鐨勯厤緗紝鍒欏湪瀹㈡埛绔皟鐢ㄧ殑鏃跺欎嬌鐢ㄤ互涓嬫柟寮?br />聽聽nc = new NetConnection();
聽聽nc.connect("rtmp://localhost/myapp");
聽聽nc.onResult = function(obj) {
聽 聽 trace("The result is " + obj);
聽聽}
聽聽nc.call("add", nc, 1, 2);
榪斿洖鍥犺鏈夎緭鍑猴細
The result is 3
]]>
bin\htpasswd聽 -c passwd xxx
璁塊棶絳栫暐鎺у埗鏂囦歡
accesspolicy -> apache\
[groups]
#浜哄憳鏉冮檺鍒嗙粍
administrator = admin
code-developers = lib,zhuj,huj,zhuyd,liuy,panggc,shaohy
core-developers = lib,zhuj
testers = zhangyc,zhour
deployers = zhangyc,lib
[/]
#鎵鏈夌洰褰曠殑璇誨彇鏉冮檺
@administrator = rw
@code-developers = r
@core-developers = r
@testers = r
@deployers = r
[code:/src]
#code搴撲腑鐨勪唬鐮佺殑璇誨彇涓庢洿鏂版潈闄?br />@code-developers = rw
[code:/test-src]
#code搴撲腑鐨勬祴璇曚唬鐮佺殑璇誨彇涓庢洿鏂版潈闄?br />@code-developers = rw
[code:/resource]
#璧勬簮鏂囦歡涓庨厤緗枃浠剁殑璇誨彇涓庢洿鏂版潈闄?br />@deployers = rw
[code:/web/biz]
#涓氬姟JSP欏甸潰浠g爜鐨勮鍙栦笌鏇存柊鏉冮檺
@code-developers = rw
[code:/web/common]
#鍏叡妯″潡JSP欏甸潰浠g爜鐨勮鍙栦笌鏇存柊鏉冮檺
@core-developers = rw
[code:/web/sysconfig]
#緋葷粺閰嶇疆JSP欏甸潰浠g爜鐨勮鍙栦笌鏇存柊鏉冮檺
@core-developers = rw
淇敼apache閰嶇疆鏂囦歡:httpd.conf
澧炲姞浠ヤ笅鍐呭:
<Location /svn>
DAV svn
SVNParentPath E:\SVN
AuthType Basic
AuthName "Subversion repository"
AuthUserFile passwd
AuthzSVNAccessFile accesspolicy
Satisfy Any
Require valid-user
</Location>
娉?濡傛灉鏈変腑鏂囪礬寰?灝嗚鏂囦歡杞崲涓篣TF-8緙栫爜鏍煎紡.
鍙傝冩枃绔?http://www.subversion.org.cn/index.php?option=com_content&task=view&id=78&Itemid=91