- 浏览: 312099 次
文章分类
最新评论
-
luokery:
你把正常的代码放到try里面不就好了, 异常的时候就catch ...
巧用while循环避免执行除了异常处理的的另一个处理机制 -
java_doom:
这个行号根据什么来的 为什么不是连续的?
别拿Hadoop map key当id使 -
mixer_b:
...
写博客的那些事儿 -
flyfx:
谢谢谢谢
java break,continue,return 使用。【借鉴与改编】 -
andilyliao:
比起青鸟 我更鄙视大学。
北大青鸟就让你们这么鄙视吗.
struts2项目中静态html在firefox下乱码的解决
- 博客分类:
- java
struts2 项目,通常开发过程中,一些简单的表单文件或者静态描述页面,能不走action流程就可以用html来做,可以一定程度上减少 struts2 的流程开销,如果前端有apache的话,也可以进一步分摊业务服务器压力。按照这样的原则,一个系统做下来,难免有一些或者很多的静态html文件。
在我的一个工程里面,所有文件的编码格式均为 utf-8,包括这些静态 html 文件。 在 IE 下访问,页面显示完全没有问题。用 httplook 查看 http 头信息,也可以看到服务器回送的页面字符集编码为正常的 utf-8。 但是用 firefox 浏览的时候,所有的动态页面(*.do)正常,唯独 html 页面全部乱码,在浏览器菜单内手动选择页面编码格式为 utf-8,则可以正常显示中文了。虽然可以暂时解决,但不可能假设所有的用户每次浏览这些静态html的时候,都会手动去选择编码格式。这里必须要有一 个治本的办法。
在firefox内乱码的html页面上,右键“查看页面信息”,可以看到http头信息内的编码格式为 gb2312,而页面meta信息内指定的是utf-8。即firefox是按gb2312的缺省行为来解析utf-8编码的页面,当然会乱码。问题就出 在,firefox并不会像IE那样可以根据meta信息覆盖服务器回送的http头信息,它是严格按照http协议规范的行为方式:按照http头指定 的编码格式来解析页面。也就是说,如果http头回送里面指定了页面的编码格式,firefox会忽略meta信息的字符集指定。而IE则以meta优 先。
为什么我的服务器输出html页面的时候,http头会回送gb2312的编码集?我在 web.xml 内加上 SetCharacterEncodingFilter,强制所有输出字符集为 utf-8,问题依旧。因为项目做了 SEO,用到了 UrlRewriterFilter,便怀疑是这个 filter 在做 url forward 的时候,改变了输出字符集,可是去掉这个 filter 后,问题还是存在。 于是再考察struts2的 FilterDispatcher,这是一个全局的派发过滤器,struts2的核心派发控制器。 最初的配置如下:
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
url-pattern 是 /* 的全范围映射,当然也包括了 html 后缀文件。这种情况下,项目中任何一个请求,会经过3次filter,首先是SetCharacterFilter、然后是 UrlRewriterFilter、最后是 FilterDispatcher,之前已经排除了 UrlRewriterFilter 的问题。于是修改 FilterDispatcher 的 url-pattern 为 *.do,即只过滤 *.do 的请求,其他请求比如 *.html,则不会经过这个 filter。
这样修改后,一切都正常了。
当 url-pattern 为 /* 时,所有请求包括对静态资源文件的请求,都会有FilterDispatcher来接管派发。如果请求类型为静态资源,则 FilterDispatcher 不会调用 action 处理模块来接收这个请求,而是简单的回送静态资源。在这个回送过程中,FilterDispatcher 做的工作如下:
FilterDispatcher.java
if (!name.endsWith(".class")) {
for (String pathPrefix : pathPrefixes) {
InputStream is = findInputStream(name, pathPrefix);
if (is != null) {
Calendar cal = Calendar.getInstance();
// check for if-modified-since, prior to any other headers
long ifModifiedSince = 0;
try {
ifModifiedSince = request.getDateHeader("If-Modified-Since");
} catch (Exception e) {
LOG.warn("Invalid If-Modified-Since header value: '" + request.getHeader("If-Modified-Since") + "', ignoring");
}
long lastModifiedMillis = lastModifiedCal.getTimeInMillis();
long now = cal.getTimeInMillis();
cal.add(Calendar.DAY_OF_MONTH, 1);
long expires = cal.getTimeInMillis();
if (ifModifiedSince > 0 && ifModifiedSince <= lastModifiedMillis) {
// not modified, content is not sent - only basic headers and status SC_NOT_MODIFIED
response.setDateHeader("Expires", expires);
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
is.close();
return;
}
// set the content-type header
String contentType = getContentType(name);
if (contentType != null) {
response.setContentType(contentType);
}
if (serveStaticBrowserCache) {
// set heading information for caching static content
response.setDateHeader("Date", now);
response.setDateHeader("Expires", expires);
response.setDateHeader("Retry-After", expires);
response.setHeader("Cache-Control", "public");
response.setDateHeader("Last-Modified", lastModifiedMillis);
} else {
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "-1");
}
try {
copy(is, response.getOutputStream());
} finally {
is.close();
}
return;
}
}
}
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
// ..
protected InputStream findInputStream(String name, String packagePrefix) throws IOException {
String resourcePath;
if (packagePrefix.endsWith("/") && name.startsWith("/")) {
resourcePath = packagePrefix + name.substring(1);
} else {
resourcePath = packagePrefix + name;
}
resourcePath = URLDecoder.decode(resourcePath, encoding);
return ClassLoaderUtil.getResourceAsStream(resourcePath, getClass());
}
可以看到,由 ClassLoaderUtil.getResourceAsStream 载入静态资源,然后回送。ClassLoaderUtil 还是用了 xwork 的 lib,struts2并没有重写这个类。这个回送过程中,FilterDispatcher 并没有指定回送字符集,因此输出页面会采用服务器默认字符集,当然跟具体操作系统也有关系。目前还没看到有默认以UTF-8作为服务器字符集的。
发表评论
-
java如何终止线程
2012-04-24 21:38 1029对于线程的终止或者中断,由于java中Thread.stop方 ... -
ubuntu-11.10-server-i386学习笔记-网络基本配置
2012-04-23 22:11 9911. 静态IP地址配置 配置文件路径:/etc/networ ... -
ubuntu-11.10-server-i386学习笔记-Apache安装
2012-04-23 22:11 794第一步:先更新安装包缓存 1.1 sudo apt-get ... -
ubuntu-11.10-server-i386学习笔记-SVN版本服务器安装
2012-04-23 22:10 1036在安装SVN前,假设你的Apache已经安装好了。 ... -
ubuntu-11.10-server-i386学习笔记-SVN版本服务器-客户端测试
2012-04-23 22:10 705进入客户端测试之前,您应该确保svn服务器已经正确安装,如果您 ... -
svn服务器搭建经验总结
2012-04-23 22:09 948从最近几天的实验来看,svn(Subversion versi ... -
Java根据word模板生成word文档之后台解析和实现及部分代码(二)
2012-04-18 13:59 1861上一节贴出了web应用访问生成报告的action ... -
Java根据word模板生成word文档之后台解析和实现及部分代码(一)
2012-04-18 13:59 2037后台主要工作是解析XML定义的标签文件,并 ... -
单例类、final、抽象类
2012-04-15 23:53 1616前些日子一直没写博客,因为病了,所以就耽误了,现在好点了 ... -
怎样在架构中合理的设置request中的Lcoale
2012-04-15 23:51 1203相信很多朋友在做J2EE国际化的时候,很可能遇到这个问题 ... -
一个Java时间工具类
2012-04-14 21:50 972主要包含了对时间操作的一些工具方法,仅供参考吧! ... -
POI Excel导出,我的又一个模板方法
2012-04-14 21:49 2754下面有源码,下载就可以用,如果因为包的问题,就拷贝我 ... -
Poi 读写Excel 合并ExcelSheet Struts2实现
2012-04-14 21:48 1446网上有许多人在找这样的例子,有多个Excel,要把他们合 ... -
POI读取Excel浅谈
2012-04-14 21:48 829先看代码,挨句解释: 一般遍历使用两种方式,1:得到总 ... -
黑马程序员——Java开发前奏
2012-04-12 23:59 778对于Java,我的一 ... -
《JAVA与模式》之单例模式
2012-04-12 23:58 728在阎宏博士的《JAVA与模式》一书中开头是这样描述单例模 ... -
Java中的String不再纠结
2012-04-12 23:58 1422又是新的一月,又是各种总结,先分享一下java中st ... -
swing绘制了一只直升机
2012-04-12 23:56 3378周末用swing绘制了一只直升机 对swing的的绘制技 ...
相关推荐
在struts2中解决页面中出现的乱码问题,写在web.xml中
Struts2资源文件在jsp页面中显示乱码解决
struts中文乱码问题解决详细步骤(两种方法)
关于StrutsPrepareAndExecuteFilter最新的过滤器,在Struts.xml定义常量<constant name="struts.i18n.encoding" value="UTF-8"/>无法解决post方式提交中文乱码问题。 关于Struts2各个版本、各种过滤器,用get方式...
Struts2乱码解决办法,个人测试有效
struts2中存在中文乱码的问题解决方 中文乱码,首先要区分是页面乱码、action乱码,还是数据库乱码。 大致的原理是java使用unicode编码-->window使用gbk(gb2312的扩展集)--mysql默认使用utf-8(unicode的一种编码...
Struts中文乱码解决方案
struts2中文乱码的解决DEMO,绝对可以运行。
解决中文乱码的问题
struts1.2 解决中文乱码(Java技术)
在Eclipse中配置Struts2项目(html)手把手教会你 如何在Eclipse中配置Struts2。 struts2 标签库介绍(html)对Struts2的标签做了详细的介绍让你轻松掌握Struts2的标签。 STRUTS2学习文档.pdf 对Struts2的一些配置...
ssh2中的urlrewrite和Struts2的生成静态页面
struts2项目部署 适合小白 ,内含jar包 具体步骤请参考http://blog.csdn.net/hsun924/article/details/16847177
一个整个项目的所有代码和截图!内容非常详细,很适合struts2初学者学习哦~
奇怪的struts2的中文乱码问题及解决.docx
解决Struts2.0中文乱码详细方法。
struts乱码解决方法struts乱码解决方法struts乱码解决方法struts乱码解决方法struts乱码解决方法struts乱码解决方法struts乱码解决方法struts乱码解决方法
Struts2下载文件时中文乱码和空格处理
struts2 项目代码及pdf struts2 项目代码及pdf struts2 项目代码及pdf
struts2 项目源码,适合初学者,有需要的下载吧