2014-03-03 67 views
3

我想用希伯来语发送带有查询字符串参数的GET请求。 当控制器收到请求时,参数乱码。 我已经添加了“org.springframework.web.filter.CharacterEncodingFilter”,但它没有改变一件事。查询字符串中的字符编码,希伯来文

请指教如何解决它。

更新:这是请求。

GET /myapp/specialties?query=%D7%92%D7%99%D7%A0%D7%A0%D7%A0%D7%A0 HTTP/1.1 
Host: localhost:8080 
Connection: keep-alive 
Accept: * 
Cache-Control: no-cache 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like   Gecko) Chrome/33.0.1750.117 Safari/537.36 
Content-Type: application/json;charsert=utf-8 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8,he;q=0.6 
Query String Parametersview sourceview URL encoded 
query:גיננננ 
Response Headersview source 
Content-Type:application/json;charset=UTF-8 
Date:Mon, 03 Mar 2014 20:45:17 GMT 
Server:Apache-Coyote/1.1 
Transfer-Encoding:chunked 

的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" version="2.5"> 

    <display-name>med.rec</display-name> 


    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath:spring/application-config.xml</param-value> 
    </context-param> 

    <filter> 
     <filter-name>CharacterEncodingFilter</filter-name> 
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
     <init-param> 
      <param-name>encoding</param-name> 
      <param-value>UTF-8</param-value> 
     </init-param> 
     <init-param> 
      <param-name>forceEncoding</param-name> 
      <param-value>true</param-value> 
     </init-param> 
    </filter> 

    <filter-mapping> 
     <filter-name>CharacterEncodingFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <servlet> 
     <servlet-name>dispatcherServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/mvc-config.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>dispatcherServlet</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

</web-app> 

-Roy

+0

你从哪里发送GET请求?它来自浏览器还是您写的一些程序?你可以使用POST吗? – user2793390

+0

我从angular-js资源发送它。我遵循REST原则,因此帖子不相关。 –

+0

您可以放置​​CharacterEncodingFilter的配置吗?我遇到了同样的问题,并使用它解决它。所以你可能会有一些配置错误。 –

回答

5

事实证明HttpServletRequest#setCharacterEncoding(String)其中CharacterEncodingFilter使用在主体中使用的字符编码的

重写的名称这 请求 。必须在读取请求 参数或使用getReader()读取输入之前调用此方法。否则,它没有 的影响。

这对您没有好处,因为您没有从正文获取参数,而是从查询字符串获取参数。

但是,如果您使用的是Tomcat,那么您很幸运。 Tomcat有一个特殊的Connector属性,当它被设置(默认情况下未设置)时,将对查询字符串使用相同的字符编码。

该属性是useBodyEncodingForURI。如果你打开你的Tomcat servet.xml文件,你会发现像一个元素(无属性)

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" 
    redirectPort="8443" useBodyEncodingForURI="true"> 
</Connector> 

添加属性,如预期它会奏效。确保你在这种情况下将它设置为适当的Connector,HTTP。

其他Servlet容器可能有一些类似的配置。

+0

有完全相同的问题,但接受的答案不适用于我。查询字符串以utf-8编码(与body相同),但由于某种原因解码失败。当debbuging时,我可以在ApplicationFilterChain旁边看到我的CharacterEncodingFilter。这是正确的顺序吗?虽然我没有使用web.xml。我应该开一个新的问题吗? – pakman

+1

@pakman'CharacterEncodingFilter'解码请求的主体,而不是查询字符串。你有没有设置连接器? –

+0

是的,我试过useBodyEncodingForURI =“true”和URIEncoding =“UTF-8”(不是在同一时间)...并且什么也没有。我已经尝试了几个tomcat 7版本,包括最新的tomcat 7(v。7.0.54)。这让我疯狂。 – pakman