通过在MyEclipse上进行简单测试来得到所需结论,问题发现:
我们知道网页中出现乱码一般是由于服务器默认的编码方式是iso8859-1,所以只需要设置响应头Content-Type的值为text/html;charset=utf-8就可以告诉浏览器发送给它的内容是文本并制定编码方式。但是这行代码可以写在servlet和过滤器两个位置,所以到底哪个位置是最终决定这个响应头的取值,成为我通过理论推导无法得出结论的一个问题。所以我做了如下实验,并得到了想要的结果。
设计方案:
通过jsp页面访问servlet
服务器做出响应发回jsp页面
这个过程被指定过滤器过滤一遍
发送内容为含有中文字符的纯文本
所以有乱码解决方案
在servlet和filter中同时设置
看哪一个会生效
代码块
servlet中的代码如下:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("开始访问servlet:");
//虽然执行在后,然而设置并没有什么用...
response.setContentType("text/html;charset=iso8859-1");
System.out.println("设置响应头,编码集为iso8859-1");
//设置其他响应头完全没有问题
response.setHeader("refresh", "5;url=http://www.baidu.com");
response.getWriter().println("<br/>");
response.getWriter().println("这是servlet输出的一段话:over");
System.out.println("servlet结束");
}
filter的代码如下:
@Override
public void destroy() {
System.out.println("过滤器被销毁了");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
//进入过滤器
System.out.println("进入过滤器:");
//解决输出乱码问题,虽然执行动作在前,但是响应头并不会被servlet中相同的值覆盖
response.setContentType("text/html;charset=utf-8");
System.out.println("设置响应头,编码集为utf-8");
//输出一段话
response.getWriter().println("这是过滤器输出的一段话:over");
//放行
chain.doFilter(request, response);
//过滤后执行的语句
System.out.println("过滤器放行之后");
}
@Override
public void init(FilterConfig filter) throws ServletException
{
System.out.println("过滤器被创建了");
}
输出结果:
控制台:
进入过滤器:
设置响应头,编码集为utf-8
开始访问servlet:
设置响应头,编码集为iso8859-1
servlet结束
过滤器放行之后
页面:
这是过滤器输出的一段话:over
这是servlet输出的一段话:over
并在5秒后成功跳转到百度
实验结论:
servlet响应头与filter响应头之间的关系
1.执行顺序:
页面通过超链接或者src访问服务器资源->
过滤器设置响应头->
过滤器放行->
进入servlet->
servlet跳转回jsp页面->
servlet结束->
一次请求响应(包含一些不属于HTTP内容的工作)完成->
服务器等待下一次请求...
2.设置优先级:
过滤器和servlet都具有设置响应头的功能
但如果设置了相同的响应头,在同一次请求响应过程中
过滤器设置生效,忽略servlet设置的相同响应头
servlet设置的其他不重复响应头不受约束