ドメイン間リクエストの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の基礎の上で以下の便利な方法を提供しました:
工程実例分析、本文はPOST要求を主に分析する.
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 {
}
}