在被maven,cas,tomcat各種賤人就是矯情的虐了好幾天之后,終於跑通了demo,哈哈哈哈哈哈哈~
在這里詳細記錄一下,給和我一樣連maven都不會的小白一點福利,同時歡迎大神指正。
首先上最好的參考資料:http://stackoverflow.com/questions/22625368/working-java-rest-client-example-to-access-cas-rest-api
這個大神講的非常清楚了,只要跟着他的步驟一定是可以的,但是。。。大神一句話,通常我要花一天來理解。
另外還有官方的參考資料:
https://wiki.jasig.org/display/casum/restful+api
這篇博客的基礎是單點登錄系統CAS服務器端搭建及實現用戶名密碼由MYSQL數據庫驗證這篇文章,在調用rest ful API之前,首先要保證:
1.tomcat配置好,支持https,檢驗的標准是通過https://localhost:8443/可以訪問到tomcat;
2.知道怎么部署cas官網上的打好包的server,檢驗的標准是通過https://localhost:8443/cas/login可以訪問到cas server;
3.知道怎么將server和MYSQL連接使用,檢驗的標准是可以通過MYSQL中的用戶名,密碼登錄cas server。
以上三點上述博客里都有詳細步驟。
以下是restful API使用的詳細步驟:
要調用restful API,首先要在pom.xml里面加入restful API的依賴,然后重新編譯出來一個cas server的war包。
1.安裝Maven
具體步驟我就不詳述了,灰常簡單,參考:http://blog.csdn.net/kenhins/article/details/13298015,需要把本地倉庫配置好。
2.把下面的pom.xml拷貝到一個文件夾里面(隨便一個),命名為pom.xml,這個pom.xml參考了http://pastie.org/4064726#22,30,78,81和https://wiki.jasig.org/display/CASUM/Best+Practice+-+Setting+Up+CAS+Locally+using+the+Maven+WAR+Overlay+Method
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 5 6 <parent> 7 <groupId>org.jasig.cas</groupId> 8 <artifactId>cas-server</artifactId> 9 <version>3.4.12</version> 10 </parent> 11 12 <modelVersion>4.0.0</modelVersion> 13 <groupId>h.usm.my</groupId> 14 <artifactId>cas</artifactId> 15 <packaging>war</packaging> 16 <version>1.0</version> 17 <name>HUSM CAS Web Application</name> 18 19 <dependencies> 20 <dependency> 21 <groupId>org.jasig.cas</groupId> 22 <artifactId>cas-server-webapp</artifactId> 23 <version>${cas.version}</version> 24 <type>war</type> 25 <scope>runtime</scope> 26 </dependency> 27 28 <dependency> 29 <groupId>org.jasig.cas</groupId> 30 <artifactId>cas-server-support-jdbc</artifactId> 31 <version>${cas.version}</version> 32 </dependency> 33 34 <dependency> 35 <groupId>org.jasig.cas</groupId> 36 <artifactId>cas-server-integration-restlet</artifactId> 37 <version>${cas.version}</version> 38 <type>jar</type> 39 <exclusions> 40 <exclusion> 41 <groupId>org.springframework</groupId> 42 <artifactId>spring-web</artifactId> 43 </exclusion> 44 </exclusions> 45 </dependency> 46 47 <dependency> 48 <groupId>org.hibernate</groupId> 49 <artifactId>hibernate-core</artifactId> 50 <version>${hibernate.core.version}</version> 51 <type>jar</type> 52 </dependency> 53 <dependency> 54 <groupId>org.hibernate</groupId> 55 <artifactId>hibernate-entitymanager</artifactId> 56 <version>3.6.0.Final</version> 57 </dependency> 58 </dependencies> 59 60 <properties> 61 <cas.version>3.4.12</cas.version> 62 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 63 </properties> 64 65 <repositories> 66 <repository> 67 <id>ja-sig</id> 68 <url>http://oss.sonatype.org/content/repositories/releases</url> 69 </repository> 70 </repositories> 71 72 <build> 73 <plugins> 74 <plugin> 75 <artifactId>maven-war-plugin</artifactId> 76 <configuration> 77 <warName>cas</warName> 78 </configuration> 79 </plugin> 80 </plugins> 81 </build> 82 </project>
3.cd到pom.xml所在的路徑下,然后執行mvn clean package,如下圖所示:
然后就會在pom.xml所在的路徑下得到一個target文件夾,里面的cas.war就是我們新打包好的cas server。
4.把生成的cas.war拷貝到\apache-tomcat-7.0.57\webapps下,啟動tomcat,如果沒有報錯(一個小tip,可從\apache-tomcat-7.0.57\logs\localhost.yy-mm-dd.log中查看具體錯誤),說明我們的cas.war是可以用的。這個時候訪問https://localhost:8443/cas/login即可跳轉到cas的登錄頁面了。
5.接下來配置cas server和MYSQL的連接,使得我們可以用MYSQL數據庫里面的用戶名和密碼登錄。詳細步驟我就省略了,參見上面提到的單點登錄系統CAS服務器端搭建及實現用戶名密碼由MYSQL數據庫驗證這篇文章。
上述5步以后,我們可以從https://localhost:8443/cas/login訪問到cas server的登錄頁面,並且可以用MYSQL中的用戶名和密碼登錄。
6.在G:\Lab\CAS\apache-tomcat-7.0.57\webapps\cas\WEB-INF\web.xml中添加一個servlet:
<!--add a servlet--> <servlet> <servlet-name>restlet</servlet-name> <servlet-class>com.noelios.restlet.ext.spring.RestletFrameworkServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>restlet</servlet-name> <url-pattern>/v1/*</url-pattern> </servlet-mapping>
保存后打開:https://localhost:8443/cas/v1/tickets會出現如下界面:
說明server端的restful api配置好了。
7. 接下來新建一個eclipse工程,我這里叫做CasTest,然后新建一個類Client.java,內容如下(完整的工程見附錄):
1 package cas; 2 3 4 import java.io.BufferedReader; 5 import java.io.BufferedWriter; 6 import java.io.IOException; 7 import java.io.InputStreamReader; 8 import java.io.OutputStreamWriter; 9 import java.net.MalformedURLException; 10 import java.net.URL; 11 import java.net.URLConnection; 12 import java.net.URLEncoder; 13 14 import javax.net.ssl.HttpsURLConnection; 15 16 public class Client { 17 18 19 public static void main(String... args) throws Exception 20 { 21 String username ="test01"; 22 String password ="psw01"; 23 validateFromCAS(username,password); 24 } 25 26 public static boolean validateFromCAS(String username, String password) throws Exception 27 { 28 29 String url = "https://localhost:8443/cas/v1/tickets"; 30 try 31 { 32 HttpsURLConnection hsu = (HttpsURLConnection)openConn(url); 33 String s = URLEncoder.encode("username","UTF-8") + "=" + URLEncoder.encode("test01","UTF-8"); 34 s+="&" +URLEncoder.encode("password","UTF-8") + "=" + URLEncoder.encode("psw01","UTF-8"); 35 36 System.out.println(s); 37 OutputStreamWriter out = new OutputStreamWriter(hsu.getOutputStream()); 38 BufferedWriter bwr = new BufferedWriter(out); 39 bwr.write(s); 40 bwr.flush(); 41 bwr.close(); 42 out.close(); 43 44 String tgt = hsu.getHeaderField("location"); 45 System.out.println( hsu.getResponseCode()); 46 if(tgt != null && hsu.getResponseCode() == 201) 47 { 48 System.out.println(tgt); 49 50 System.out.println("Tgt is : " + tgt.substring( tgt.lastIndexOf("/") +1)); 51 tgt = tgt.substring( tgt.lastIndexOf("/") +1); 52 bwr.close(); 53 closeConn(hsu); 54 55 56 String serviceURL = "http://localhost:8080/CasClient"; 57 String encodedServiceURL = URLEncoder.encode("service","utf-8") +"=" + URLEncoder.encode(serviceURL,"utf-8"); 58 System.out.println("Service url is : " + encodedServiceURL); 59 60 61 62 String myURL = url+ "/"+ tgt ; 63 System.out.println(myURL); 64 hsu = (HttpsURLConnection)openConn(myURL); 65 out = new OutputStreamWriter(hsu.getOutputStream()); 66 bwr = new BufferedWriter(out); 67 bwr.write(encodedServiceURL); 68 bwr.flush(); 69 bwr.close(); 70 out.close(); 71 72 System.out.println("Response code is: " + hsu.getResponseCode()); 73 74 BufferedReader isr = new BufferedReader( new InputStreamReader(hsu.getInputStream())); 75 String line; 76 System.out.println( hsu.getResponseCode()); 77 while ((line = isr.readLine()) != null) { 78 System.out.println( line); 79 } 80 isr.close(); 81 hsu.disconnect(); 82 return true; 83 84 } 85 else 86 { 87 return false; 88 } 89 90 91 } 92 catch(MalformedURLException mue) 93 { 94 mue.printStackTrace(); 95 throw mue; 96 97 } 98 catch(IOException ioe) 99 { 100 ioe.printStackTrace(); 101 throw ioe; 102 } 103 104 105 106 107 108 } 109 110 111 static URLConnection openConn(String urlk) throws MalformedURLException, IOException 112 { 113 114 URL url = new URL(urlk); 115 HttpsURLConnection hsu = (HttpsURLConnection) url.openConnection(); 116 hsu.setDoInput(true); 117 hsu.setDoOutput(true); 118 hsu.setRequestMethod("POST"); 119 return hsu; 120 121 122 } 123 124 125 static void closeConn(HttpsURLConnection c) 126 { 127 c.disconnect(); 128 } 129 130 131 }
這段代碼參考了http://www.dzone.com/snippets/cas-restful-java-client
要配置的地方有4個:
1)21,22行的username和password,這里改成你數據庫里面存放的username和password
2)33,34行的username和password,這里改不改都行,因為它只是一行輸出,改了比較好看吧。
3)29行server存放ticket的地址,這里的localhost需要換成你的server所在的ip地址。
4)56行的service,即client端的服務網址,理論上可以隨便填,我這里的網址是我這篇單點登錄系統CAS客戶端demo里面建的client的工程,你可以換成百度什么的,我試過了。
8.根據自己的情況配置完上面4個地方后,直接運行工程,就有如下結果了:
可以看到我們成功的獲取到了TGT和ST。
附件:casTest.zip