Session和Cookie

目录

session

session会话的三种关闭方式

Java中修改session超时时间:

java的session中的常用API

例子

login.servlet

main.jsp

login.jsp

cookie常用知识点

总览

区别

总结


session

        Session是许多编程语言中都存在的一个概念,主要用来在多个页面请求之间保持特定的用户的状态。在Web开发中,由于HTTP协议本身是无状态的,即服务器默认每一次请求都是无关联的,所以为了跨请求维持一种“有状态的连接”,就产生了Session的技术。

        具体到Java中,我们通常指的Session是HttpSession,它是Servlet技术中的一个接口,主要用于在一次会话中存储关于用户的信息。当一个用户第一次请求服务器时,服务器会为这个用户创建一个新的Session,并且生成一个与此Session相关联的唯一session id,这个session id会在此后的每一次请求中都被传递,这样,服务器就可以通过session id找到与用户对应的Session,从而跨页面保存用户的状态。

        Session的生命周期自设定的时间开始,直到设定的时间结束。它可以保存任何类型的数据,不仅仅是字符串,还可以是用户的登录信息、购物车信息等。在Java web开发中,Session被广泛用于用户登陆状态的维持,购物车信息的保存等功能。

session会话的三种关闭方式

Session 会话可以通过以下三种方式结束:

  1. 会话超时:Session 对象有一个超时设置,这个设置默认是在 web.xml 中进行配置的,以分钟为单位。如果超过了这个超时时间,而此期间Session没有被访问,则Session会话会自动结束。

  2. 主动关闭:我们可以通过调用 HttpSession 对象的 invalidate() 方法,强制让 Session 对象立刻失效。

  3. 浏览器关闭:如果服务器或浏览器被正常关闭(或者崩溃),那么当前服务器内存中的所有Session都会失效。

        需要注意的是,关掉浏览器或者打开浏览器的隐身模式,并不会导致Session失效。Session的生命周期与浏览器无关,而是由服务器控制。

Java中修改session超时时间:

  1. 在web.xml中设置:这是全局性的设置,对整个web应用程序中的所有session起作用。你可以在web.xml文件中添加以下内容以设置session超时时间:

xml

   <session-config>
     <session-timeout>30</session-timeout>
   </session-config>

上面这个例子将会把session超时时间设置为30分钟。这个数字是以分钟为单位的。

  1. 在代码中设置:这是对单个session的设置,只对当前的session起作用。可以通过在代码中调用HttpSession对象的setMaxInactiveInterval(int interval)方法来设置,参数是以秒为单位的。

    如下示例:

java

   HttpSession session = request.getSession();
   session.setMaxInactiveInterval(30*60); // 设置session超时时间为30分钟

        上面这两种方式中,代码设置的优先级要高于web.xml。如果两处都有设置,那么程序将使用在代码中设置的超时时间。

java的session中的常用API

Java中HttpSession对象提供了一些方法来管理和操作Session,以下是一些常用的方法:

  1. **public Object getAttribute(String name)**:返回session中名为name的属性,如果没有该属性,则返回null。

  2. **public void setAttribute(String name, Object value)**:将对象value绑定到此session中,使用指定的名称name。如果已经使用该名称绑定了其他对象,那么该名称现在将被重新绑定到新的对象value。

  3. **public void removeAttribute(String name)**:从session中移除名为name的属性。

  4. **public Enumeration<String> getAttributeNames()**:返回一个String的枚举,包含了所有在此session中存在的属性名称。

  5. **public long getCreationTime()**:返回此session创建的时间,以毫秒为单位,自1970年1月1日 00:00:00 GMT以来的时间。

  6. **public String getId()**:返回创建此session时JSESSIONID的值。

  7. **public long getLastAccessedTime()**:返回客户端最后通过请求访问此session的时间,以毫秒为单位,自1970年1月1日 00:00:00 GMT以来的时间。

  8. **public int getMaxInactiveInterval()**:返回最大时间间隔,以秒为单位,服务器将在客户端访问后保持session打开。

  9. **public void setMaxInactiveInterval(int interval)**:指定在客户端访问之后,服务器将保持session打开的最大时间间隔,以秒为单位。

  10. **public void invalidate()**:立即让此session无效,然后解绑在它上面绑定的任何对象。

  11. **public boolean isNew()**:返回一个布尔值,以指示服务器是否为此客户端创建了一个新的session。

如果需要详细了解其他方法,建议查阅Java HttpSession类的API文档。

例子

login.servlet
package com.example.demo;

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;

@WebServlet(name = "login", value = "/login")
public class login extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("post.....first");
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        if (username.equals("GWJ") && password.equals("2004")){
            // TODO 将用户名存在session中
            HttpSession session = request.getSession();
            session.setAttribute("username", username);


            response.sendRedirect("main.jsp");
        }else {
            response.sendRedirect("falseServlet");
        }

    }
}
main.jsp

如果直接访问main.jsp那么会导致null,因为没有setsession的过程

<%--
  Created by IntelliJ IDEA.
  User: 14059
  Date: 2024-03-07
  Time: 15:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Main_JSP页面</title>
</head>
<body>
<%--    ${param.username} 等同于在Servlet中调用 request.getParameter("username")--%>
<%--    取session  --%>
    <%
        String username = (String) session.getAttribute("username");
//        方法一
        out.print("欢迎来到Masoul科技"+username+"尊敬的先生/女士1");
    %>
<%--方法二--%>
    <h1>欢迎来到Masoul科技,${username},尊敬的先生/女士2</h1>
<%--方法三--%>
    <h1>欢迎来到迈首集团,${sessionScope.username},尊敬的先生/女士3</h1>
<%--方法四--%>
    <h1>欢迎来到迈首集团,<%=username%>,尊敬的先生/女士4</h1>
    <img src="images/masoul.png">
</body>
</html>
login.jsp
<%--
  Created by IntelliJ IDEA.
  User: 14059
  Date: 2024-03-07
  Time: 15:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Main_JSP页面</title>
</head>
<body>
<%--    ${param.username} 等同于在Servlet中调用 request.getParameter("username")--%>
<form action="login" method="post">
    <h1>login.jsp</h1>
    用户名:<input type="text" name="username"><br>
    密码:<input type="text" name="password"><br>
    <input type="submit" value="登录">
    <input type="reset" value="取消">
</form>
</body>
</html>

        Cookie是由服务器发送到用户浏览器并保存在浏览器上的一种技术。每当同一台计算机通过浏览器请求页面时,它都会发送Cookie。使用cookie的目的主要是让服务器能够记住用户的状态信息。

        相比于Session存放在服务器端,Cookie存放的位置在客户端(浏览器)。服务器可以通过设置响应头的Set-Cookie字段将一段Cookie信息发送到客户端,客户端收到后会保存这个Cookie,此后该客户端发出的每一次请求中,都会自动带上这个Cookie,服务器就可以通过解析Cookie来获取客户端的状态信息。

        一个典型的应用场景就是“记住密码"功能。如果你勾选了"记住密码",那么下次即使你完全退出网站,甚至重启电脑再进入网站,也无需再次输入账号密码就可以直接登陆,这个功能的实现就是依赖于Cookie。

        但Cookie并不全是好事,也存在一些问题,比如:由于Cookie是保存在客户端的,不像Session那样保存在服务端,所以Cookie更容易被篡改,进而造成一些安全问题。此外,由于浏览器的限制,每个站点在浏览器中存储Cookie的数量和大小都有相应的限制。

cookie常用知识点

        Cookie是存储在用户浏览器中的一小段文本信息,常被用于记录用户操作和存储用户偏好等信息。以下是一些关于Cookie的常用知识点:

        (1)创建和设置Cookie: 在Java中,你可以使用javax.servlet.http.Cookie类来创建一个新的Cookie,并使用HttpServletResponse.addCookie(Cookie)方法来设置Cookie。

   Cookie cookie = new Cookie("username", "yourusername");
   response.addCookie(cookie);

        (2)获取Cookie: 可以通过HttpServletRequest.getCookies()方法来获取所有的Cookie,它返回一个Cookie数组。

   Cookie[] cookies = request.getCookies();

        (3)设置Cookie的有效期: 通过Cookie.setMaxAge(int)方法可以设置Cookie的有效期,单位是秒。例如,设定Cookie 30分钟后过期的代码如下:

   cookie.setMaxAge(30 * 60); // 设置Cookie 30分钟后过期

        

在Java中,Cookie类有两个方法来获取Cookie的名称和值:

  1. getName() 方法用于获取Cookie的名称。它返回一个字符串,表示Cookie的名称。

  2. getValue() 方法用于获取Cookie的值。它返回一个字符串,表示Cookie的值。

以下是一个示例代码,演示如何使用这两个方法获取Cookie的名称和值:

Cookie[] cookies = request.getCookies(); // 获取请求中的所有Cookie
if (cookies != null) {
    for (Cookie cookie : cookies) {
        String name = cookie.getName(); // 获取Cookie的名称
        String value = cookie.getValue(); // 获取Cookie的值
        System.out.println("Cookie Name: " + name);
        System.out.println("Cookie Value: " + value);
    }
}

上面的代码首先通过 request.getCookies() 方法获取请求中的所有Cookie对象,并将它们存储在一个数组中。然后,使用一个foreach循环遍历每个Cookie对象,通过调用 getName() 方法获取Cookie的名称,通过调用 getValue() 方法获取Cookie的值,并将它们输出到控制台。

请注意,此示例代码是基于Java的Servlet编程模型,其中 request 是一个 HttpServletRequest 对象。如果你在其他环境中使用Cookie,获取Cookie的方式可能有所不同。

        (4)Cookie的路径和域Cookie.setPath(String)可以设置Cookie的路径,只有访问该路径的请求才会包含这个Cookie。Cookie.setDomain(String)可以设置Cookie的域,只有请求了这个域的站点才会包含这个cookie。默认情况下,Cookie的路径和域都是设置Cookie的那个页面。

        (5)安全和HttpOnly标志: Cookie.setSecure(boolean)可以设置Cookie的secure标志,如果设置为true,那么浏览器将只在封装在安全(HTTPS)协议中的请求中发送Cookie。Cookie.setHttpOnly(boolean)可以设置HttpOnly标志,如果设置为true,那么通过JavaScript等客户端脚本将无法读取到Cookie。

        (6)删除Cookie: 移除Cookie的常用策略是设置其最大存活时间为0,并将同名的Cookie发送出去覆盖原来的Cookie。java中并没有直接删除cookie的API

        (7)Session和Cookie的区别: Session和Cookie都可以用于保持用户状态,区别在于Session存储在服务器端,而Cookie存储在客户端(浏览器)。Cookie主要用于长时间保存用户状态,而Session则主要用于一次会话的用户验证。

        注意,Cookie可以被用户禁用,所以编程时需要做好相应处理,比如备选的Session或者localStorage。另外,Cookie信息在传输过程中可能被窃取或篡改,所以敏感信息不应存储在Cookie中,并且最好利用Cookie的Secure属性通过HTTPS传输。

不知道怎么去水印,这个图片是大水印中的大佬的。


Servletcontext

三者对比

        ServletContext,Session和Cookie在Java Web开发中都是用于保存和管理用户数据的重要组件,但它们的作用范围是不同的。

  1. ServletContext:ServletContext是一个全局的作用域,它在整个web应用中都是可见的。一旦web应用启动,ServletContext就会被创建,然后在整个web应用的生命周期内都存在,所有的Servlet和JSP页面都可以共享在ServletContext中存储的信息。也就是说,ServletContext的作用范围是整个web应用。

  2. Session:Session是一个用户级别的作用域,它在用户的一次会话中都是可见的。每个用户在第一次访问web应用时都会创建一个新的session,然后在接下来的所有请求中都可以访问这个session里的信息。当用户会话结束(比如关闭浏览器,或者session超时)时,对应的session就会被销毁。所以,Session的作用范围是单个用户的会话。

  3. Cookie:Cookie是在客户端(浏览器)存储数据的一种方式,通过在用户的浏览器中存储数据,然后在每一次的请求中都带上这些数据来达到跟踪用户的目的。Cookie通常用于识别用户,例如,判断用户是否已经登录,保存用户的个人设置等。Cookie的生存期可以通过设置Expires属性进行控制,一旦达到Expires设置的时间,Cookie就会自动失效。因此,Cookie的作用范围是单个用户的浏览器。

     

ServletContext,Session和Request的作用范围从大到小排列如下:

首先声明一下:它们没有包含关系

  1. ServletContext:整个Web应用程序的生命周期,所有用户共享。
  2. Session:特定用户的多次请求的生命周期,只限于单个用户。
  3. Request:单次用户请求的生命周期,一旦请求结束,相应的Request对象就会被销毁。

尽量使用小的

取值问题

        如果uu在ServletContext(ApplicationScope)、Session和Request中都被定义了,那么 ${uu} 会首先获取Request范围内的uu值。如果Request范围内没有找到,再去Session范围查找,如果还没有找到,最后会去ServletContext(ApplicationScope)范围查找。
如果在所有的范围内都没有找到uu这个变量,那么 ${uu} 会返回null。

        从小范围到大范围的寻找

常用API

        在Java Servlet中,ServletContext是web应用程序的一个接口,它提供了一种用于与servlet容器进行通信的方法。要在Servlet中获取ServletContext对象,可以使用以下方法:

  1. 通过在Servlet类中覆盖 init 方法来获取:
public class MyServlet extends HttpServlet {
    public void init(ServletConfig config) {
        ServletContext context = config.getServletContext();
        // Now you can use the context object
    }
}

        在这个例子中,Servlet的 init 方法会在Servlet第一次被加载到内存时被调用,ServletConfig是由Servlet容器(比如Tomcat)创建的,用于初始化Servlet的。

  1. 通过Servlet的 getServletContext 方法直接获取:
