Servlet 中的 HttpSession 接口

原文:https://www . geesforgeks . org/the-https session-interface-in-servlet/

什么是会话?

在网络术语中,会话只是两个系统相互通信的有限时间间隔。这两个系统可以共享客户端-服务器或对等关系。然而,在 Http 协议中,通信的状态不被维护。因此,使用 http 协议的 web 应用程序使用几种不同的技术,包括会话跟踪,这意味着维护用户的状态(数据),以便识别他/她。

为了在 servlets 中实现会话跟踪,cookies 已经成为最常用的技术之一。但是,它们有以下缺点:

  • 他们只能保留文本信息。
  • 它们依赖于浏览器。因此,如果客户端禁用它们,您的 web 应用程序就不能使用它们
  • 单个 cookie 包含的信息不能超过 4kb

如何在 java servlet 中为每个用户创建具有唯一会话 id 的会话

为此,servlets 提供了一个名为‘httpessioninterface’的接口。下图解释了 Http 会话在 servlets 中的工作方式:

httpersvlet 界面中的方法

| 方法 | 描述 | | public HttpSession getSession() | 获取 HttpSession 对象。如果请求没有与之关联的会话,则会创建一个新会话 | | public http session get session(boolean create) | 获取与请求关联的会话。如果还不存在,则根据传递给它的布尔参数的值创建一个新的 | | public String getId() | 返回唯一的会话 id | | 公共长 getCreationTime() | 它返回创建此会话的时间,从 1970 年 1 月 1 日午夜开始以毫秒为单位。 | | public long getlastaccessedtime() | 它返回上次访问此会话的时间,以毫秒为单位,自 1970 年 1 月 1 日午夜开始计算。 | | public long getlastaccessedtime() | 它返回上次访问此会话的时间,以毫秒为单位,自 1970 年 1 月 1 日午夜开始计算。 | | 公共作废无效() | 使会话无效 |

Servlet 中 Http 会话的优势

  • 任何类型的对象都可以存储到一个会话中,可以是文本、数据库、数据集等。
  • 会话的使用不依赖于客户端的浏览器。
  • 会话是安全和透明的

Http 会话的缺点

  • 由于会话对象存储在服务器上而导致的性能开销
  • 数据序列化和反序列化导致的开销

使用 HttpServlet 接口进行会话跟踪的示例:在下面的示例中,HttpSession 接口的 setAttribute()和 getAttribute()方法用于在一个 Servlet 的会话范围内创建一个属性,并从另一个 servlet 的会话范围内获取该属性。

  • index.htmlT3

    java <html> <head> <body> <form action="servlet1">   Name:<input type="text" name="userName"/><br/>   <input type="submit" value="submit"/>   </form>   </body> </html>

    T4】 * First.javaT3

    ```java // The first servlet import java.io.; import javax.servlet.; import javax.servlet.http.*;

    < div class = "noIdeBtnDiv" > public class First extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)     {         try { /Declaration of the get method/

    response.setContentType("text/html"); // Setting the content type to text             PrintWriter out = response.getWriter();

    String n = request.getParameter("userName"); /Fetching the contents of                                                  the userName field from the form/             out.print("Welcome " + n); // Printing the username

    HttpSession session = request.getSession(); / Creating a new session/

    session.setAttribute("uname", n);             /Setting a variable uname                                  containing the value as the fetched                                   username as an attribute of the session                                  which will be shared among different servlets                                  of the application/

    out.print("visit"); // Link to the second servlet

    out.close();         }         catch (Exception e) {             System.out.println(e);         }     } } ```

    T4】 * Second.javaT3

    ```java // The second servlet import java.io.; import javax.servlet.; import javax.servlet.http.*;

    public class SecondServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) try {         /Declaration of the get method/         response.setContentType("text/html");         PrintWriter out = response.getWriter();

    HttpSession session = request.getSession(false);         /Resuming the session created                                          in the previous servlet using                                          the same method that was used                                         to create the session.                                          The boolean parameter 'false'                                         has been passed so that a new session                                         is not created since the session already                                         exists/

    String n = (String)session.getAttribute("uname");         out.print("Hello " + n);

    out.close();     }     catch (Exception e) {         System.out.println(e);     } } } ```

    T4】 * web.xml

    ```java   

       s1   First     

       s1   /servlet1     

       s2   Second     

       s2   /servlet2     

       ```

输出:

  • index.html:

  • Servlet1:

  • Servlet2: