Kami terutama mengirim permintaan ke server melalui dua bentuk pengiriman: URL dan formulir. Bentuk bentuk umumnya tidak memiliki masalah kacau, dan masalah yang kacau terutama pada URL. Melalui pengenalan blog sebelumnya, kami tahu bahwa proses pengiriman pengkodean permintaan ke server oleh URL benar -benar terlalu membingungkan. Sistem operasi yang berbeda, browser yang berbeda, dan set karakter web yang berbeda akan menghasilkan hasil penyandian yang sama sekali berbeda. Bukankah terlalu menakutkan jika pemrogram ingin memperhitungkan setiap hasil? Apakah ada cara untuk memastikan bahwa klien hanya menggunakan satu metode pengkodean untuk mengeluarkan permintaan ke server?
memiliki! Di sini saya terutama memberikan metode berikut
1. JavaScript
Menggunakan encoding JavaScript tidak memberi browser kesempatan untuk campur tangan. Setelah pengkodean, kirim permintaan ke server dan kemudian mendekodenya di server. Saat menguasai metode ini, kita membutuhkan tiga metode pengkodean JavaScript: Escape (), Encodeuri (), dan Encodeuricomponent ().
melarikan diri
String yang ditentukan dikodekan menggunakan set karakter SIO Latin. Semua karakter non-ASCII dikodekan sebagai string dalam format %xx, di mana xx mewakili angka heksadesimal yang sesuai dengan karakter dalam set karakter. Misalnya, pengkodean yang sesuai dengan format adalah %20. Metode decoding yang sesuai adalah Unescape ().
Faktanya, Escape () tidak dapat digunakan secara langsung untuk pengkodean URL, fungsi sebenarnya adalah mengembalikan nilai yang dikodekan unicode karakter. Misalnya, hasil "I Am CM" di atas adalah %U6211 %U662FCM, di mana pengkodean yang sesuai dari "I" adalah 6211, pengkodean "ya" adalah 662F, dan pengkodean "CM" adalah CM.
Perhatikan bahwa Escape () tidak benar untuk pengkodean "+". Tetapi kita tahu bahwa jika ada spasi di halaman web saat mengirimkan formulir, itu akan dikonversi menjadi + karakter. Ketika server memproses data, tanda + akan diproses menjadi spasi. Karena itu, berhati -hatilah saat menggunakannya.
encodeuri
Pengkodean seluruh URL, menggunakan format UTF-8 untuk mengeluarkan string yang dikodekan. Namun, Encodeuri tidak akan menyandikan beberapa karakter khusus kecuali pengkodean ASCII, seperti :! @ # $ & * () =: /; ? + '.
Encodeuricomponent ()
Konversi string URI menjadi string format pelarian dalam format pengkodean UTF-8. Dibandingkan dengan Encodeuri, Encodeuricomponent akan lebih kuat, dan itu akan dikodekan untuk simbol (; / ?: @ & = + $, #) yang tidak dikodekan dalam Encodeuri (). Namun, komponen encodeuric hanya akan menyandikan komponen URL secara individual, dan tidak akan digunakan untuk menyandikan seluruh URL. Metode Decodeuricomponen Metode Decode yang sesuai.
Tentu saja, kami biasanya menggunakan Pihak Encodeuri untuk melakukan operasi pengkodean. Apa yang disebut pengkodean dan decoding JavaScript dua kali di latar belakang adalah menggunakan metode ini. Ada dua solusi untuk menyelesaikan masalah ini dalam JavaScript: satu transkode dan dua metode transkode.
Transcoding sekali
Transcoding JavaScript:
var url = '/showmoBlieqrcode.servlet?name=i am cm'; window.location.href = encodeuri (url);
URL transcoded: http://127.0.0.1:8080/perbank/showmoBlieqrcode.servlet?name=%E6%88%91%E6%98%AFCM
Pemrosesan Backend:
Name string = request.getParameter ("name"); System.out.println ("Parameter Insoming Foreground:" + Name); name = New String (name.getBytes ("ISO-8859-1"), "UTF-8"); System.out.println ("Parameter Decoded:" + Name);Hasil output:
Parameter Masuk di Meja Depan: ?????? CM
Setelah parameter decoding: saya cm
Transkode sekunder
Javascript
var url = '/showmoBlieqrcode.servlet?name=i am cm'; window.location.href = encodeuri (encodeuri (url));
URL transcoded: http://127.0.0.1:8080/perbank/showmoblieqrcode.servlet?name=%25e6%2588%2591%25E6%2598%25AFCM
Pemrosesan Backend:
Name string = request.getParameter ("name"); System.out.println ("Parameter masuk latar depan:" + Nama); name = urldecoder.decode (name, "UTF-8"); System.out.println ("Parameter Decoded:" + Name);Hasil output:
Parameter masuk front-end: E68891E698AFCM
Setelah parameter decoding: saya cm
menyaring
Menggunakan filter, filter LZ menyediakan dua jenis, yang pertama adalah mengatur pengkodean, dan yang kedua adalah melakukan operasi decoding secara langsung di filter.
Filter 1
Filter ini secara langsung menetapkan format pengkodean permintaan.
Kelas Publik KarakterEncoding mengimplementasikan filter {private filterconfig config; String encoding = null; public void dashar () {config = null; } public void dofilter (permintaan servletRequest, respons servletResponse, rantai filterchain) melempar ioException, servletException {request.setcharacterencoding (encoding); rantai.dofilter (permintaan, respons); } public void init (filterconfig config) melempar servletException {this.config = config; // Dapatkan Parameter Konfigurasi String str = config.getInitparameter ("encoding"); if (str! = null) {encoding = str; }}} Konfigurasi:
<filter> <filter-name>chineseEncodingfilter-name> <filter-class>com.test.filter.CharacterEncodingfilter-class> <init-param> <param-name>encodingparam-name> <param-value>utf-8param-value> init-param> filter> <filter-mapping> <filter-name>chineseEncodingfilter-name> <rerl-pola>/*URL-Pattern> Filter-Mapping>
Filter 2
Dalam metode pemrosesan, filter secara langsung mendekode parameter, dan kemudian mengatur ulang parameter yang diterjemahkan ke atribut permintaan.
Public Class Characterencoding mengimplementasikan filter {filterconfig filterconfig yang dilindungi; String encoding = null; public void hancurkan () {this.filterconfig = null; } / *** inisialisasi* / public void init (filterconfig filterconfig) {this.filterconfig = filterconfig; } / *** Konversi Instr menjadi Formulir Pengkodean UTF -8** @param Instr enter String* @return UTF - Formulir Pengkodean 8 String* @Throws UnsupportedEncodingException* / Private String toutf (String Instr) melempar Uns UnsportedEncodingException {String outstr = ""; if (instr! = null) {outstr = new string (instr.getbytes ("iso-8859-1"), "utf-8"); } return outstr; } / *** Pemrosesan penyaringan China kacau* / public void dofilter (servletRequest servletRequest, servletResponse servletResponse, rantai filterchain) melempar ioException, servletException {httpservletrequest = (httpservletreest) servletrequest); HttpservletResponse respons = (httpservletResponse) ServletResponse; // Metode untuk mendapatkan permintaan (1.post atau 2.get), dan pemrosesan yang berbeda dilakukan sesuai dengan metode permintaan yang berbeda Metode string = request.getMethod (); // 1. Untuk permintaan yang dikirimkan di pos, langsung atur pengkodean ke UTF-8 if (method.equalsignorecase ("post")) {coba {request.setcharacterencoding ("UTF-8"); } catch (UnsupportedEncodingException e) {e.printstacktrace (); }} // 2. Permintaan yang dikirimkan di Get Else {// Keluar dari set parameter yang dikirimkan oleh enumeration ParamNames = request.getParameTernames (); // Lintasan parameter yang ditetapkan untuk mendapatkan nama dan nilai dari setiap parameter sementara (paramnames.hasmoreElements ()) {string name = paramNames.NextElement (); // ambil name parameter nilai string [] = request.getParameterues (name); // ambil nilai nilainya sesuai dengan nama parameter // jika nilai parameter adalah nilai parameter (name); ; nilai [i] = vlustr; } catch (UnsupportedEncodingException e) {e.printstacktrace (); }} // Sembunyikan nilai dalam bentuk atribut dalam permintaan permintaan.setAttribute (name, values); }}} // Atur metode respons dan mendukung set response karakter Cina.setContentType ("Teks/html; charset = UTF-8"); // Lanjutkan untuk menjalankan filter berikutnya. Jika tidak ada filter, rantai permintaan.dofilter (permintaan, respons); }}Konfigurasi:
<filter> <nilter-name> cinaencodingfilter-name> <nilter-class> com.test.filter.characterencodingfilter-class> filter> <nilter-Mapping> <nilter-name> ChinaCodingFilter-name> <RURL-PATER>/*URL-POLTER> MAPPing> Mapping>
lainnya
1. Setel PageEncoding dan ContentType
<%@ page language = "java" contentType = "text/html;
charset = UTF-8 "pageEncoding =" UTF-8 "%>
2. Atur Uriencoding Tomcat
Secara default, server Tomcat menggunakan format pengkodean ISO-8859-1 untuk menyandikan URL yang diminta oleh parameter Uriencoding, jadi kita hanya perlu menambahkan Uriencoding = "UTF-8" ke tag file server.xml tomcat.
Di atas adalah semua tentang artikel ini. Saya harap akan sangat membantu bagi semua orang untuk mempelajari pertanyaan -pertanyaan kacau Cina.