В основном мы отправляем запросы на сервер через две формы представления: URL и форма. Форма, как правило, не имеет искаженных проблем, а искаженные проблемы в основном на URL. Благодаря введению предыдущих блогов мы знаем, что процесс отправки запроса, кодирующего на сервере с помощью URL, действительно слишком запутан. Различные операционные системы, разные браузеры и разные наборы веб -символов приведут к совершенно разным результатам кодирования. Разве это не слишком страшно, если программисты хотят принять во внимание все результаты? Есть ли способ гарантировать, что клиент использует только один метод кодирования для выпуска запроса на сервер?
иметь! Здесь я в основном предоставляю следующие методы
1. Javascript
Использование кодирования JavaScript не дает браузеру возможность вмешаться. После кодирования отправьте запрос на сервер, а затем декодируйте его на сервере. При освоении этого метода нам нужны три метода кодирования JavaScript: ascod (), encodeuri () и encodeuricomponent ().
побег
Указанная строка кодируется с использованием набора символов SIO. Все символы, не являющиеся ASCII, кодируются как строки в формате %xx, где XX представляет шестнадцатеричное число, соответствующее символу в наборе символов. Например, кодирование, соответствующее формату, равна %20. Его соответствующий метод декодирования - Unescape ().
Фактически, escep () не может быть использован непосредственно для кодирования URL, его реальная функция-вернуть значение, кодируемое юникодом симвода. Например, результат «I Am CM» выше - %U6211 %U662FCM, где соответствующее кодирование «I» составляет 6211, кодирование «да» составляет 662F, а кодирование «CM» - CM.
Обратите внимание, что escape () не верен для кодирования "+". Но мы знаем, что если на веб -странице есть места при отправке формы, она будет преобразована в + символы. Когда сервер обрабатывает данные, знак + знак будет обработана в пространство. Поэтому будьте осторожны при его использовании.
Encodeuri
Кодируя весь URL, он использует формат UTF-8 для вывода кодируемой строки. Тем не менее, Encodeuri не будет кодировать некоторые специальные символы, кроме кодирования ASCII, таких как:! @ # $ & * () =: /; ? + '.
Encodeuricomponent ()
Превратите строки URI в строки формата побега в формате кодирования UTF-8. По сравнению с Encodeuri, Encodeuricomponent будет более мощным, и он будет кодироваться для символов (; /?: @ & = + $, #), Которые не кодируются в encodeuri (). Тем не менее, Encodeuricomponent будет кодировать компоненты URL -адреса отдельно и не будет использоваться для кодирования всего URL. Соответствующий метод функции декодирования декодеурикупонент.
Конечно, мы обычно используем партию Encodeuri для выполнения операций кодирования. Так называемый кодирование и декодирование JavaScript дважды в фоновом режиме-использовать этот метод. Есть два решения для решения этой проблемы в JavaScript: один транскодирование и два метода транскодирования.
Транскодирование один раз
JavaScript Transcoding:
var url = '/showmoblieqrcode.servlet?name=i am cm'; window.location.href = encodeuri (url);
Transcoded URL: http://127.0.0.1:8080/perbank/showmoblieqrcode.servlet?name=%E6%88%91%E6%98%AFCM
Обработка бэкэнд:
String name = request.getParameter ("name"); System.out.println ("Входящие параметры на переднем плане:" + name); name = new String (name.getbytes ("iso-8859-1"), "UTF-8"); System.out.println ("Декодированные параметры:" + name);Результат вывода:
Входящие параметры в стойку регистрации: ??????
После декодирования параметров: я CM
Вторичное транскодирование
JavaScript
var url = '/showmoblieqrcode.servlet?name=i am cm'; window.location.href = encodeuri (encodeuri (url));
Транскодированный URL: http://127.0.0.1:8080/perbank/showmoblieqrcode.servlet?name=%25E6%2588%2591%25E6%2598%25afcm
Обработка бэкэнд:
String name = request.getParameter ("name"); System.out.println ("Входящие параметры переднего плана:" + name); name = urldecoder.decode (name, "utf-8"); System.out.println ("Декодированные параметры:" + name);Результат вывода:
Входящие параметры фронта: E68891E698AFCM
После декодирования параметров: я CM
фильтр
Используя фильтры, фильтр LZ предоставляет два типа, первым является установка кодирования, а второе - выполнить операции декодирования непосредственно в фильтре.
Фильтр 1
Этот фильтр напрямую устанавливает формат кодирования запроса.
Общедоступный класс символ Особого реализует фильтр {Private FilterConfig Config; String Encoding = null; public void destress () {config = null; } public void dofilter (запрос ServletRequest, ответ ServletResponse, FilterChain Chain) бросает ioException, servletexception {request.setcharacterencoding (кодирование); chain.dofilter (запрос, ответ); } public void init (config filterConfig) Throws ServletException {this.config = config; // Получить параметры конфигурации string str = config.getinitParameter ("Кодирование"); if (str! = null) {encoding = str; }}} Конфигурация:
<Filter> <Filter-name> китайский экодингфильтер-name> <filter-class> com.test.filter.characterencodingfilter-class> <init-param> <param-name> encodingparam-name> <param-value> utf-8param-value> init-param> filter-mapping> <filtertration> uname-name> intaistringfilter> intamefilter> inting-namefilter> intamefilter> intincingfilter> <piltterter> <filttertra> <Url-pattern>/*url-pattern> отображение фильтра>
Фильтр 2
В методе обработки фильтр непосредственно декодирует параметры, а затем сбрасывает декодированные параметры в атрибут запроса.
Public Class HearlyCoding реализует Filter {Protected FilterConfig FilterConfig; String Encoding = null; public void destress () {this.filterConfig = null; } / *** Инициализировать* / public void init (filterConfig filterConfig) {this.filterConfig = filterConfig; } / *** Преобразовать instr в форму кодирования UTF -8** @param instr string* @return utf - 8 Строка кодирования 8* @Throws UnsUpportEncodingException* / private String TOUTF (String instr) Throws UnsupportEncodingException {String upstr = ""; if (instr! = null) {outstr = new String (instr.getbytes ("iso-8859-1"), "UTF-8"); } return outstr; } / *** Китайская исчезненная обработка фильтрации* / public void dofilter (servletrequest servletrequest, Servletresponse Servletresponse, FilterChain Chain) Throws IoException, ServletException {httpservletRequest запрос = (httpservletrequest) servletrequest; Httpservletresponse response = (httpservletresponse) Servletresponse; // метод получения запроса (1.post или 2.get), и различная обработка выполняется в соответствии с различными методами запроса string method = request.getmethod (); // 1. Для запросов, представленных в сообщении, напрямую установите кодирование UTF-8 if (method.equalsignorecase ("post")) {try {request.setcharacterencoding ("utf-8"); } catch (unsupportEncodingexception e) {e.printstacktrace (); }} // 2. Запрос, представленный в get else {// получить набор параметров, представленных клиентским перечислением paramnames = request.getParameternames (); // Переверните параметр, установленный, чтобы получить имя и значение каждого параметра, while (paramnames.hasmoreelements ()) {string name = paramnames.nextelement (); // Установить значение имени параметра [] = запрос. (int i = 0; i <values.length; i ++) {try {// Круг назад и вызовите каждое значение toutf (values [i]) метод для преобразования кодирования символов значения параметра string vlustr = toutf (values [i]); значения [i] = vlustr; } catch (unsupportEncodingexception e) {e.printstacktrace (); }} // скрыть значение в форме атрибута в запросе request.setattribute (name, values); }}} // Установить метод ответа и поддержать китайский набор символов. // продолжать выполнять следующий фильтр. Если нет фильтра, цепочка запроса. Dofilter (запрос, ответ); }}Конфигурация:
<Filter> <Filter-name> китайский экодингфильтер-name> <filter-class> com.test.filter.characterencodingfilter-class> Filter> <Filter-Mapping> <Filter-name> windencodingfilter-name> <Url-pattern>/*url-pattern>-картирование>-фильт
другой
1. Установите Pageencoding и ContentType
<%@ page language = "java" contentType = "text/html;
charset = utf-8 "pageencoding =" utf-8 "%>
2. Установите уризодирование Tomcat
По умолчанию сервер Tomcat использует формат кодирования ISO-8859-1 для кодирования URL-адреса, запрашиваемого параметром Uriencoding, поэтому нам нужно только добавить Uriencoding = ”UTF-8” к тегу файла Server.xml Tomcat.
Выше всего об этой статье. Я надеюсь, что для всех будет полезно изучить китайские искаженные вопросы.