ドメイン間リクエストのURLクラス編

6469 ワード

前にJavaのURLクラスのドメイン間リクエストを紹介したブログがありましたが、あまり完全ではないので、javaのURLクラスを詳しく紹介するブログを書き直すことにしました.実例を添付する前に、httpプロトコルについてまずいくつかの内容を説明します.
1.GET要求とPOST要求GET要求のデータはURLに添付されます(HTTPプロトコルヘッダにデータを置きます).URLと転送データを分割し、パラメータ間を&に接続します.GET要求送信のパラメータは、データが英字または数字であればそのまま送信され、スペースであれば+に変換され、中国語または他の文字であれば、文字列をBASE 64で直接暗号化し、%E 4%BD%A 0%E 5%A 5%BDのような文字列が得られ、ここで%XXのXXはこの記号が16進数で表されるASCIIである.POSTリクエストのパラメータはURL文字列に入れるのではなく、HTTPリクエストの本文内に入れられ、リクエストのパラメータはカプセル化されてサービス側にストリームとして送信される.GET方式のコミットデータのサイズについては、HTTPプロトコルには無理な制限はありませんが、IEによるURL長の制限が2083バイト(2 K+35)であるブラウザやサーバによっては制限されています.理論的にはPOSTも制限されず、より多くのデータを伝送することができる.POSTの安全性はGETの安全性より高い.例えば、GETを通じてデータを提出すると、ユーザー名とパスワードがURLに明文が表示されます.ログインページがブラウザにキャッシュされる可能性があるため、他の人がブラウザの履歴を表示すれば、他の人はあなたのアカウントとパスワードを手に入れることができます.それ以外に、GETを使ってデータを提出すると、Cross-site request forgery(CSRF、クロスステーション要求偽造)攻撃を引き起こす可能性があります.一般にGetはサーバにデータを要求する要求であり,Postはサーバにデータを送信する要求である.2.HTTPの一般的なContent-type(1)アプリケーション/x-www-form-urlencodedブラウザのオリジナルformフォームは、enctypeプロパティを設定しないと、最終的にアプリケーション/x-www-form-urlencoded方式でデータがコミットされます.渡されたkey/valueはURLでトランスコードされるので、渡されたパラメータに中国語や特殊文字がある場合は注意が必要です.servlet実装では、アプリケーション/x-www-form-urlencodedが特殊に処理され、リクエストパラメータがrequest.paramterに配置されます.これはmapです.(2)アプリケーション/json content-type=アプリケーション/jsonを使用し、バックグラウンドで@RequestBodyを使用すると、リクエストデータをrequest.paramterから取得できません.サービス側メッセージ主体がシーケンス化されたJSON文字列であることを示す.JSON仕様が流行しているため、低バージョンIE以外の各ブラウザではJSON.stringifyが原生的にサポートされており、サービス側言語でもJSONを処理する関数があり、JSONを使用するとトラブルに遭うことはありません.3.HttpURLConnection概要JDKのjava.netパッケージでHTTPプロトコルにアクセスするための基本機能を提供しているクラス:HttpURLConnection.HttpURLConnectionはJavaの標準クラスであり、URLConnectionから継承される.
指定サイトへGETリクエスト、POSTリクエストを送信するために使用します.それはURLConnectionの基礎の上で以下の便利な方法を提供しました:
int getResponseCode(); //           。
String getResponseMessage(); //           。
String getResponseMethod(); //          。
void setRequestMethod(String method); //          。

工程実例分析、本文はPOST要求を主に分析する.
//     ,        
private static final Logger LOG = LoggerFactory.getLogger(XX.class);
// HttpURLConnection     
public static Map sendPost(String url, String jsonData) {  
    BufferedReader br = null;  
    Map result = new HashMap();  
    OutputStreamWriter osw = null;  
  
    try {  
        //      URL     URL  
        URL realUrl = new URL(url);  
        //    URL     , ,          。  
        // URLConnection conn = realUrl.openConnection();
        HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
        //            
        conn.setRequestProperty("accept", "*/*");  
        conn.setRequestProperty("connection", "Keep-Alive");  
        conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");  
        conn.setRequestProperty("Accept-Charset", "utf-8"); 
        //             Content-Type
        // 1、         
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); 
        // 2、          requestBody
        // conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");  
        //   POST            
        conn.setDoOutput(true);  
        conn.setDoInput(true);
        conn.setUseCaches(false);  //     
        conn.setRequestMethod("POST");   //  POST    
        // Post         
        conn.setUseCaches(false);
        //   URLConnection          
        osw = new OutputStreamWriter(conn.getOutputStream(), "utf-8");  
        //       
        osw.write(jsonData);
        // flush        
        osw.flush();  
        //   BufferedReader      URL     
        br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));  
        String line;
        String resultStr = "";
        while ((line = br.readLine()) != null) {  
        	resultStr += line;  
        }
        result = JSON.parseObject(resultStr);
        LOG.info("         :" + result);  
    } catch (Exception e) {  
    	LOG.info("   POST,      !" + e);
    	result.put("success", false);
    	result.put("msg", "         !");
    	e.printStackTrace();  
    }  
    //   finally       、     
    finally {  
        try {  
            if (osw != null) {  
                osw.close();  
            }  
            if (br != null) {  
                br.close();  
            }  
        } catch (IOException ioe) {  
            ioe.printStackTrace();  
        }  
    }  
    return result;  
}


//   sendPost     
@RequestMapping(value = "/cors")
public void Cors(HttpServletRequest request, HttpServletResponse response) {	
	try {
		request.setCharacterEncoding("utf-8");
	} catch (UnsupportedEncodingException e) {
		e.printStackTrace();
	}
	response.setContentType("text/json;charset=utf-8");
	//     sendPost     
	String url = request.getParameter("corsUrl")==null?"":request.getParameter("corsUrl").toString();
	Map praMap = ViewUtil.convertParameterMAP(request.getParameterMap());
	Map jsonObject = new HashMap();
	try {
		//            "Content-Type = application/x-www-form-urlencoded;charset=utf-8" ,      。
		StringBuffer dataBuffer = new StringBuffer();
        Set set = praMap.entrySet();   
        Iterator iterator = set.iterator();   
        while (iterator.hasNext())
        {   
            Map.Entry mapentry = (Map.Entry) iterator.next();
            String key = mapentry.getKey()==null?"" : mapentry.getKey().toString();
            String value = mapentry.getValue()==null?"" : mapentry.getValue().toString();
            dataBuffer.append("&");
            dataBuffer.append(key);
            dataBuffer.append("=");
            dataBuffer.append(value);
        }
        
        String jsonData = dataBuffer.toString().substring(1);
        PrintWriter out = response.getWriter();
        //           requestBody    "Content-Type = application/json;charset=utf-8" ,      。
        // jsonData = praMap.toString();    Map  json      。
		jsonObject = sendPost(url, jsonData);
		out.write(jsonObject.toString());
		out.flush();
		out.close();
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		
	}
}