Servlet成员字段可能允许一个用户查看其它用户的数据
Servlet成员字段可能允许一个用户查看其它用户的数据
哈莱米修 发表于4年前
Servlet成员字段可能允许一个用户查看其它用户的数据
  • 发表于 4年前
  • 阅读 49
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

摘要: 此博客内容为公司扫描代码时给出的相关解决办法,没看懂,给大家分享一下。。。

       许多Servlet开发人员都不了解Servlet为单例模式。Servlet只有一个实例,并通过使用和重复使用该单例来处理需要由不同线程同时处理的多个请求。

Explanation:

       这种误解的共同结果是,开发者使用Servlet成员字段的这种方式会导致某个用户可能在无意中看到其他用户的数据。换言之,即把用户数据存储在Servlet成员字段中会引发数据访问的 race condition 。

例 1 :以下Servlet把请求参数值存储在成员字段中,然后将参数值返回给响应输出流。

public class GuestBook extends HttpServlet{
		String name;
		protected void doPost(HttpServletRequest req,HttpServletResponse res){
				name = req.getParameter("name");
				....
				out.println(name+",thanks for visiting !");
		}
}

   当该代码在单一用户环境中正常运行时,如果有两个用户几乎同时访问Servlet,可能会导致这两个请求以如下两个方式处理线程的插入:

线程1:assgin "Dick" to name
线程2:assgin "Jane" to name
线程1:print "Jane,thanks for visiting!"
线程2:print "Jane,thanks for visiting!"

   因此会向第一个用户显示第二个用户的用户名。

Recommendations:

           不要为任何参数(常量除外)使用Servlet成员字段。(例如确保所有成员字段都是 static final )。

           当开发者需要把代码内某一部分的数据传输到另一部分时,他们经常使用Servlet成员字段存储用户数据。如果您也是这么做的,可以考虑声明一个单独的类,并仅使用Servlet“封装”这个新类。

public class GuestBook extends HttpServlet{
	protected void doPost(HttpServletRequest req,HttpServletResponse res){
		GBRequestHandler handler = new GBRequestHandler();
			handler.handle(req,res);
	}
}
	
public class GBRequestHandler{
	String name;
	public void handle(HttpServletRequest req,HttpServletResponse res){
			name = req.getParameter("name");
			....
			out.println(name+",thanks for visiting !");
	}
}

   此外,Servlet也可以利用同步代码块来访问Servlet实例变量。但是,使用同步代码块可能会导致严重的性能问题。

   


这还有一个有关  Servlet成员字段可能允许一个用户查看其它用户的数据  的问题?

地址:http://www.oschina.net/question/875838_182662 


标签: Servlet
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 2
博文 2
码字总数 1185
×
哈莱米修
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: