如何使最简单的servlet过滤器尊重设置的字符编码 [英] How to make simplest servlet filter respect setted character encoding
问题描述
我正在尝试编写最简单的servlet过滤器(并将其部署到tomcat)。这是一个常规代码,但实际上我在这里大量使用java方法,所以它几乎是复制粘贴,这也是我添加java标记的原因。
我的问题是 - 如何插入UTF-8字符串来过滤?
这里是代码:
public class SimpleFilter implements javax.servlet.Filter
{
...
public void doFilter(ServletRequest请求,ServletResponse响应,
FilterChain链)
抛出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响应){
返回新的HttpServletResponseWrapper(响应){
@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应用过滤器,这是我试图放弃整个请求的真正原因。
<$ p $ '
def bytes = saw.getBytes('UTF-8')
def content = new String(bytes, 'UTF-8')
不会改变锯和内容之间的东西。你想要做什么(使用 outputstream 和不是作者,这就是为什么字符集重置为ISO-8859-1 查看tomcat文档):
out.write(saw.getBytes(UTF-8);
你的代码看起来可以将字符集设置为UTF-8。
我不明白你在用HttpResponseWrapper 。
为了说清楚,这将起作用:
public void doFilter(ServletRequest请求,ServletResponse响应,
FilterChain链)
抛出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));
}
It feels like I'm stuck. I'm trying to write the simplest servlet Filter (and deploy it to tomcat). It's a groovy code, but actually I'm heavily using java approaches here, so it is almost copy-paste, that's the reason I've added java tag as well.
My question is - how can I insert UTF-8 string to filter? Here is the code:
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 of the filtered page is text/plain;charset=ISO-8859-1
.
So, content type have changed, but charset is ignored.
As you can see, I've take some measures (I guess quite naive) to make sure content is UTF-8, but none of these steps actually was helpful.
I've also tried to add URIEncoding="UTF-8"
or useBodyEncodingForUri="true"
attributes to
Connector in tomcat conf/server.xml
It would be nice if somebody explained me what I'm doing wrong.
UPD: just a bit of explanation - I'm writing XSLT-applying filter, that is the real reason I'm trying to discard whole request.
def saw = 'АБВГДЕЙКА ЭТО НЕПРОСТАЯ ПЕРЕДАЧА ABCDEFGHIJKLMNOP!!!'
def bytes = saw.getBytes('UTF-8')
def content = new String(bytes, 'UTF-8')
Does not change a thing between saw and content. What you want is to do (using the outputstream and not the writer, this is why the charset is reset to ISO-8859-1 See tomcat doc):
out.write(saw.getBytes("UTF-8);
Your code looks okay to set the charset as UTF-8.
I don't understand what you are doing with HttpResponseWrapper.
To make it clear, this will work:
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"));
}
这篇关于如何使最简单的servlet过滤器尊重设置的字符编码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!