目录
session
Session是许多编程语言中都存在的一个概念,主要用来在多个页面请求之间保持特定的用户的状态。在Web开发中,由于HTTP协议本身是无状态的,即服务器默认每一次请求都是无关联的,所以为了跨请求维持一种“有状态的连接”,就产生了Session的技术。
具体到Java中,我们通常指的Session是HttpSession,它是Servlet技术中的一个接口,主要用于在一次会话中存储关于用户的信息。当一个用户第一次请求服务器时,服务器会为这个用户创建一个新的Session,并且生成一个与此Session相关联的唯一session id,这个session id会在此后的每一次请求中都被传递,这样,服务器就可以通过session id找到与用户对应的Session,从而跨页面保存用户的状态。
Session的生命周期自设定的时间开始,直到设定的时间结束。它可以保存任何类型的数据,不仅仅是字符串,还可以是用户的登录信息、购物车信息等。在Java web开发中,Session被广泛用于用户登陆状态的维持,购物车信息的保存等功能。
session会话的三种关闭方式
Session 会话可以通过以下三种方式结束:
-
会话超时:Session 对象有一个超时设置,这个设置默认是在 web.xml 中进行配置的,以分钟为单位。如果超过了这个超时时间,而此期间Session没有被访问,则Session会话会自动结束。
-
主动关闭:我们可以通过调用 HttpSession 对象的 invalidate() 方法,强制让 Session 对象立刻失效。
-
浏览器关闭:如果服务器或浏览器被正常关闭(或者崩溃),那么当前服务器内存中的所有Session都会失效。
需要注意的是,关掉浏览器或者打开浏览器的隐身模式,并不会导致Session失效。Session的生命周期与浏览器无关,而是由服务器控制。
Java中修改session超时时间:
- 在web.xml中设置:这是全局性的设置,对整个web应用程序中的所有session起作用。你可以在web.xml文件中添加以下内容以设置session超时时间:
xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>
上面这个例子将会把session超时时间设置为30分钟。这个数字是以分钟为单位的。
-
在代码中设置:这是对单个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,以下是一些常用的方法:
-
**public Object getAttribute(String name)**:返回session中名为name的属性,如果没有该属性,则返回null。
-
**public void setAttribute(String name, Object value)**:将对象value绑定到此session中,使用指定的名称name。如果已经使用该名称绑定了其他对象,那么该名称现在将被重新绑定到新的对象value。
-
**public void removeAttribute(String name)**:从session中移除名为name的属性。
-
**public Enumeration<String> getAttributeNames()**:返回一个String的枚举,包含了所有在此session中存在的属性名称。
-
**public long getCreationTime()**:返回此session创建的时间,以毫秒为单位,自1970年1月1日 00:00:00 GMT以来的时间。
-
**public String getId()**:返回创建此session时JSESSIONID的值。
-
**public long getLastAccessedTime()**:返回客户端最后通过请求访问此session的时间,以毫秒为单位,自1970年1月1日 00:00:00 GMT以来的时间。
-
**public int getMaxInactiveInterval()**:返回最大时间间隔,以秒为单位,服务器将在客户端访问后保持session打开。
-
**public void setMaxInactiveInterval(int interval)**:指定在客户端访问之后,服务器将保持session打开的最大时间间隔,以秒为单位。
-
**public void invalidate()**:立即让此session无效,然后解绑在它上面绑定的任何对象。
-
**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。使用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的名称和值:
getName() 方法用于获取Cookie的名称。它返回一个字符串,表示Cookie的名称。
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开发中都是用于保存和管理用户数据的重要组件,但它们的作用范围是不同的。
-
ServletContext:ServletContext是一个全局的作用域,它在整个web应用中都是可见的。一旦web应用启动,ServletContext就会被创建,然后在整个web应用的生命周期内都存在,所有的Servlet和JSP页面都可以共享在ServletContext中存储的信息。也就是说,ServletContext的作用范围是整个web应用。
-
Session:Session是一个用户级别的作用域,它在用户的一次会话中都是可见的。每个用户在第一次访问web应用时都会创建一个新的session,然后在接下来的所有请求中都可以访问这个session里的信息。当用户会话结束(比如关闭浏览器,或者session超时)时,对应的session就会被销毁。所以,Session的作用范围是单个用户的会话。
-
Cookie:Cookie是在客户端(浏览器)存储数据的一种方式,通过在用户的浏览器中存储数据,然后在每一次的请求中都带上这些数据来达到跟踪用户的目的。Cookie通常用于识别用户,例如,判断用户是否已经登录,保存用户的个人设置等。Cookie的生存期可以通过设置Expires属性进行控制,一旦达到Expires设置的时间,Cookie就会自动失效。因此,Cookie的作用范围是单个用户的浏览器。
ServletContext,Session和Request的作用范围从大到小排列如下:
首先声明一下:它们没有包含关系
- ServletContext:整个Web应用程序的生命周期,所有用户共享。
- Session:特定用户的多次请求的生命周期,只限于单个用户。
- 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对象,可以使用以下方法:
- 通过在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的。
- 通过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的 doGet
,doPost
等生命周期方法中使用。
一旦你有了ServletContext对象,你就可以使用它的各种方法,例如获取web应用的初始化参数,获取web应用的真实路径,设置和获取web应用级别的属性等。
在Java EE 中,ServletContext
接口提供了许多有用的方法,可用于操作Web应用程序的上下文数据。以下是一些常用的 ServletContext
API:
-
public String getContextPath()
: 返回此ServletContext对应的上下文路径。 -
public ServletContext getContext(String uripath)
: 返回以给定的URL路径命名的ServletContext,在同一Web服务器中的其他Web应用程序上下文中。 -
public String getInitParameter(String name)
: 从上下文的初始化参数中返回给定名称的值。 -
public Enumeration<String> getInitParameterNames()
: 返回上下文的初始化参数的名称的枚举。 -
public boolean setInitParameter(String name, String value)
: 将上下文的初始化参数设置为给定的字符串。 -
public Object getAttribute(String name)
: 返回具有给定名称的上下文属性。 -
public Enumeration<String> getAttributeNames()
: 返回上下文的属性名的枚举。 -
public void setAttribute(String name, Object object)
: 将给定的对象绑定到给定的属性名。 -
public void removeAttribute(String name)
: 删除具有给定名称的上下文属性。 -
public String getRealPath(String path)
: 返回用于在文件系统上找到实际路径的字符串 -
public RequestDispatcher getRequestDispatcher(String path)
: 返回一个RequestDispatcher对象,该对象充当给定路径名的资源的包装器。
这些是ServletContext的常用方法,可以协助我们进行Web开发中的许多任务,如读取初始化参数,获取其他资源的路径等。
总览
在Java web开发中,session和cookie是非常重要的概念,他们主要用于追踪用户访问服务器的记录。下面是他们的主要定义和用途:
-
Cookie:Cookie是服务器发送到用户浏览器并保存在浏览器上的一片信息,它会在浏览器下一次请求同一服务器的时候返回。Cookie通常用来识别用户,例如当你访问一个网站时,服务器会发送一个包含唯一标识符的cookie到浏览器,那么当你再次访问这个网站时,浏览器会返回这个cookie,服务器就可以识别出你。
-
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-第三改