`

Web中三大属性范围的线程安全性分析及处理

阅读更多

     在Servlet中,我们可以将属性(内容)保存到三个基本的属性范围中,即Web应用上下文(Context)、会话(Session)以及请求(Request),以供Web应用中的其他组件在适当的时候获取。 但由于Servlet处于(大部分情况)多线程的环境中,所以对以上属性范围内容的操作也自然存在线程安全的问题。

 

1、先从可访问性、作用域及适用场景三个方面,介绍下三个属性作用域的区别。

 

    1)上下文(ServletContext)

        a)可访问性:Web应用的所有部分,包括Servlet、Jsp、监听器及过滤器等。

        b)作用域:ServletContext的生命期,即部署Web应用的生命期。

        c)适用场景:共享整个Web应用的资源,比如数据库连接、JNDI查找名及Email地址等。

 

    2)会话(HttpSession)

        a)可访问性:访问某个特定会话的所有Servlet或Jsp。

        b)作用域:会话的生命期,即会话未超时或未被撤销。

        c)适用场景:与客户会话有关的资源和数据,通常是针对同一客户的多个请求,它要与客户保持一个持续的会话状态。比如可以用来实现购物车功能等。

 

    3)请求(HttpServletRequest)

        a)可访问性:访问某个特定请求的Servlet、Jsp(通过请求转发)或监听器等。

        b)作用域:某个请求的生命期,即持续到Servlet的service()方法结束。

        c)适用场景:将模型返回的信息(或特定于某个请求的数据)从控制器传递(请求转发)给视图。

 

 2、下面探讨下线程安全性问题。

 

    1)上下文(ServletContex)作用域是线程安全的吗?如何解决?

 

    答:不是。因为上下文作用域共享于整个Web应用。每个请求都在一个单独的线程中处理,则当(同一个或多个用户的)多个请求(在相同或不同的Servlet中)同时操作上下文属性时,就有可能产生问题,以下举例说明。

 

    情况一:同一个Servlet操作相同的上下文属性。

 

    a)假设请求A到达ServletA,容器创建一个新的线程A来处理请求A。请求A在ServletA中设置了上下文属性“account”值为1000,并尝试在service()方法的最后获取并打印该属性“account“的值。我们期望的结果应该是打印出1000。但假如在获取并打印之前,发生了如下情况,结果就有可能出乎预料了。

    b)假设打印“account”之前,另一个新的请求B到达ServletA,容器又创建一个新的线程B来处理请求B。而且线程B的优先级比线程A高,所以容器会让线程B成为活动线程,而将线程A回到可运行的状态。不恰巧的是请求B也是来操作上下文属性“account”的,并把属性值改成了100。

    c)线程B执行完了,线程A也重新成为了活动线程,并继续打印“account”的值。此时将打印出100而不是1000。

    d)说明:如果在线程A打印之前耗费很长时间(如处理复杂的业务逻辑),则更容易出现线程安全问题。

 

     情况二:多个不同的Servlet操作相同的上下文属性。(例子参考情况一)

 

    解决方法:在Servlet的service()方法中同步上下文对象,即对上下文加锁。

synchronzized(getServletContext()){ 
    //设置属性     
   //调用业务逻辑     
   //获取属性值 
}

    

    注意:

        a)必须在处理上下文属性的所有代码中(比如其他Servlet中)对上下文对象进行同步。

        b)对上下文对象本身同步才有效,而直接同步service()方法是无效的(原因参考上述说明)。

 

    2)会话(HttpSession)作用域是线程安全的吗?如何解决?

 

    答:也不是。我们知道会话是用来维护服务器与某个客户的持续会话状态的。正常来说,一个客户一次只发送一个请求的话,那么任何给定时刻,在会话中一次也只有一个线程运行,这样看上去是线程安全的。不过,如果一个客户同时发送了多个请求(比如新建了多个浏览器窗口)呢?此时在一个会话中,就可能有多个线程运行,也就可能产生线程安全问题。

   

    解决方法:和上下文类似,在Servlet的service()方法中同步会话对象,即对会话对象加锁。

HttpSession session=request.getSession();
synchronzized(session){ 
    //设置属性     
   //调用业务逻辑     
   //获取属性值 
}

 

    注意(和处理上下文属性类似):

        a)必须在处理会话属性的所有代码中(比如其他Servlet中)对会话对象进行同步。

        b)对会话对象本身同步才有效,而直接同步service()方法是无效的。

 

     3)请求(HttpServletRequest)作用域是线程安全的吗?如何解决?

 

     答:是。我们知道请求作用域只与某个特定的请求相关,所以一个请求一次只会在一个单独的线程中运行,也就不存在线程安全性的问题了。

 

 

分享到:
评论

相关推荐

    [完整][中文][WEB安全测试].(美)霍普.扫描版.pdf

    本书中的秘诀演示了开发和测试人员在进行单元测试、回归测试或探索性测试的同时,如何去检查最常见的Web安全问题。与即兴的安全评估不同的是,这些秘诀是可重复的、简洁的、系统的——可以完美地集成到你的常规测试...

    WEB安全测试

    1.4 Web应用安全测试 25 1.5 方法才是重点 26 第2章 安装免费工具 29 2.1 安装Firefox 29 2.2 安装Firefox扩展 30 2.3 安装Firebug 31 2.4 安装OWASP的WebScarab 32 2.5 在Windows上安装Perl及其软件包 33 2.6 在...

    COM与COM+从入门到精通(pdf版本,含源码)

    编制基于角色的安全性 处理COM+事务 控制事务结果 指定事务属性 确定事务情境 传递接口指针 共享状态 建立事务性COM+组件 小结 第13章 用VB建立COM+组件 了解事务 事务与多层应用程序 COM+与事务 ...

    Java清华教程.rar

    Java语言的发展及相关技术的介绍,Java技术和平台在网络计算及电子商务中的应用介绍;  ■ Java语言的基础知识:Java语言的主要特点,设计思想,Java虚拟机,垃圾回收机制,安全性的保证机制;  ■ Java语言的...

    超级有影响力霸气的Java面试题大全文档

    HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...

    NTKO附件管理控件

    ★ 支持智能提交 控件使用我们独创的智能提交技术,支持将附件文件和开发者指定的FORM中的数据一次性上传到服务器。 ★ 多线程上传下载,性能更高 控件完全采用多线程方式上传下载,可以更好的改善用户体验,达到更...

    JAVA-SSH面试题

    struts1.2 Action是单例模式的并且必须是线程安全的,因为仅有一个Action的实例来处理所有的请求。 单例策略限制了Struts1.2 Action能做的事情,并且开发时特别小心。Action资源必须是线程安全的或同步的。 struts...

    C#源码大集合 02(共3卷)

    │ ├─第10部分 安全性 │ │ ├─第51讲 聊天室扩展之一ChatClient │ │ ├─第51讲 聊天室扩展之一ChatServer │ │ └─第51讲 聊天室扩展之一Login_WebService │ └─第11部分 其它高级论题 │ ├─...

    中美 IT 培训 C# Asp.net 笔记2

    详细地讲授Web Service及其应用和相关的安全性问题、WSE(Web Services Enhancements)、SOAP、WSDL、UDDI、Windows Service、VSS(Visual Source Safe)。讲授用户控件和第三方控件的开发和使用。学习HTML、XML、...

    asp.net知识库

    在ASP.NET页面中推荐使用覆写(Override)而不是事件处理(Event Handler) 常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试 在C#里把ArrayList转换为Array 或 把Array转换为ArrayList C# 2.0 在.NET 2.0中...

    java 面试题 总结

    HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...

    中美 IT 培训 C# Asp.net 全套笔记1

    详细地讲授Web Service及其应用和相关的安全性问题、WSE(Web Services Enhancements)、SOAP、WSDL、UDDI、Windows Service、VSS(Visual Source Safe)。讲授用户控件和第三方控件的开发和使用。学习HTML、XML、...

    Struts1与Struts2本质区别

    2 线程模式方面的对比:Struts 1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts 1 Action能做的事,并且要在开发时特别小心。Action资源必须是线程安全的...

    中美 IT 培训 C# Asp.net 笔记3

    详细地讲授Web Service及其应用和相关的安全性问题、WSE(Web Services Enhancements)、SOAP、WSDL、UDDI、Windows Service、VSS(Visual Source Safe)。讲授用户控件和第三方控件的开发和使用。学习HTML、XML、...

    Python Cookbook

    17.5 在多线程环境中使用SWIG生成的模块 603 17.6 用PySequence_Fast将Python序列转为 C数组 604 17.7 用迭代器逐个访问Python序列的元素 608 17.8 从Python可调用的C函数中返回None 611 17.9 用gdb调试动态载入...

    API之网络函数---整理网络函数及功能

    其中包括文件、文件映射、进程、线程、安全和同步对象等 CompareFileTime 对比两个文件的时间 CopyFile 复制文件 CreateDirectory 创建一个新目录 CreateFile 打开和创建文件、管道、邮槽、通信服务、设备以及...

    gsoap 2.8 (SOAP/XML 关于C/C++ 语言的自动化实现工具内附 CSharp webservice例子,及GSOAP client和server例子)

    绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户必须改变程序结构来适应相关的类库。与之相反,gSOAP利用编译器技术提供了一组透明化的SOAP API,并将与开发无关的SOAP实现...

    值类型与引用类型理论内容.part01.rar

    详细地讲授Web Service及其应用和相关的安全性问题、WSE(Web Services Enhancements)、SOAP、WSDL、UDDI、Windows Service、VSS(Visual Source Safe)。讲授用户控件和第三方控件的开发和使用。学习HTML、XML、...

    值类型与引用类型理论内容.part05.rar

    详细地讲授Web Service及其应用和相关的安全性问题、WSE(Web Services Enhancements)、SOAP、WSDL、UDDI、Windows Service、VSS(Visual Source Safe)。讲授用户控件和第三方控件的开发和使用。学习HTML、XML、...

Global site tag (gtag.js) - Google Analytics