`

根据sessionid获取session的被Servlet2.1抛弃getsession方法的解决方案

阅读更多

 

 

最近一个项目中用到了getsession根据sessionid来获取session,但是怎么获取都为空,请教N多人,才发现在servlet的api中有如下:

        HttpSession HttpSessionContext.getSession(java.lang.String sessionId) 
      
       不赞成的用法.  Java Servlet API的版本 2.1中,还没有将之替换掉。该方法必须返回一个空值,且将会在未来的版本中被抛弃掉。

       最新的解决办法是通过实现HttpSessionListener的sessionCreated和sessionDestroyed来实现

      解决步骤:
      
      1、在web.xml增加监听:

     <listener>
           <listener-class>com.aceway.util.LoginSessionListener</listener-class>
     </listener>

      2、LoginSessionListener:  
           LoginSessionListener方法实现了HttpSessionListener,并且重写sessionCreated和sessionDestroyed方法
         
          public static Map userMap = new HashMap();                                //创建了一个对象来保存session的
          private   MySessionContext myc=MySessionContext.getInstance();  //MySessionContext是实现session的读取和删除增加  单例模式

         public void sessionCreated(HttpSessionEvent event) 
         {
             myc.AddSession(event.getSession());
         }
         public void sessionDestroyed(HttpSessionEvent event)
        {
        HttpSession session = event.getSession();
        myc.DelSession(session);
        }

     3、session的单例管理

Java代码
package com.aceway.flex;  
import java.util.*;  
import javax.servlet.http.HttpSession;  
public class MySessionContext   
{  
    private static MySessionContext instance;  
    private HashMap mymap;  
    private MySessionContext()  
    {  
        mymap = new HashMap();  
    }  
    public static MySessionContext getInstance()  
    {  
        if(instance==null)  
        {  
            instance = new MySessionContext();  
        }  
        return instance;  
    }  
    public synchronized void AddSession(HttpSession session)  
    {  
        if(session!=null)  
        {  
            mymap.put(session.getId(), session);  
        }  
    }  
    public synchronized void DelSession(HttpSession session)  
    {  
        if(session!=null)  
        {  
            mymap.remove(session.getId());  
        }  
    }  
    public synchronized HttpSession getSession(String session_id)  
    {  
        if(session_id==null)return null;  
        return (HttpSession)mymap.get(session_id);  
    }  
}  
4、这样我们就可以单例来获取session
     private MySessionContext myc=MySessionContext.getInstance();
       HttpSession session = myc.getSession(SessionId);
Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一SessionId提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也会失效。

(又在CSDN上看到,服务器也可以通过URL重写的方式来传递SessionId的值,因此不是完全依赖Cookie。如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,并且这个过程对程序员透明)


可以试一下,即使不写Cookie,在使用request.getCookies();取出的Cookie数组的长度也是1,而这个Cookie的名字就是JSESSIONID,还有一个很长的二进制的字符串,是SessionID的值。

Cookie是客户端的存储空间,由浏览器来维持。
 Java Servlet API 中引用 Session 机制来追踪客户的状态。Servlet API 中定义了 javax.servlet.http.HttpSession 接口,Servlet 容器必须实现这个接口。当一个 Session 开始时,Servlet 容器将创建一个 HttpSession 对象,Servlet 容器为 HttpSession 分配一个唯一标识符,称为 Session ID。Servlet 容器将 Session ID 作为 Cookie 保存在客户的浏览器中。每次客户发出 HTTP 请求时,Servlet 容器可以从 HttpRequest 对象中读取 Session ID,然后根据 Session ID 找到相应的 HttpSession 对象,从而获取客户的状态信息。 
    当客户端浏览器中禁止 Cookie,Servlet 容器无法从客户端浏览器中取得作为 Cookie 的 Session ID,也就无法跟踪客户状态。 
    Java Servlet API 中提出了跟踪 Session 的另一种机制,如果客户端浏览器不支持 Cookie,Servlet 容器可以重写客户请求的 URL,把 Session ID 添加到 URL 信息中。 
    HttpServletResponse 接口提供了重写 URL 的方法:public java.lang.String encodeURL(java.lang.String url) 
   该方法的实现机制为: 
    ● 先判断当前的 Web 组件是否启用 Session,如果没有启用 Session,直接返回参数 url。 
    ● 再判断客户端浏览器是否支持 Cookie,如果支持 Cookie,直接返回参数 url;如果不支持 Cookie,就在参数 url 中加入 Session ID 信息,然后返回修改后的 url。 
    我们可以对网页中的链接稍作修改,解决以上问题: 
    修改前: 
        <a href=“maillogin.jsp“> 
   修改后: 
        <a href=“<%=response.encodeURL(“maillogin.jsp“)%>“>
 
分享到:
评论

相关推荐

    jsp和servlet之中的session详细介绍

    通常,当服务器首次接收到包含session ID的请求,或者首次调用`getSession()`方法且当前没有活动session时,session会被创建。 2. session 何时被删除 session可能在以下情况被删除: - 用户关闭浏览器,浏览器...

    JSP 在servlet中使用session

    在Servlet中,我们可以在`doGet`或`doPost`方法内使用`HttpServletRequest`的`getSession()`方法来创建或获取session。以下是一个简单的示例: ```java protected void doPost(HttpServletRequest request, ...

    servlet中关于session的理解

    ### 关于Servlet中的Session理解 在Web开发领域中,Servlet技术是Java Web开发的重要组成部分,而Session机制则是处理用户会话的关键技术之一。本文将基于提供的文件内容,深入探讨Servlet中Session的工作原理、...

    Servlet实现Session

    在Servlet中,我们可以使用`HttpServletRequest` 的 `getSession()` 方法来创建或获取Session。如果Session不存在,它会新建一个;如果已存在,就返回现有的Session。 4. **存储Session数据** 一旦有了Session...

    Servlet对Cookie和Session的管理源码实例

    Servlet通过`HttpServletRequest`对象的`getSession()`方法获取或创建Session。以下是如何使用Session的示例: ```java // 创建Session HttpSession session = request.getSession(); session.setAttribute(...

    servlet session 购物车

    2. 绑定Session:在用户添加商品到购物车时,我们先检查当前请求是否存在Session(通过HttpServletRequest的getSession方法)。如果不存在,则创建一个新的Session;如果存在,直接获取。然后,我们将购物车对象存入...

    javaweb监听session

    String sessionId = request.getSession().getId(); // 获取当前Session ID HttpSession session = request.getSession(false); // 获取Session,如果不存在则返回null if (session != null) { // Session存在,...

    学习JSP(JBuilder版)——用Servlet实现页面间通信(Session对象)

    在Servlet的处理方法中,我们可以调用`HttpServletRequest`的`getSession()`方法来获取Session对象。如果Session不存在,该方法会创建一个新的Session。接着,我们可以通过`setAttribute(String name, Object value...

    Java Web应用开发 51 课堂案例-应用Servlet读取Session数据.docx

    - `HttpSession`接口:在Servlet中,我们通过`HttpServletRequest`对象的`getSession()`方法来获取`HttpSession`实例,这允许我们存储和检索特定用户会话的数据。 - `getSession(true)`参数:该参数表示如果当前...

    ServletHttpSession DEMO

    - **创建**:当调用`getSession()`方法且当前请求无Session时,服务器会创建一个新Session。 - **活动**:只要用户继续发出请求,服务器就会认为Session是活跃的。 - **钝化**:如果一段时间内(默认30分钟)未收到...

    Session机制详解(jsp-servlet_技术)文.pdf

    开发者可以调用`getSession()`方法来获取或创建一个新的Session,并使用`setAttribute()`和`getAttribute()`来存储和读取Session中的数据。Session的有效期可以通过`setMaxInactiveInterval()`进行设置。 六、...

    birt 使用session数据, 通过servlet访问

    通过HttpServletRequest对象的getSession()方法,你可以获取到当前用户的Session。然后,你可以使用Session的getAttribute()和setAttribute()方法来读取和设置Session中的数据。 举例来说,假设我们有一个"Allinfos...

    Session(实例)

    &lt;servlet-name&gt;SessionServlet&lt;/servlet-name&gt; &lt;servlet-class&gt;com.example.SessionServlet&lt;/servlet-class&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;SessionServlet&lt;/servlet-name&gt; &lt;url-pattern&gt;/...

    session的使用

    浏览器在后续的请求中会携带这个Cookie,服务器根据Session ID找到对应的数据,实现用户状态的跟踪。 **二、Session的使用方法** 1. **通过HttpServletRequest对象获取Session** 在Java Servlet中,我们可以直接...

    数据操作session获取的一个简单实例

    这个ID会被存储在用户的浏览器cookies中,每当用户访问新的页面时,浏览器都会发送这个ID,服务器通过这个ID找到对应用户的Session信息,从而保持用户的状态。 **JSP中的Session使用** 在JSP中,我们可以通过`...

    Session登录在线人

    服务器根据这个ID找到对应的Session数据,从而知道是哪个用户在进行操作。 接下来,我们来看如何实现"Session获取当前在线登录人"的功能: 1. **创建Session**:在用户验证身份成功后,服务器创建一个新的Session...

    session会话管理

    服务器端会根据该 Session ID 找到对应的会话信息,以便实现用户会话的管理。 Session 的 API Session 的 API 主要包括以下几个方面: * `getSession()`: 获取当前用户的会话对象 * `setAttribute()`: 设置会话...

    (转)讲解各种session

    在后续的请求中,浏览器会携带这个Session ID,服务器根据ID找到对应的Session数据,从而识别出是哪个用户。 **Session的工作流程**: 1. 用户访问网站,服务器创建Session并分配Session ID。 2. 服务器将Session ...

    一篇优秀Session讲解

    - **获取Session对象**:可以通过HttpServletRequest对象的getSession()方法获取HttpSession对象。 - **设置Session属性**:使用HttpSession对象的setAttribute(String name, Object value)方法来设置Session属性。 ...

    session存用户名密码实现用户登录和退出

    这时,可以考虑使用Session集群、Session存储到数据库或使用分布式Session解决方案(如Redis、Memcached)。 综上所述,通过Session,我们可以方便地实现用户登录和退出功能,跟踪用户的会话状态。正确管理和使用...

Global site tag (gtag.js) - Google Analytics