Javaweb-session

session简介:

1,因为http是无连接的,每次访问不知道对方是谁。所以引入Session机制来标识访问者。
2,用户第一次访问JSP,Servlet时,为其创建Session。如果是HTML,image等静态资源不会创建。
3,session是存储在服务器端的,和浏览器端无关。你关闭了浏览器,在session有效期内服务器端会一直保留,除非服务端是有销毁代码,将其销毁。
4,session有效期:因为session是留存在客户端内存的,如果访问的用户越来越多,会导致内存溢出的,所以必须设置一个时间自动销毁。
5,根据JSESSIONID,判断当前用户有没有访问过网站

测试代码:
package com.SessionTest;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

@WebServlet("/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //处理编码问题。
        req.setCharacterEncoding("utf-8");
        //让客户端浏览器知道不同种类的数据。
        resp.setContentType("text/html;charset=utf-8");
        //获取session
        HttpSession session = req.getSession();
        session.setAttribute("name","zhangsan");
        session.setAttribute("age","19");
        String id = session.getId();
        PrintWriter a = resp.getWriter();
        if(session.isNew()){
            a.write("是新的"+id);
            session.setAttribute("time",new Date());
        }else {
            a.write("不是新的" + id);
            a.write("<br>");
            SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String name = (String) session.getAttribute("name");
            a.write(name + "," + "您上次访问时间:");
            String time = simple.format(session.getAttribute("time"));
            session.setAttribute("time",new Date());
            a.write(time);
        }
        a.close();
    }
}

创建流程:

当前用户第一次访问时:
上图代码中HttpSession session = req.getSession();这一句的底层实际是根据JSESSIONID判断。因为是第一次访问没有JSESSIONID,所以新建一个session。
并随response返回给客户端。如下图中Set-Cookie即是后端创建返回。
在这里插入图片描述
当用户第二次访问时:
Cookie中就会携带JSESSIONID。此时后端再执行HttpSession session = req.getSession(); 时,就不需要新创建了。
在这里插入图片描述

补充:对于新手阶段使用session练习获取上次登录的时间,使用上面的isNew()方法判断有时会失效的。

比如:启动tomcat,默认访问页面是index.jsp, 这时就会创建了session,如果再去访问上面的Servlet,isNew()会从第一次就返回假,时间一直取到的是null。所以判断这个session是否是一个有效session,可以解决,如下:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

@WebServlet("/LastLogin")
public class LastLogin extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        //设置编码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = simpleDateFormat.format(date);

        HttpSession session = req.getSession();
        //核心点就是下面这句代码
        String lasttime = (String) session.getAttribute("time");
        if(lasttime != null){
            resp.getWriter().println("您上次访问时间:" + lasttime);
            session.setAttribute("time", time);
        }else {
            resp.getWriter().println("你好,欢迎首次访问");
            session.setAttribute("time", time);
        }

        //使用isNew只能判读当前这个session是否是新建的一个session,所以如果要判断是否是一个有效的session
        //直接使用上面的代码,判断是否是一个有数据的session
//        if(session.isNew()){
//            resp.getWriter().println("你好,欢迎首次访问");
//            session.setAttribute("time", time);
//        }else {
//            resp.getWriter().println("您上次访问时间:" + session.getAttribute("time"));
//            session.setAttribute("time", time);
//        }
    }
}

### JavaWebSession 的使用方法 #### 创建并操作 Session 对象 当客户端首次请求 Web 应用程序时,服务器会创建一个新的 `HttpSession` 实例。可以通过 `HttpServletRequest.getSession()` 方法来获取当前用户的 session 对象。 如果希望强制创建新的 session,则可以调用带参数的方法: ```java // 获取已有的session,如果没有则新建一个 HttpSession session = request.getSession(); // 或者 // 只有在没有现有session的情况下才会创建新session HttpSession newSession = request.getSession(true); ``` 一旦获得了 session 对象之后就可以向其中存储数据了[^1]。 #### 存储和检索属性 为了保存用户特定的信息,在 session 中设置键值对形式的数据非常方便。下面是一个简单的例子展示如何存取这些信息: ```java // 设置名为"user"的属性 session.setAttribute("user", "John Doe"); // 读取名为"user"的属性 String userName = (String) session.getAttribute("user"); if(userName != null){ out.println("Welcome back, " + userName); } ``` 需要注意的是,这里使用的类型转换是因为 getAttribute() 返回 Object 类型的对象[^3]。 #### 跨 Servlet 访问同一 Session 数据 由于同一个浏览器实例下的所有请求共享相同的 session ID,因此可以在不同 servlet 之间传递 session 数据而无需额外处理。只需按照上述方式通过 getSession() 来获得相同 session 即可。 #### 销毁 Session 有两种主要的方式可以让 session 失效:一种是由应用程序显式地结束它;另一种则是依赖于配置好的超时期限自动过期。 - **手动销毁** 要立即终止某个 session 并清除其关联的所有状态信息,可以直接调用 invalidate(): ```java session.invalidate(); // 结束此 HttpSession,并使任何绑定于此对象上的监听器失效 ``` - **自动销毁** 还可以设定最大不活动间隔时间(单位秒),超过该时间段未收到来自客户端的新请求就会认为 session 已经不再活跃从而将其删除: ```java session.setMaxInactiveInterval(60 * 30); // 设定为半小时内无交互即关闭 ``` 此外,默认情况下 Tomcat 容器也会定期扫描所有存活中的 sessions 查找那些已经超过了指定的最大空闲时限但仍处于打开状态的情况,并对其进行清理工作[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值