filter是否有线程安全的问题

s_h_o_w_i_c_y 2011-02-27 08:58:29
如中文编码filter,设置全部变量charset ,然后init里面读取web.xml的配置进行设置,如果在doFilter()里面对charset进行修改,这样是否就存在线程安全的问题??
...全文
411 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
[Quote=引用 3 楼 s_h_o_w_i_c_y 的回复:]
这样一个请求如http://ip:port/path?charset=GB2312就把全局变量charset设为GB2312。

而之后另外个请求http://ip:port/path的编码是否就变为GB2312
[/Quote]

会的。

如果只是想针对单独请求的话,可以在 doFilter 中这样:

String c = charset;
if(request.getParamert("charset") != null){
c = request.getParamert("charset");
}

Filter 是在 Servlet 容器启动时就初始化的,因此可以认为是以单例对象存在的,如果一个请求线程对其中的成员变量修改的话,会影响到其他的请求线程,因此认为是多线程不安全的。
回复
超蝈儿 2011-02-27
[Quote=引用 3 楼 s_h_o_w_i_c_y 的回复:]
引用 2 楼 zhuchao_ko 的回复:
引用楼主 s_h_o_w_i_c_y 的回复:
如中文编码filter,设置全部变量charset ,然后init里面读取web.xml的配置进行设置,如果在doFilter()里面对charset进行修改,这样是否就存在线程安全的问题??


WEB.XML是每次启动的时候容器加载的,话说你改了WEB.XML的内容要生效是不是要重新启动下容……
[/Quote]

你要修改的是成员变量那会造成线程安全问题。
回复
s_h_o_w_i_c_y 2011-02-27
[Quote=引用 2 楼 zhuchao_ko 的回复:]
引用楼主 s_h_o_w_i_c_y 的回复:
如中文编码filter,设置全部变量charset ,然后init里面读取web.xml的配置进行设置,如果在doFilter()里面对charset进行修改,这样是否就存在线程安全的问题??


WEB.XML是每次启动的时候容器加载的,话说你改了WEB.XML的内容要生效是不是要重新启动下容器呢?
[/Quote]

没说改web.xml啊。就是说比如在doFilter里面这么一句:


if(request.getParamert("charset")!=null){
charset = "GB2312";
}
(web.xml配的可能为utf-8)

这样一个请求如http://ip:port/path?charset=GB2312就把全局变量charset设为GB2312。

而之后另外个请求http://ip:port/path的编码是否就变为GB2312
回复
超蝈儿 2011-02-27
[Quote=引用楼主 s_h_o_w_i_c_y 的回复:]
如中文编码filter,设置全部变量charset ,然后init里面读取web.xml的配置进行设置,如果在doFilter()里面对charset进行修改,这样是否就存在线程安全的问题??
[/Quote]

WEB.XML是每次启动的时候容器加载的,话说你改了WEB.XML的内容要生效是不是要重新启动下容器呢?
回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2011-02-27 08:58
社区公告
暂无公告