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

写在前面:由于时间更新的比较少,但是最近我的文章:一篇文章认识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的总体内容,写得不好请见谅。谢谢支持。

### JavaWeb项目中实现自动登录功能 #### 登录成功时设置Cookie 为了实现在用户登录成功后将其用户名和密码保存至`Cookie`以便后续自动登录,在处理登录请求的Servlet中,当验证通过之后应创建并配置两个`Cookie`对象分别存储用户名(`uname`)密码(`upwd`)。这两个`Cookie`会被发送给浏览器端长期保存。 ```java // 创建Cookie来保存用户名和密码 String username = "exampleUser"; String password = "examplePassword"; Cookie userCookie = new Cookie("uname", username); userCookie.setPath("/"); userCookie.setMaxAge(60 * 60 * 24 * 7); // 设置有效期为一周 Cookie passCookie = new Cookie("upwd", password); passCookie.setPath("/"); passCookie.setMaxAge(60 * 60 * 24 * 7); response.addCookie(userCookie); response.addCookie(passCookie); ``` #### 使用过滤器检查Cookie完成自动登录 每当有新的HTTP请求到达服务器之前都会先经过Filter组件。在此处可以读取来自客户端携过来的所有Cookies,并从中查找是否存在名为`uname`以及`upwd`的项。如果找到匹配则尝试模拟一次成功的登录操作——即重新建立Session并将必要的用户信息存入其中[^4]。 ```java public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response = (HttpServletResponse)res; boolean autoLoginAttempted = false; Cookie[] cookies = request.getCookies(); if(cookies != null){ String savedUsername = ""; String savedPassword = ""; for(Cookie cookie : cookies){ switch(cookie.getName()){ case "uname": savedUsername = cookie.getValue(); break; case "upwd": savedPassword = cookie.getValue(); break; } if(!savedUsername.isEmpty() && !savedPassword.isEmpty()){ HttpSession session = request.getSession(true); // 此处应该调用实际的身份验证逻辑代替硬编码判断 if(savedUsername.equals("expectedName") && savedPassword.equals("expectedPass")){ session.setAttribute("username", savedUsername); autoLoginAttempted = true; }else{ // 清除不正确的凭证 cookie.setValue(""); cookie.setPath("/"); cookie.setMaxAge(0); ((HttpServletResponse)res).addCookie(cookie); } break; } } if(autoLoginAttempted){ RequestDispatcher dispatcher = request.getRequestDispatcher("/home"); dispatcher.forward(request,response); return; } } chain.doFilter(req,res); } ``` #### 用户登出时清除SessionCookie 确保在用户选择注销账户的时候不仅移除了当前会话中的所有属性还彻底删除了之前设定好的持久化认证凭据(即上面提到过的那两块饼干)。这一步骤非常重要因为如果不这样做的话即使关闭窗口再次打开也可能由于残留的数据而被立即重定向回受保护的内容页面[^2]。 ```java // 销毁session request.getSession().invalidate(); // 清空Cookie String contextPath = request.getContextPath(); Cookie clearUser = new Cookie("uname",""); clearUser.setPath(contextPath); clearUser.setMaxAge(0); response.addCookie(clearUser); Cookie clearPass = new Cookie("upwd",""); clearPass.setPath(contextPath); clearPass.setMaxAge(0); response.addCookie(clearPass); // 跳转页面 response.sendRedirect(contextPath+"/login.html"); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值