一篇文章带你了解Java简单的Cookie与Seesion(Cookie饼干?)。 -JavaWeb篇

写在前面:我是一个普通专科大一学生自学了4个多月Java,JavaWeb也快到达了末端了,3月初开始了博客之路,由于时间更新的比较少,但是最近我的文章:一篇文章认识4种Java多线程的创建方式HTML基础标签 -javaweb 还有 学习听说要过时的JSP技术内容 -JavaWeb篇 帮助我访客破了2000,很开心,谢谢各位的浏览与点赞,是我学习的动力!
在看这篇文章前:需要懂得Servlet的使用:JavaWeb——Servlet(全网最详细教程包括Servlet源码分析)
感谢关注,我的公众号: 小白编码若你喜欢可以给我点赞支持!谢谢各位。

Cookie与Session:

首先Cookie和Seesion可以用来会话控制,Cookie是在客户端使用,而Session是在服务端使用,由于HTTP协议是一种无状态协议,单方面的请求,服务端无法知道下一次的请求来自哪里(就比如你去咖啡店叫服务员来一杯咖啡,第二次再叫服务员来杯水,此时的服务员并不知道是同一个人发出的请求。这时候就需要给服务员加点印象)有了Cookie和Session一起的时候,服务器就能够知道客户端的具体来自哪里的请求。(成功让服务员知道是同一个人发出的请求)

Cookie篇:

Cookie介绍:

Cookie的英文意思是饼干,但是这不是Cookie存在的真正本意。那么Cookie是什么:

  • 平时在浏览器中,登陆的账户信息,记住登陆的选项,都是可以用Cookie完成的。
  • Cookie 是服务器通知客户端保存键值对的一种技术。
  • 客户端有了Cookie 后,每次请求都发送给服务器。
  • 每个Cookie 的大小不能超过4kb
  • Cookie记录和分析用户在浏览器的行为。

Cookie的生命:

  • 会话型Cookie:在客户端关闭时,Cookie会被摧毁
  • 永久性Cookie:这时候的Cookie不会被酷虎端的关闭而摧毁,而是在指定的时间后被摧毁

如何使用Cookie?(java代码演示)

1.创建Cookie

在服务器中创建Cookie,并且通知web端保存Cookie。通过响应头Set-Cookie通知保存Cookie对象。(若当前Cookie存在,即修改Cookie的Value值。

Java创建Cookie方式:

​ 1 创建Cookie 对象

​ 2.通知客户端保存Cookie

​ 3.通知客户端保存

Java代码演示:

public class TestCookieServlet extends BaseServlet {
//1.创建Cookie
    protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//        1 创建Cookie 对象
        Cookie cookie = new Cookie("key1", "value1");
//	      2.通知客户端保存Cookie
//	      3.通知客户端保存
        resp.addCookie(cookie);
        resp.getWriter().write("Cookie成功创建");//显示到测试的Html页面里
    }

html测试:(html代码部分在下方)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jqde7EWS-1587656943201)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200423234105396.png)]

2.服务器获取Cookie(获取指定Cookie)

​ 只需要:req.getCookies():Cookie[]

Java代码部分:

//2.服务器获取Cookie
    protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //获得Cookie数组
        Cookie[] cookies = req.getCookies();
        //遍历Cookie
        for (Cookie cookie : cookies) {
            //getName返回Cookie的key
            //getValue返回Cookie的Value
            //写到内嵌页面
            resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "] <br/>");
        }
    }

Html结果演示:

在这里插入图片描述

3.Cookie的修改

方案一:(只演示此方式)
1、先创建一个要修改的同名(指的就是key)的Cookie 对象
2、在构造器,同时赋于新的Cookie 值。
3、调用response.addCookie( Cookie );

方案二:

​ 1、先查找到需要修改的Cookie 对象
​ 2、调用setValue()方法赋于新的Cookie 值。
​ 3、调用response.addCookie()通知客户端保存修改

Java代码:

   //3.Cookie的修改
    protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws IOException {

//        1、先创建一个要修改的同名(指的就是key)的Cookie 对象
//        2、在构造器,同时赋于新的Cookie 值。
        Cookie cookie = new Cookie("key1","updateVuale");
//        3、调用response.addCookie( Cookie );
        resp.addCookie(cookie);
        if (cookie != null) {
            //通知客户端保存Cokkie
            resp.getWriter().write("修改了指定的cookie");
        }
    }

Html部分:

在这里插入图片描述

4.Cookie 生命控制(只演示代码)

​ 控制Cookie的摧毁方式

​ setMaxAge()
​ 正数,表示在指定的秒数后过期
​ 负数,表示浏览器一关,Cookie 就会被删除(默认值是-1)
​ 零,表示马上删除Cookie

生命控制代码:

//Cookie的生命控制
    @Test
    public void Cookielive(){
        Cookie cookie = new Cookie("life3600", "life3600");
//        正数,表示在指定的秒数后过期
        cookie.setMaxAge(60 * 60); // 设置Cookie 一小时之后被删除。
//        负数,表示浏览器一关,Cookie 就会被删除(默认值是-1)
        cookie.setMaxAge(-1);
//        零,表示马上删除Cookie
        cookie.setMaxAge(0);

Seesion篇:

什么是Session ?

  • Session 就一个接口(HttpSession)。
  • Session 的出现是为了弥补Http的无状态特性。
  • Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。
  • 每个客户端都有自己的一个Session 会话。
  • Session 会话中,我们经常用来保存用户登录之后的信息。

Seesion的缺点:

  • Session变量和cookies是同一类型的。如果某用户将浏览器设置为不兼容任何cookie,那么该用户就无法使用这个Session变量

  • 当一个用户访问某页面时,每个Session变量的运行环境便自动生成,这些Session变量可在用户离开该页面后仍保留20分钟!(事实上,这些变量一直可保留至“timeout”。“timeout”的时间长短由Web服务器管理员设定。一些站点上的变量仅维持了3分钟,一些则为10分钟,还有一些则保留至默认值20分钟。)所以,如果在Session中置入了较大的对象(如ADO

    recordsets,connections, 等等),那就有麻烦了!随着站点访问量的增大,服务器将会因此而无法正常运行!

来源:苏州城外的微笑 https://www.bbsmax.com/A/QV5Z1qKZJy/

Session与浏览器关联的内部技术:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cawg4TI0-1587660024878)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200424003111319.png)]

来自良心的某机构笔记。(国哥)

Session的使用:

1.Session的创建与获取(id 号,是否为新)

  • request.getSession()
    第一次调用是:创建Session 会话
    之后调用都是:获取前面创建好的Session 会话对象。

  • isNew(); 判断到底是不是刚创建出来的(新的)
    true 表示刚创建
    false 表示获取之前创建

每个会话都有一个身份证号。也就是ID 值。而且这个ID 是唯一的。
getId() 得到Session 的会话id 值。

Java代码演示:

 protected void getSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获得Session对象
        HttpSession session = req.getSession();
        //判断是否是新创建的
        boolean aNew = session.isNew();
//        获取SessionId
        String id = session.getId();
        resp.getWriter().write("id:" + id + "<br/>");//回传Html页面
        resp.getWriter().write("是否是新创建的?:" + aNew);

    }

Html效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WrG8snrH-1587660024880)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200424003612170.png)]

2.Session域数据的存取

  • request.getSession().setAttribute()

  • request.getSession().getAttribute()

Java代码演示:

  protected void setSessionValue(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //向Session域设置键值对
        req.getSession().setAttribute("key1","value");
        resp.getWriter().write("保存数据");
    }

    protected void getSessionValue(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获得Session域键值对信息
        String key1 = (String) req.getSession().getAttribute("key1");
        resp.getWriter().write(key1);
    }

Html演示:
在这里插入图片描述

3.Session生命周期控制

  • public void setMaxInactiveInterval(int interval) 设置Session 的超时时间(以秒为单位),超过指定的时长,Session就会被销毁。
    值为正数的时候,设定Session 的超时时长。
    负数表示永不超时(极少使用)

  • public int getMaxInactiveInterval()获取Session 的超时时间

  • public void invalidate() 让当前Session 会话马上超时无效。

  • Session 默认的超时时长:30分钟

在这里插入图片描述

Java代码演示:

 protected void testSessionLive(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置session10秒超时
        req.getSession().setMaxInactiveInterval(10);
        //获得session超时时间
        int maxInactiveInterval = req.getSession().getMaxInactiveInterval();
        System.out.println(maxInactiveInterval);
        //销毁Session
        req.getSession().invalidate();
    }

BaseServlet:

public abstract class BaseServlet extends HttpServlet {

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

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws UnsupportedEncodingException {

        req.setCharacterEncoding("UTF-8");

        resp.setContentType("text/html; charset=UTF-8");

        String action = req.getParameter("action");

        try {
            Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
            method.invoke(this,req,resp);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

Cookie演示html代码

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Cookie</title>
<style type="text/css">
	ul li {
		list-style: none;
	}
</style>
	<base href="http://localhost:8080/10_cookie_session/">
</head>
<body>
	<iframe name="target" width="500" height="500" style="float: left;"></iframe>
	<div style="float: left;">
		<ul>
			<li><a href="testCookieServlet?action=createCookie" target="target">Cookie的创建</a></li>
			<li><a href="testCookieServlet?action=getCookie" target="target">Cookie的获取</a></li>
			<li><a href="testCookieServlet?action=updateCookie" target="target">Cookie值的修改</a></li>
		</ul>
	</div>
</body>
</html>

Session演示Html:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Session</title>
	<base href="http://localhost:8080/10_cookie_session/">
	<style type="text/css">
	ul li {
		list-style: none;
	}
</style>
</head>
<body>
	<iframe name="target" width="500" height="500" style="float: left;"></iframe>
	<div style="float: left;">
		<ul>
			<li><a href="sessionServlet?action=getSession" target="target">Session的创建和获取(id号、是否为新创建)</a></li>
			<li><a href="sessionServlet?action=setSessionValue" target="target">Session域数据的存储</a></li>
			<li><a href="sessionServlet?action=getSessionValue" target="target">Session域数据的获取</a></li>
		</ul>
	</div>
</body>
</html>

xml配置:

    <servlet>
        <servlet-name>CookieServlet</servlet-name>
        <servlet-class>com.servlet.web.CookieServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CookieServlet</servlet-name>
        <url-pattern>/cookieServlet</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>TestCookieServlet</servlet-name>
        <servlet-class>com.servlet.web.TestCookieServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestCookieServlet</servlet-name>
        <url-pattern>/testCookieServlet</url-pattern>
    </servlet-mapping>

最后:

这就是Cookie与Session的总体内容,写得不好请见谅。谢谢支持。

原创文章 20 获赞 77 访问量 2936

猜你喜欢

转载自blog.csdn.net/weixin_46146269/article/details/105721278