CAS4.0版本restful API部署及调用(http版)

最近刚开始做后台,有很多知识亟需补充。

几个平台要统一登录接口,由于投资方的系统使用CAS进行单点登录,我们也只能部署cas。架构师表示有很多比CAS更好的框架,比如openAM之类的。

结果从网上搜到的看起来貌似官方的教程略不靠谱,很多网站的教程还都是3.n的版本号,里面getticket时候需要com.noelios.restlet的包,尼玛至少4.0已经不需要这些包了,把它们配置进去是不科学的。

环境是win10 64bit

使用restful API只需要在服务端做以下几个动作:

一:下载源码(https://www.apereo.org/projects/cas/download-cas我选的是cas server 4.0.0,需要下的是source code:https://github.com/apereo/cas/archive/v4.0.0.zip),解压zip后在cas-4.0.0\cas-server-webapp\pom.xml中配置cas-server-integration-restlet

<dependency>
    <groupId>org.jasig.cas</groupId>
    <artifactId>cas-server-integration-restlet</artifactId>
    <version>${project.version}</version>
     <scope>compile</scope>
</dependency>

或也可以
<!-- https://mvnrepository.com/artifact/org.jasig.cas/cas-server-integration-restlet -->
<dependency>
    <groupId>org.jasig.cas</groupId>
    <artifactId>cas-server-integration-restlet</artifactId>
    <version>4.0.0</version>
     <type>jar</typee>
</dependency>

二:编译

我特别傻缺地把源码导入了Eclipse,想要Eclipse自己编译顺便还能好好看看代码,结果Eclipse一直在校验,环境都挂了不知道多少回。然后同事说直接用maven自带命令去执行就好了。编译时候只需要编译webapp就可以了。

打开cmd,在cas-4.0.0\cas-server-webapp目录下执行mvn clean package即可,生成的文件在cas-4.0.0\cas-server-webapp\target下

三:将编译好的cas.war部署到tomcat中,这个应该都会,就不赘述了。重点来了,配置webapps\cas\WEB-INF\web.xml。这里servlet-name是restlet,然后对应的配置已经存在于WEB-INF\restlet-servlet.xml中,两个名字是对应的,如果servlet-name是api,对应配置就是api-servlet.xml

    <servlet>
	 <servlet-name>restlet</servlet-name>
        <servlet-class>org.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,直接调http://localhost:8090/cas/v1/tickets,如果结果如下图,就是部署restful成功了



用postman可以请求出结果,如下图

  

四:测试代码

代码参照了http://www.cnblogs.com/sunshineatnoon/p/4119565.html,不过她用的https,我用的http,强制转换的类不一样,大家各取所需了。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;

public class CasTest {

	public static void main(String... args) throws Exception {
		String username = "casuser";
		String password = "Mellon";
		validateFromCAS(username, password);
	}

	public static boolean validateFromCAS(String username, String password) throws Exception {

		String url = "http://localhost:8090/cas/v1/tickets";
		try {
			HttpURLConnection hsu = (HttpURLConnection) openConn(url);
			String s = URLEncoder.encode("username", "UTF-8") + "=" + URLEncoder.encode(username, "UTF-8");
			s += "&" + URLEncoder.encode("password", "UTF-8") + "=" + URLEncoder.encode(password, "UTF-8");

			System.out.println(s);
			OutputStreamWriter out = new OutputStreamWriter(hsu.getOutputStream());
			BufferedWriter bwr = new BufferedWriter(out);
			bwr.write(s);
			bwr.flush();
			bwr.close();
			out.close();

			String tgt = hsu.getHeaderField("location");
			System.out.println(hsu.getResponseCode());
			if (tgt != null && hsu.getResponseCode() == 201) {
				System.out.println(tgt);

				System.out.println("Tgt is : " + tgt.substring(tgt.lastIndexOf("/") + 1));
				tgt = tgt.substring(tgt.lastIndexOf("/") + 1);
				bwr.close();
				closeConn(hsu);

				String serviceURL = "http://localhost:8080/CasClient";
				String encodedServiceURL = URLEncoder.encode("service", "utf-8") + "="
						+ URLEncoder.encode(serviceURL, "utf-8");
				System.out.println("Service url is : " + encodedServiceURL);

				String myURL = url + "/" + tgt;
				System.out.println(myURL);
				hsu = (HttpURLConnection) openConn(myURL);
				out = new OutputStreamWriter(hsu.getOutputStream());
				bwr = new BufferedWriter(out);
				bwr.write(encodedServiceURL);
				bwr.flush();
				bwr.close();
				out.close();

				System.out.println("Response code is:  " + hsu.getResponseCode());

				BufferedReader isr = new BufferedReader(new InputStreamReader(hsu.getInputStream()));
				String line;
				System.out.println(hsu.getResponseCode());
				while ((line = isr.readLine()) != null) {
					System.out.println(line);
				}
				isr.close();
				hsu.disconnect();
				return true;

			} else {
				return false;
			}

		} catch (MalformedURLException mue) {
			mue.printStackTrace();
			throw mue;

		} catch (IOException ioe) {
			ioe.printStackTrace();
			throw ioe;
		}

	}

	static URLConnection openConn(String urlk) throws MalformedURLException, IOException {

		URL url = new URL(urlk);
		HttpURLConnection hsu = (HttpURLConnection) url.openConnection();
		hsu.setDoInput(true);
		hsu.setDoOutput(true);
		hsu.setRequestMethod("POST");
		return hsu;

	}

	static void closeConn(HttpURLConnection c) {
		c.disconnect();
	}

}

 里面用户名密码,子服务什么的,自己填入吧。

以上就没什么问题了:)

如果觉得文章好的话,鼓励一下吧:D




 
 

猜你喜欢

转载自equalxx.iteye.com/blog/2336030