感觉就像我被卡住了。我正在尝试编写最简单的Servlet过滤器(并将其部署到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) } } } }
过滤后的页面的Content-Type为text/plain;charset=ISO-8859-1。因此,内容类型已更改,但是字符集被忽略。
text/plain;charset=ISO-8859-1
如您所见,我已经采取了一些措施(我想很幼稚)来确保内容为UTF-8,但是这些步骤实际上都没有帮助。
我也尝试在tomcat conf / server.xml中向连接器添加属性URIEncoding="UTF-8"或useBodyEncodingForUri="true"属性
URIEncoding="UTF-8"
useBodyEncodingForUri="true"
如果有人向我解释我做错了,那将是很好的。
UPD: 只是一点解释-我正在编写适用XSLT的过滤器,这就是我试图丢弃整个请求的真正原因。
def saw = 'АБВГДЕЙКА ЭТО НЕПРОСТАЯ ПЕРЕДАЧА ABCDEFGHIJKLMNOP!!!' def bytes = saw.getBytes('UTF-8') def content = new String(bytes, 'UTF-8')
在锯片和内容之间不会发生变化。您想要做的是(使用 outputstream 而 不是writer ,这就是为什么将字符集重置为ISO-8859-1的原因,请参见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")); }