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);
//        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值