gpt4 book ai didi

java - 在 web.xml 中使用 CharacterEncodingFilter 进行 Spring 编码

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:01:42 25 4
gpt4 key购买 nike

在 stackoverflow.com 上编码

{|}~€‚ƒ„…†‡‡‰Š‹ŒŽ''“”•– ™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±码¶ ♥""♡★☆⌂№☎☏♨☜☞♩♪♫♬♭†‡←↑→↓↔↕↖↗↘↙×÷+-Ω√¼½¾⅓⅔⅛⅜⅜⅝%‰¹²³

在我的网站上结束编码:

{|}~?????????????????????¡¢£¤¥¦§¨©ª«¬® °±²³´¶·讯»¼½¾?¼½the( ??????""????¦???????????????????????????×÷+-Ov¼½¾???????%?¹²³

解决方案:

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

并将其放入我的 HttpsCoookieFilter 中:

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

显然我(ab)使用 HttpServlet 而不是 Freemarker 来使用 out.write() 生成 HTML 内容,所以我添加了上面的内容。

现在这是 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 !!!

最佳答案

当字符到字节的转换器/编写器本身知道字符集时,通常使用问号,字符实际上编码在字符集字符必须被解码为。如果解码字符集不支持原始编码中的特定字符,则将其转换为问号。

在具有数据库后端的普通 Web 应用程序中,有两个地方可能会发生这种情况:

  1. 当用户提交的数据即将被插入/更新到数据库中时。
  2. 当 HTTP 响应主体即将被写入并发送给客户端时。

在这两种情况下,都使用了只理解字节的 TCP/IP 网络,服务器和客户端通常都知道双方使用的字符集。在所有其他情况下,您会看到 Mojibake相反。

要涵盖第一种情况,您需要确保数据库和表配置为使用 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 作为 View 时,只需将以下内容添加到每个 JSP 页面(包括包含)的顶部就足够了(它不仅设置响应编码,而且隐式设置正确的响应 header ) .

<%@ page pageEncoding="UTF-8" %>

另见:


对于您当前使用的Spring字符编码过滤器,它只设置请求编码,以便您可以确保提交的数据被解释为UTF-8。它基本上所做的是:

request.setCharacterEncoding("UTF-8");

仅此而已。请注意,这仅涵盖 POST 请求,对于 GET 请求,您仍然需要配置网络服务器以将 URL 解释为 UTF-8。

关于java - 在 web.xml 中使用 CharacterEncodingFilter 进行 Spring 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5444693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com