public class MyServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) {
        ServletContext context = getServletContext();
        // Now you can use the context object
    }
}

        在这个例子中,getServletContext 方法是 javax.servlet.GenericServlet 类(HttpServlet的超类)的一部分,可以在Servlet的 doGetdoPost 等生命周期方法中使用。

        一旦你有了ServletContext对象,你就可以使用它的各种方法,例如获取web应用的初始化参数,获取web应用的真实路径,设置和获取web应用级别的属性等。

        在Java EE 中,ServletContext接口提供了许多有用的方法,可用于操作Web应用程序的上下文数据。以下是一些常用的 ServletContext API:

  1. public String getContextPath(): 返回此ServletContext对应的上下文路径。

  2. public ServletContext getContext(String uripath): 返回以给定的URL路径命名的ServletContext,在同一Web服务器中的其他Web应用程序上下文中。

  3. public String getInitParameter(String name): 从上下文的初始化参数中返回给定名称的值。

  4. public Enumeration<String> getInitParameterNames(): 返回上下文的初始化参数的名称的枚举。

  5. public boolean setInitParameter(String name, String value): 将上下文的初始化参数设置为给定的字符串。

  6. public Object getAttribute(String name): 返回具有给定名称的上下文属性。

  7. public Enumeration<String> getAttributeNames(): 返回上下文的属性名的枚举。

  8. public void setAttribute(String name, Object object): 将给定的对象绑定到给定的属性名。

  9. public void removeAttribute(String name): 删除具有给定名称的上下文属性。

  10. public String getRealPath(String path): 返回用于在文件系统上找到实际路径的字符串

  11. public RequestDispatcher getRequestDispatcher(String path): 返回一个RequestDispatcher对象,该对象充当给定路径名的资源的包装器。

        这些是ServletContext的常用方法,可以协助我们进行Web开发中的许多任务,如读取初始化参数,获取其他资源的路径等。



总览

        在Java web开发中,session和cookie是非常重要的概念,他们主要用于追踪用户访问服务器的记录。下面是他们的主要定义和用途:

  1. Cookie:Cookie是服务器发送到用户浏览器并保存在浏览器上的一片信息,它会在浏览器下一次请求同一服务器的时候返回。Cookie通常用来识别用户,例如当你访问一个网站时,服务器会发送一个包含唯一标识符的cookie到浏览器,那么当你再次访问这个网站时,浏览器会返回这个cookie,服务器就可以识别出你。

  2. Session:Session在Java中,通常是指HttpSession,它用于在Java Servlet规范中定义的http会话过程中保存特定用户的信息。Session保存在服务器端,用户第一次访问服务器时,服务器会创建一个session,并生成一个唯一的session id,然后将这个id保存在cookie中发送到浏览器,以后浏览器再请求服务器时就会携带这个id,服务器通过这个id就可以找到对应的session。

        总的来说,Session和Cookie的最大区别在于存储位置和存储信息量大小,Cookie数据存放在客户的浏览器上;Session数据存放在服务器上。如果考虑安全性,Session比Cookie安全。如果考虑效率,则Cookie比Session更有效。


区别

        Session和Cookie主要用于在无状态的HTTP协议上保持状态信息,使得服务器能够识别用户。下面是他们的主要区别:

1.存储位置:Session的信息保存在服务器上,而Cookie的信息保存在客户端(浏览器)。

2.存储容量:Cookie的大小限制在4KB左右,而Session理论上是没有大小限制的,但存储过大的数据会增加服务器的存储压力。

3.存储内容:Cookie只能保存字符串类型的信息,且需要保证信息的安全,不能保存敏感数据。Session则可以保存任何类型的对象。

4.生命周期:Session的生命周期是在用户登陆后开始,关闭浏览器或者手动注销后结束。而Cookie的生命周期则可以根据需要手动设置。

5.安全性:Session相对来说更安全一些,因为其保存在服务器,且可以做到只在当前会话期间有效。而Cookie保存在浏览器端,容易被篡改,且若不设置失效时间会一直保存。

        总的来说,根据需要选择使用Session或者Cookie。如需保存大量的信息,且对安全性有一定要求,那么选择Session会更好。如果只需要保存一些简单的,不是特别重要的信息,且期望即使用户关闭浏览器后也能继续保存,那么可以使用Cookie。


总结

还不慌总结,这篇文章应该还会被我修改的,修改记录会在下面。

2024.03.19-初稿

2024.03.21-第一改

2024.03.26-第二改

2024.03.28-第三改

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

WenJGo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值