Spring编码问题:使用web.xml中的CharacterEncodingFilter进行编码

3

stackoverflow.com的编码方式

{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎ ±ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö±øùúûüýþŸ▲►▼◄■□▣▤▥▦▧▨▩▪▫◊○●☺☻☼€¢£¥¤♀♂♂♠♤♣♧♥""♡♦★☆⌂№☎☏♨☜☞♩♪♫♬♭†‡←↑→↓↔↕↖↗↘↙×÷+-Ω√¼½¾⅓⅔⅛⅜⅜⅝%‰¹²³

我的网站的编码方式:

{|}~???????????????????????????¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎ ±ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö±øùúûüýþ?????¦???????????????¤?¢£¥¤????????""????¦???????????????????????×÷+-Ov¼½¾??????%?¹²³

解决方案:

<#ftl attributes={"content_type":"text/html"} encoding="UTF-8"/>

并将此放入我的HttpsCookie过滤器中:

        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");

显然我在使用HttpServlet生成HTML内容时滥用了它,而不是使用Freemarker和out.write()方法。因此,我添加了上述代码。

现在这里是servlet源码,请提供任何有关如何更改它的建议:

public class HttpsCookieFilter implements Filter {
private static Logger log = Logger.getLogger(HttpsCookieFilter.class);

@Override
public void destroy() {
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

    final HttpServletRequest req = (HttpServletRequest) request;
    final HttpServletResponse res = (HttpServletResponse) response;

        req.setCharacterEncoding("UTF-8");
        res.setCharacterEncoding("UTF-8");
        res.setContentType("text/html; charset=UTF-8");

    final HttpSession session = req.getSession(false);

    if (session != null) {
        setCookie(req, res);
    }
    try {
        chain.doFilter(req, res);
    } catch (IllegalStateException e) {
        log.warn("HttpsCookieFilter redirect problem! ", e);
    }
}

@Override
public void init(FilterConfig arg0) throws ServletException {
}

private void setCookie(HttpServletRequest request, HttpServletResponse response) {
    Cookie cookie = new Cookie("JSESSIONID", request.getSession(false).getId());
    cookie.setMaxAge(-1);
    cookie.setPath(getCookiePath(request));
    cookie.setSecure(false);
    response.addCookie(cookie);
}

private String getCookiePath(HttpServletRequest request) {
    String contextPath = request.getContextPath();
    return contextPath.length() > 0 ? contextPath : "/";
}
}

现在UTF-8已经普及到各个领域了 ;) 感谢BalusC!!!

1
显然你没有全程使用UTF-8,否则一切都会没问题的。 :) - Bombe
2个回答

8
问号通常用于字符转换器/编写器本身知道字符实际编码和需要解码到的字符集。如果解码字符集不支持原始编码中的特定字符,则将其转换为问号。
在具有数据库后端的平均Web应用程序中,这可以发生在两个位置:
1. 当用户提交的数据即将插入/更新到DB时。 2. 当HTTP响应正文即将被写入并发送到客户端时。
在这两种情况下,使用TCP / IP网络,该网络仅了解字节,并且服务器和客户端通常都知道双方使用的字符集。在所有其他情况下,您将看到Mojibake
要涵盖第一种情况,您需要确保已配置DB和表以使用UTF-8。通常在CREATE期间指定。以下是MySQL方言的示例。
CREATE DATABASE db_name CHARACTER SET utf8;
CREATE TABLE tbl_name (...) CHARACTER SET utf8;

对于某些JDBC驱动程序,例如MySQL驱动程序,您还需要指示驱动程序本身使用UTF-8。

jdbc:mysql://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8

为了处理第二种情况,您需要确保已指示响应编写器使用UTF-8将字符解码为字节。当使用JSP作为视图时,只需将以下内容添加到每个JSP页面(包括包含的页面)的顶部即可(它不仅设置响应编码,而且还隐式设置正确的响应头)。
<%@ page pageEncoding="UTF-8" %>

参见:


关于你目前使用的Spring字符编码过滤器,它只设置请求编码,以确保提交的数据被解释为UTF-8。它基本上只做了以下几件事情:
request.setCharacterEncoding("UTF-8");

仅限于POST请求,不涵盖GET请求。如果您需要对URL进行UTF-8解析,仍需配置Web服务器。


1
在您的调度程序servlet上下文xml中,您必须在viewResolver bean上添加一个属性"<property name="contentType" value="text/html;charset=UTF-8" />"。 我们正在使用freemarker进行视图。
它看起来像这样:
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
       ...
       <property name="contentType" value="text/html;charset=UTF-8" />
       ...
</bean>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接