Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Кодировка в строке запроса, Jboss+tomcat


Автор: WatchCat 15.12.2006, 18:28
Вот какая-то фигня получается.
Настроил tomcat:
Код

      <Connector port="80" address="${jboss.bind.address}"
         maxThreads="250" strategy="ms" maxHttpHeaderSize="8192"
         emptySessionPath="true"
         useBodyEncodingForURI="true"
         URIEncoding="UTF-8"
      enableLookups="false" redirectPort="8443" acceptCount="100"
         connectionTimeout="20000" disableUploadTimeout="true"/>

Закинул в ROOT.war такую тестовую jsp'шку (testenc.jsp, в UTF кодировке)
Код

<%@ page import="java.net.URLEncoder" %>
<%@ page import="java.util.Enumeration"%>
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<title>testenc.jsp page</title></head>
<meta http-equiv="pragma" content="no-cache" />
<!meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<body>
<%=request.getCharacterEncoding()%>
<table>
<%  Enumeration pnms = request.getParameterNames();
    while (pnms.hasMoreElements()) {
        Object o = pnms.nextElement();
        String[] v = request.getParameterValues(o.toString());
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < v.length; i++) sb.append(v[i]).append("|");
%><tr><td><%=o.toString()%></td><td><%=sb.toString()%></td><td><%=request.getParameter(o.toString())%></td></tr><%    }%>
</table>
<a href="testenc.jsp?param=<%=URLEncoder.encode("Русский", "UTF-8")%>">Русский</a><br/>
</body>
</html>


В браузере загружается нормально, по ссылке переходит нормально.
НО! если самому набирать url вида "<host>/testenc.jsp?param=Русский", 
то браузер перекодирует не в виде <host>/testenc.jsp?param=%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9
а в виде <host>/testenc.jsp?param=%D0%F3%F1%F1%EA%E8%E9
т.е. в кодировку 1251(?)
Хотя с тем же wikipedia.org, например, проходит всё нормально, там перекодируется в UTF-8

Вот и возникает вопрос, кде что подкрутить надо? Кто-нибудь знает?

Автор: intr 20.1.2007, 17:18
Чтобы из requst`а получать русские значения, необходимо делать 
Код

request.setCharacterEncoding("UTF-8");

в отдельном фильтре перед отрисовкой jsp.

Но для русского языка это вроде работает только для POST (передача данных сабмитом формы) запросов, для GET (если написать в строке запроса <host>/testenc.jsp?param=Русский), неработает. 
 Пример фильтра
Код

package test;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class TestFilter implements Filter {

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        response.setContentType("text/html;charset=UTF-8");
        chain.doFilter(request, response);
    }

    public void init(FilterConfig arg0) throws ServletException {
    }

}


Пример конфига (пишется в web.xml):
Код

    <filter>
        <filter-name>test</filter-name>
        <filter-class>test.TestFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>test</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)