1.背景
兩個系統,一個認證系統,一個入學系統,入學系統要調用認證系統獲得數據。
2.實現思路
入學系統web.xml中配置訪問認證系統接口配置,將接口作為web的全局參數,示例:
<!-- 統一認證教師接口 -->
<context-param>
<param-name>teacherInterface</param-name>
<param-value>http://192.168.1.104/sso/global/dataInterface/getTeacher.action</param-value>
</context-param>
入學系統要調用接口的方法中,獲取web上下文全局參數,並在方法中實現http請求,獲得接口返回的參數,示例:
//sturts獲取servletContext對象
ServletContext context = ServletActionContext.getServletContext();
//獲取web.xml中全局參數
String teacherInterface = context.getInitParameter("teacherInterface");
//通過java.net.url和java.net.urlConnection模擬http的post請求
result = doPOST(teacherInterface,params);
使用POST方法讀取HTTP中的數據
public static String doPOST(String urlAddress, String params) {
try {
// 創建URL對象
URL url = new URL(urlAddress);
// 打開連接 獲取連接對象
URLConnection connection = url.openConnection();
// 設置請求編碼
connection.addRequestProperty("encoding", "GBK");
// 設置允許輸入
connection.setDoInput(true);
// 設置允許輸出
connection.setDoOutput(true);
// 從連接對象中獲取輸出字節流對象
OutputStream outputStream = connection.getOutputStream();
// 將輸出的字節流對象包裝成字符流寫出對象
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
// 創建一個輸出緩沖區對象,將要輸出的字符流寫出對象傳入
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
// 向輸出緩沖區中寫入請求參數
if(params != null){
bufferedWriter.write(params);
}
// 刷新輸出緩沖區
bufferedWriter.flush();
// 從連接對象中獲取輸入字節流對象
InputStream inputStream = connection.getInputStream();
// 將輸入字節流對象包裝成輸入字符流對象,並將字符編碼為GBK格式
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "GBK");
// 創建一個輸入緩沖區對象,將要輸入的字符流對象傳入
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
// 創建一個字符串對象,用來接收每次從輸入緩沖區中讀入的字符串
String line;
// 創建一個可變字符串對象,用來裝載緩沖區對象的最終數據,使用字符串追加的方式,將響應的所有數據都保存在該對象中
StringBuilder stringBuilder = new StringBuilder();
// 使用循環逐行讀取緩沖區的數據,每次循環讀入一行字符串數據賦值給line字符串變量,直到讀取的行為空時標識內容讀取結束循環
while ((line = bufferedReader.readLine()) != null) {
// 將緩沖區讀取到的數據追加到可變字符對象中
stringBuilder.append(line);
}
// 依次關閉打開的輸入流
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
// 依次關閉打開的輸出流
bufferedWriter.close();
outputStreamWriter.close();
outputStream.close();
// 將可變字符串轉換成String對象返回
return stringBuilder.toString();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
