保持用户状态Session

    技术2026-08-24  9

    Session是如何其作用的

    Http本身是无状态协议,不能记录用户的状态,这样从一个客户端发送的多个请求对服务器来说相当于多个客户端发送过来的。为了解决这个问题,我们使用Session来保持用户的状态,Session表示一次回话,容器会为每一个客户端创建一个唯一的sessionId。然后把这个id通过reponse返回给客户端,客户端再次发送请求的时候会在request中携带这个id,以表示是同一个会话通常这个sessionId是放在request的cookie中的。

    创建Session

    先看一小段代码:

    HttpSession session = request.getSession(false); if(session == null){ System.out.println("会话第一次访问"); session = request.getSession(); if(session.isNew()){ System.out.println("第一次创建的会话"); } }

    session本身的创建是有容器完成的,我们只需要获取就好了.request.getSession(false)表示每次都要获取已经存在的session,如果没有则返回Nullrequest.getSession()表示获取一个session,如果存在根据sessionId获取,如果不存在,则创建一个。session.isNew()查看这个session是否是新创建的,即还没有被response返回给客户端过。

    URL重写

    PrintWriter out = response.getWriter(); out.print("<html><body>"); out.print("<a href="" + response.encodeURL("TestUrlRewriting") + "" mce_href="" + response.encodeURL("TestUrlRewriting") + "" ></a>click me</a>"); out.print("</body></html>");

    如果浏览器关闭了cookie之后,原来的sessionId是保存在Cookie中的,所以这个session就没有用了,我们还能使用URL重写的办法来保持会话的状态。使用response.encodeURL能够给链接的最后面加上jsessionid,这样就能够保持状态了。在一个Servlet中还能够使用response.sendRedirect(response.encodeRedirectURL("TestSession"));来在重定向中加入jsessionid这个jsessionid是不能够通过request.getParamter获取的,我们也不能在头中创建这样的变量,实际上jsessionid只能存在于URL的后面或者是Cookie中。

    Session的关键方法

    getCreationTime(),虽然不能手工创建Session,但是能够通过这个方法获得创建的时间setMaxInactiveInterval(秒数 ) 。另外可以使用 <session-config><session-timeout> 分钟数 </session-timeout></session-config> get/setAttribute() invalidate()使Session失效 对于失效的Session再调用isNew()或者是getAttribute等方法的时候会报错。

    Cookie

    Cookie[] cookies = request.getCookies(); for (int i = 0; i < cookies.length; i++) { System.out.println(cookies[i].getName() + ":" + cookies[i].getValue() + ":" + cookies[i].getMaxAge()); } Cookie cookie = new Cookie("username", "123"); response.addCookie(cookie);

     

    Cookie除了能够帮助实现Session之外还有其他的一些用途。Cookie能够保存name/value对儿,在浏览器和服务器之间传递。出了JSESSIONID cookie之外其他的Cookie能够设定为在服务器停止之后任然存在在客户端电脑上。能够通过setMaxAge()方法设置关闭浏览器器之后Cookie存在的时间,可以发现JSESSIONID Cookie的maxage为-1.能够通过response.addCookiezengjiaCookie。

    监听器

    有的时候我们需要监听servelt或者是session的状态,比如在他们创建之前做某些操作,这时我们需要的就是监听器listener。监听器能够监听context和session等的创建,消亡,属性的增加减少等等,不同的操作需要实现不同的结构。主要的接口有ServeltContextListener,ServletContextAttributeListener,HttpSessionListener等等接口。写好类之后还需要在DD中加入配置<listener><listener-class></listener>HttpSessionListener中能够监听创建和消亡HttpSessionAttributeListener能够监听属性的添加、移除和改变,并且其中参数event能够通过event.getName得到变更属性的名称等等信息。
    最新回复(0)