【JavaWeb】Session与Cookie详解【附源码】

一、Cookie

1.什么是Cookie?

Cookie是一种会话技术,它用于将会话过程中的数据保存到客户端的浏览器中,从而使浏览器和服务器可以更好的进行数据交互。

会话是指一个终端用户与交互系统进行通讯的过程。(百度百科)
有状态会话:浏览器发送的每一次请求,每一个会话都要有唯一的标识来唯一标识自己,当浏览器发送请求的时候就带上这个标识来让服务器识别,从而实现有“状态”的会话。
会话的4个步骤:建立tcp连接—>发出请求文档—>发出响应文档—>释放tcp连接

就是在浏览器访问Web服务器时,服务器会给浏览器发送一些信息,这些信息都保存在Cookie中。当浏览器再次访问服务器时,都会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确的响应。
在这里插入图片描述

2.Cookie API

Servlet API中提供了javax.servlet.http.Cookie类,用于封装Cookie信息和提取Cookie信息各个属性的setter/getter方法。
在这里插入图片描述

3.显示客户上次访问时间

public class CookieServlet01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //只针对POST方式可以防止乱码,而对GET方式无效
//        req.setCharacterEncoding("utf-8");
//        resp.setCharacterEncoding("utf-8");
        //设置浏览器界面的显示编码格式
        resp.setContentType("text/html;charset=utf-8");
        //接收获取全部的来自客户端的Cookie,并将这些cookie存放在数组中
        Cookie[] cookies = req.getCookies();
        long time;//当前系统时间
        if(cookies!=null){
            resp.getWriter().print("你上次访问是:");
            for(int i=0;i<cookies.length;i++){
                //遍历获取到的cookie
                Cookie cookie = cookies[i];
                if (cookie.getName().equals("lastAccess")){
                    long parseLong = Long.parseLong(cookie.getValue());
                    Date date = new Date(parseLong);
                    //解析:字符串—>日期,调用parse()方法
                    //格式化:日期—>字符串,调用构造器SimpleDateFormat
                    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:s");
                    time = System.currentTimeMillis();
                    String s2 = sdf1.format(date);
                    resp.getWriter().print(s2);
                    resp.getWriter().print("当前系统时间是:"+sdf1.format(time));
                }
            }
        }else {
            resp.getWriter().print("这是你首次访问");
        }
        Cookie cookie = new Cookie("lastAccess", System.currentTimeMillis()+"");
        cookie.setMaxAge(1*24*60*60);//设置cookie的时间
        resp.addCookie(cookie);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

web.xml

<servlet>
    <servlet-name>CookieServlet</servlet-name>
    <servlet-class>com.jd.cookie.CookieServlet01</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>CookieServlet</servlet-name>
    <url-pattern>/cookie</url-pattern>
</servlet-mapping>

将项目部署到tomcat中,然后运行,若不设置 resp.setContentType(“text/html;charset=utf-8”),则浏览器页面可能乱码如下:
在这里插入图片描述
Chrome浏览器具有很强的缓存功能,建议使用别的浏览器访问(此处使用IE),第一次访问:
在这里插入图片描述
刷新浏览器,可以看到Cookie记录下的上次访问的时间,以及当前系统的时间。
在这里插入图片描述
频繁刷新,可以看到上次访问的时间和当前系统时间趋于一致。
在这里插入图片描述

二、Session

1.什么是Session?

Session就是一种将会话数据保存到服务端的技术。
Session使用场景:
客户登录信息、购物车信息、在访问网站中经常用到的数据。
在这里插入图片描述

2.Cookie API

在HttpServletRequest接口中定义了用于获取Session对象的getSession()方法,如下:

HttpSession getSession(boolean var1);
HttpSession getSession();

由于客户端需要接收、记录和回送Session对象的ID,通常情况下,Session是借助Cookie技术来传递ID属性的。与Session相关的属性和方法都定义在HttpSession接口中。
在这里插入图片描述
HttpSession接口中的常见方法:
在这里插入图片描述

3.显示访问网站的ID

(1)显示访问网站的Session的ID

public class SessionServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        req.setCharacterEncoding("utf-8");
        //获取session
        HttpSession session = req.getSession();
        //在session中存储信息
        //session.setAttribute("username","小王");//可以存储字符串,也可以存储对象
        session.setAttribute("Person",new Person("小王",19));
        if(session.isNew()){
            resp.getWriter().print("session是新创建的...");
        }else{
            //获取当前的session
            resp.getWriter().print("session已经存在,名称是:"+session.getId());
        }
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

web.xml

<servlet>
    <servlet-name>SessionServlet</servlet-name>
    <servlet-class>com.jd.session.SessionServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>SessionServlet</servlet-name>
    <url-pattern>/s</url-pattern>
