2015-06-30 3 views
1

Я не могу заставить кодировку запроса работать правильно. Для кодирования работать, я добавил фильтр к прыжку безопасности:Весенний ботинок MVC неправильно закодированный запрос POST

@Bean 
public CharacterEncodingFilter characterEncodingFilter() { 
    CharacterEncodingFilter filter = new CharacterEncodingFilter(); 
    filter.setEncoding("UTF-8"); 
    filter.setForceEncoding(true); 
    return filter; 
} 
@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http.addFilterBefore(characterEncodingFilter(), CsrfFilter.class); 
... 
} 

Добавить мета в мои страницы:

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta charset="utf-8" /> 
... 

Добавить UriEnconding в кот 8:

<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8" 
    connectionTimeout="20000" 
    redirectPort="8443" /> 

Но это не отвечает никому из них. Когда я отправляю запрос и отлаживаю его, результат получается неверным. Например, когда я отправляю بای в качестве части формы запроса, я получаю باÛ. Есть ли какая-то часть конфигурации, которую я не вижу?

При отправке запроса ajax с полезной нагрузкой (с клиентом rest и другом другом) он работает правильно, но не удастся с данными формы. Мой контроллер выглядит следующим образом:

@RequestMapping(value = "/test1") 
@ResponseBody 
public String test1(@RequestBody String req) { 
    return req; 
} 

@RequestMapping(value = "/test2") 
@ResponseBody 
public String test2(@RequestParam("search") String req) { 
    return req; 
} 

различные попытки:

  1. для test1 с Content-Type=application/json это правильно recieves параметр.
  2. для test2 с Content-Type=application/x-www-form-urlencoded и получить метод, снова все отлично работает.
  3. для test2 с Content-Type=application/x-www-form-urlencoded и методом POST, он возвращает неверные кодированные значения.

Похоже, что проблема связана с методом POST. какие-либо предложения?

ответ

4

После того, как вы перебрали много цепей фильтров и кодирования движущихся символов, они, наконец, нашли проблему. Другой фильтр изменял кодирование до кодирования символов удара в

Я просто фильтр из рук Spring Security и добавить его вручную, как боб, чтобы сделать фильтрацию для меня.

@Bean 
public FilterRegistrationBean filterRegistrationBean() { 
    FilterRegistrationBean registrationBean = new FilterRegistrationBean(); 
    CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); 
    characterEncodingFilter.setEncoding("UTF-8"); 
    registrationBean.setFilter(characterEncodingFilter); 
    return registrationBean; 
} 

2 дня или поиск и пытается и просто простой ответ. Какой трудный путь, чтобы найти ответ

--- UPDATE ---

Если вы используете пружинные загрузки 1.2+, нет необходимости в CharacterEncoding вообще. по умолчанию он находится в своем идеальном положении с кодировкой символов, равной utf8. Так что в следующий раз просто установите атрибуты, если они есть! the properties to set are:

# HTTP encoding (HttpEncodingProperties) 
spring.http.encoding.charset=UTF-8 # the encoding of HTTP requests/responses 
spring.http.encoding.enabled=true # enable http encoding support 
spring.http.encoding.force=true # force the configured encoding 

--- ОБНОВЛЕНИЕ 2 ---

От Tomcat wiki: В Tomcat 8 начиная с 8.0.0 (8.0.0-RC3, чтобы быть конкретным), значение по умолчанию URIEncoding атрибут элемента зависит от настройки «строгого сервлета». Значение по умолчанию (строгое соответствие отключено) URIEncoding теперь UTF-8. Если включено «строгое соответствие сервлета», значение по умолчанию - ISO-8859-1.

так как обычно говорят, что нет необходимости устанавливать UriEncoding в Tomcat Config neigter.

+0

Кажется, что даже задавая вопрос, вы можете найти ответ;). Хотелось бы, чтобы я спросил его раньше. не через 2 дня ... – alizelzele

+2

Какую весеннюю версию вы используете? Версия 1.2 должна уже иметь параметр 'CharacterEncodingFilter' по умолчанию, с по умолчанию' UTF-8'. См. Https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.2-Release-Notes#consistent-http-uribody-decoding –

+0

Я использую версию 1.2.4. возможно, добавив, что он переопределяет значение по умолчанию. Дай мне проверить. просто мин :) – alizelzele

Смежные вопросы