gpt4 book ai didi

java - 如何使最简单的 servlet 过滤器尊重设置的字符编码

转载 作者:行者123 更新时间:2023-11-30 07:28:26 25 4
gpt4 key购买 nike

感觉我被卡住了。我正在尝试编写最简单的 servlet 过滤器(并将其部署到 tomcat)。这是一个 groovy 代码,但实际上我在这里大量使用 java 方法,所以它几乎是复制粘贴,这也是我添加 java 标签的原因。

我的问题是 - 如何插入 UTF-8 字符串进行过滤?这是代码:

public class SimpleFilter implements javax.servlet.Filter

{
...
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws java.io.IOException, javax.servlet.ServletException
{
PrintWriter out = response.getWriter()
chain.doFilter(request, wrapResponse((HttpServletResponse) response))

response.setCharacterEncoding('UTF-8')
response.setContentType('text/plain')

def saw = 'АБВГДЕЙКА ЭТО НЕПРОСТАЯ ПЕРЕДАЧА ABCDEFGHIJKLMNOP!!!'
def bytes = saw.getBytes('UTF-8')
def content = new String(bytes, 'UTF-8')

response.setContentLength(content.length())
out.write(content);
out.close();
}

private static HttpServletResponse wrapResponse(HttpServletResponse response) {
return new HttpServletResponseWrapper(response) {
@Override
public PrintWriter getWriter() {
def writer = new OutputStreamWriter(new ByteArrayOutputStream(), 'UTF-8')
return new PrintWriter(writer)
}
}
}
}

过滤页面的内容类型是text/plain;charset=ISO-8859-1。因此,内容类型发生了变化,但字符集被忽略了。

如您所见,我采取了一些措施(我想这很天真)来确保内容是 UTF-8,但这些步骤实际上都没有帮助。

我还尝试将 URIEncoding="UTF-8"useBodyEncodingForUri="true" 属性添加到tomcat conf/server.xml 中的连接器

如果有人向我解释我做错了什么,那就太好了。

UPD: 只是一点解释 - 我正在编写 XSLT 应用过滤器,这是我试图放弃整个请求的真正原因。

最佳答案

def saw = 'АБВГДЕЙКА ЭТО НЕПРОСТАЯ ПЕРЕДАЧА ABCDEFGHIJKLMNOP!!!'
def bytes = saw.getBytes('UTF-8')
def content = new String(bytes, 'UTF-8')

不改变锯和内容之间的东西。你想要做的是(使用 outputstreamnot the writer,这就是字符集重置为 ISO-8859-1 See tomcat doc 的原因):

out.write(saw.getBytes("UTF-8);

您的代码看起来可以将字符集设置为 UTF-8。

我不明白你用 HttpResponseWrapper 做什么。

为了清楚起见,这将起作用:

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws java.io.IOException, javax.servlet.ServletException
{
OutputStream out = response.getOutputStream()

response.setCharacterEncoding('UTF-8')
response.setContentType('text/plain')

def saw = 'АБВГДЕЙКА ЭТО НЕПРОСТАЯ ПЕРЕДАЧА ABCDEFGHIJKLMNOP!!!'

response.setContentLength(saw.length())
out.write(content.getBytes("UTF-8"));

}

关于java - 如何使最简单的 servlet 过滤器尊重设置的字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9230775/

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