</servlet-mapping>
<!--设置session的过期时间-->
<session-config>
    <!--设置session过期的时间,以分钟为单位-->
    <session-timeout>1</session-timeout>
</session-config>

将项目部署到tomcat服务器上,启动服务:首次访问,Session开始被创建
在这里插入图片描述
刷新浏览器,发现session已经存在
在这里插入图片描述
(2)获取为当前session设置的属性

public class SessionServlet01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //在获取输出流之前调用
        //设置服务器的输出编码位utf-8
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //在获取请求参数之前调用,设置字符集
        req.setCharacterEncoding("utf-8");
        //获取session
        HttpSession session = req.getSession();
        //取出存在session中的信息
        Object person = session.getAttribute("Person");
        //输出到浏览器界面
        resp.getWriter().print(person.toString());
        //输出到控制台
        System.out.println(person.toString());
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

Person.java

//此处只是为了演示可以为Session设置对象,所以没有设置setter/getter方法
public class Person {
    String name;
    int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

web.xml

<servlet>
    <servlet-name>SessionServlet01</servlet-name>
    <servlet-class>com.jd.session.SessionServlet01</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>SessionServlet01</servlet-name>
    <url-pattern>/s1</url-pattern>
</servlet-mapping>

先访问SessionServlet为Session属性赋值,并获取当前的Session的ID
SessionServlet01
再访问SessionServlet01获取设置的属性
在这里插入图片描述
(3)手动清空指定名称的属性

public class SessionServlet02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        req.setCharacterEncoding("utf-8");
        //获取session
        HttpSession session = req.getSession();
        //手动清除session
        session.removeAttribute("Person");
        Person person = (Person) session.getAttribute("Person");
        //再次获取时会找不到,报空指针异常,说明已经清空了sesion设置的属性
        resp.getWriter().print(person.toString());
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

web.xml

<servlet>
    <servlet-name>SessionServlet02</servlet-name>
    <servlet-class>com.jd.session.SessionServlet02</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>SessionServlet02</servlet-name>
    <url-pattern>/s2</url-pattern>
</servlet-mapping>

先访问SessionServlet设置属性,然后访问SessionServlet01获取属性
在这里插入图片描述
访问SessionServlet02清空设置的属性,看到设置的Session属性已经被清空。
在这里插入图片描述
(4)手动注销Session

public class SessionServlet03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        req.setCharacterEncoding("utf-8");
        //获取session
        HttpSession session = req.getSession();
        //手动清除session
        session.removeAttribute("Person");
        //手动注销session
        session.invalidate();
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

web.xml

<servlet>
    <servlet-name>SessionServlet03</servlet-name>
    <servlet-class>com.jd.session.SessionServlet03</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>SessionServlet03</servlet-name>
    <url-pattern>/s3</url-pattern>
</servlet-mapping>

访问SessionServlet,频繁刷新,可以看到sesion的名称一分钟内不会变化。
在这里插入图片描述
访问SessionServlet03,看到Session已经已经失效。
在这里插入图片描述

三、Cookie和Session区别

1、session 在服务器端,cookie 在客户端(浏览器)
2、session 默认被存在在服务器的一个文件里(不是内存)
3、session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
4、session 可以放在 文件、数据库、或内存中都可以。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JavaWeb 中,可以使用 Cookie 来跟踪用户的 Session 信息。 首先,在服务器端创建一个 Session 对象,可以使用以下代码: ```java HttpSession session = request.getSession(true); ``` 这个方法会检查请求中是否包含了一个 Session ID,如果没有,就会创建一个新的 Session 对象,并返回一个包含 Session ID 的 Cookie。如果已经存在 Session ID,就会返回对应的 Session 对象。 接下来,我们可以将需要保存的数据存储在 Session 对象中: ```java session.setAttribute("username", "John"); ``` 这里将一个名为 username 的属性设置为 John。 最后,将 Session ID 返回给客户端,可以使用以下代码: ```java Cookie cookie = new Cookie("sessionId", session.getId()); response.addCookie(cookie); ``` 这里创建一个名为 sessionId 的 Cookie,并将 Session ID 设置为其值,最后将 Cookie 添加到响应中。 当客户端发送请求时,服务器会读取 Cookie 中的 Session ID,然后从服务器Session 中获取对应的数据。可以使用以下代码来读取 Session 中的数据: ```java HttpSession session = request.getSession(false); String username = (String) session.getAttribute("username"); ``` 这里将获取名为 username 的属性的值,如果 Session 不存在,就返回 null。 注意,将敏感数据保存在 Cookie 中是不安全的,因为 Cookie 可以被窃取或篡改。因此,建议对敏感数据进行加密或使用其他更安全的方式进行保存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智商三岁半i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值