【Servlet】Servlet的线程不安全问题/Session


Servlet的线程不安全问题:

   造成的根本原因是:Servlet是单例的,Servlet中的非static的成员变量只有一份,多个客户端好比是多个线程,都访问的是同一个空间.

解决方案:

         1:让当前Servlet实现javax.servlet.SingleThreadModel接口.

           包装只有一个线程放Servlet,如果有多个线程就排队,如此的话,性能超低(已过时).

         2:在Servlet中不要使用成员变量,使用局部变量.

           每一个用户,每一个请求都会调用service方法,而局部变量在service方法中,每一次都是新的空间.

------------------------------------------------------------------------------------

Struts1,Spring MVC都是线程不安全的,都是单例的和Servlet类似.

Struts2是线程安全的,因为每一个线程(请求)都是一个新的Action对象.

-----------------------------------------------------------------------------------------------------------

Session的操作:

1:创建和获取Session对象.

  HttpSession session = request.getSession(true);如果当前请求中存在一个Session对象,就直接返回,如果不存在Session对象,就先创建一个再返回.

  HttpSession session = request.getSession(false);如果当前请求中存在一个Session对象,就直接返回,如果不存在Session对象,就返回null.

  HttpSession session = request.getSession();等价于HttpSession session = request.getSession(true);

2:往Session中存储数据.

  session对象.setAttribute(String name,Object value);

3:从Session中取出数据.

  Object value = session对象.getAttribute(String key);

4:删除Session(用户注销登陆).

     1):删除Session中指定属性名的值.

        session对象.removeAttrbute("currentName");

     2):销毁Session对象(Session中所有的属性都不存在).

        session对象.invalidate();

5.Session的超时管理

  在超时时间之内,如果客户端和服务端没有交互(用户的两次操作之间不能超过该时间),则自动的销毁Session.

  session对象.setMaxInactiveInterval(60 * 10);//超过10分钟,销毁Session.

  Tomcat服务器的默认超时时间为:30分钟,Tomcat一般在20多分钟就销毁了.

6.URL重写.

   Session是一种特殊的Cookie,而浏览器可以禁用Cookie.

   此时,需要在每一个资源之后,手动的携带session的ID.

   /session/list;jsessionid=872870F9466CE7B3A11FD3B768FDD684

     String url = response.encodeURL("/session/list");自动的在资源之后拼接;jsessionid=872870F9466CE7B3A11FD3B768FDD684

   注意:开发中都不会取消接受Cookie的.

Session的细节:

   1:一般的,我们存储到Session中的属性名称,要唯一,我们习惯XXX_IN_SESSION:

     session对象.setAttribute("USER_IN_SESSION","will");

   2:若需要把多个数据存放到Session中,就得调用setAttribute方法N次,可以的.

     一般的,我们把需要存储的数据,封装成一个对象,然后在存储到Session中.

     把用户的信息,封装到user对象.

     session对象.setAttribute("USER_IN_SESSION",user对象);

   3:如果多台服务器之间需要共享Session,此时Session中的对象,必须实现java.io.Serializable(才能在网络上传输).

      序 列 化: 把对象信息存储为二进制.

      反序列化: 把二进制信息恢复成对象.

   public class User implements java.io.Serializable{....}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM