给一个webwork项目加上cas认证的时候遇到了个常见的问题.乱码!
具体表现是:
1. 表单提交之后,就会出现乱码,数据到action里面的时候已经是乱码,存入数据库也是乱码,
最后在页面显示的时候,当然也是乱码!
2. 对于本来在数据库里面不是乱码的数据,在页面上显示一切正常.
3. 对于url 问号后面的参数,因为我有对这些参数做了编码处理,所以这种类型的参数没有乱码现象.
解决过程以及思路:
1. 由于该项目开始编码的时候,就已经统一了开发环境, 编辑器的编码也都统一为gb2312,页面编码也统一为gb2312;
但是后来新加进了两位开发人员,大家由于比较忙,没有跟新来人员约定好编辑器编码模式. 起初以为是因为编辑器编码不同,导致出现乱码问题,所以去查看了myeclipse对jsp的编码,发现没有任何问题.
2. 由于该项目采用框架是 webwork2.1.6 + hibernate2 ,表单提交的时候用的是model-driven模式,页面上的form提交方式为"post",表单提交后,封装成vo对象时出现了乱码.
这时就怀疑是webwork的 webwork.properties文件的区域和编码设置可能和编码过滤器encodingFilter冲突了,
因为webwork2.1.6 的编码过滤器对于webwork的自动封装不起作用,所以把编码过滤器注释掉,再次运行,结果问题依旧.
于是又反过来,把webwork.properties的编码设置注释掉,甚至webwork.properties的编码设置和编码过滤器同时注释掉,都不能解决问题..但并没有引发其他编码问题,问题依旧是表单提交,webwork把页面数据封装成数据实体的时候出现乱码.
3. 于是上网搜了下资料,无非是修改webwork.properties文件,编码过滤器, 还有就是在tomcat的server.xml文件里面加上URIEncoding="gb2312" 之类的,几乎所有方法都试过,问题还是不能解决.
再也想不出别的方法了,于是决定自己写一个ServletDispatcher,在这里面设置request编码,结果还是问题依旧.(这个方法在事后想了下,发现其实这里做的和编码过滤器做的是一样的,多此一举了)
4. 然后抱着尝试的心态在某个form页面的method改为"get" , 提交后竟然没乱码了..这时候傻眼了,这样得改好多jsp文件..而且get方式没怎么用过,以前的参数传递不知道会不会出问题.
虽然看似问题好像解决了,但是糊里糊涂的,心里总是不踏实,而且如果真得靠这个方法解决的话..也很不甘心.
5. 最后在无意中看了下 web.xml 文件 , 这时候发现问题了, 原来 cas的认证过滤器比字符过滤器先加载了:
<!--cas认证:-->
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--字符过滤器-->
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
根据servlet2.3规范filter执行是按照web.xml配置的filter-mapping先后顺序进行执行,所以上面的配置会导致url请求先进行CASFilter的过滤器处理,这时候没有做编码处理,已经是乱码,到下面的encodingFilter处理时已经时乱码,再做编码处理已经没有用处。
总结:
因为这项目开发进度紧,每次从cvs更新的更新量都挺大,具体更新了些什么内容也没空去看,都只知道加了cas认证,但没有仔细看更新了哪些文件,所以一直忽略了web.xml文件.
大家以后做项目的时候,如果要加cas认证或者是别的安全检验的时候,记得留意这个filter的加载顺序呀!
最后:
感谢周进大虾~~~~~~~~
1 楼
java菜菜鸟
2008-07-30
很好的一个分享.
看来以后还是得编码处理的filter放在配置文件的最前面保险点
看来以后还是得编码处理的filter放在配置文件的最前面保险点
2 楼
EXvision
2008-11-17
学习了,还真是没想到是filter顺序的问题。
谢谢楼主,以后遇到同类型问题,就有个参照了~
谢谢楼主,以后遇到同类型问题,就有个参照了~
3 楼
maysnow
2008-12-11
楼主好文章,我也出现了一模一样的情况。多谢楼主