感觉好像被卡住了。 我正在尝试编写最简单的servlet Filter(并将其部署到tomcat)。这是一个时髦的代码,但实际上我在这里大量使用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
。
因此,内容类型已更改,但charset被忽略。
正如你所看到的,我采取了一些措施(我觉得很天真)来确保内容是UTF-8,但这些步骤都没有帮助。
我还尝试添加URIEncoding="UTF-8"
或useBodyEncodingForUri="true"
属性
tomcat conf / server.xml中的连接器
如果有人向我解释我做错了什么会很好。
UPD:只是一些解释 - 我正在编写XSLT应用过滤器,这是我试图放弃整个请求的真正原因。
答案 0 :(得分:2)
def saw = 'АБВГДЕЙКА ЭТО НЕПРОСТАЯ ПЕРЕДАЧА ABCDEFGHIJKLMNOP!!!'
def bytes = saw.getBytes('UTF-8')
def content = new String(bytes, 'UTF-8')
不会改变锯和内容之间的东西。您想要做的是(使用输出流和而非作者,这就是为什么将字符集重置为ISO-8859-1 See tomcat doc):< / p>
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"));
}
答案 1 :(得分:1)
这可能是你遇到的问题,或者至少它是问题的一部分。正如setCharacterEncoding()
的文档所说:
如果在getWriter之后调用此方法,则此方法无效 在响应被提交之后或之后。
您应该设置编码,,只有在之后才能获得编辑。
答案 2 :(得分:1)
您尝试通过调用getWriter提交响应后设置内容类型。 有关详细信息,请参阅getWriter和setCharacterEncoding上的文档。
要修复代码,只需移动内容类型设置并稍早编码几行。
response.setCharacterEncoding('UTF-8')
response.setContentType('text/plain')
PrintWriter out = response.getWriter()