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; }