JavaWeb——Session&&Cookie详解

本文详细解析了JavaWeb中的Session和Cookie技术。Session用于维持客户端与服务器的会话状态,通过sessionID来识别不同会话,并介绍了常用方法如设置失效时间、存储和删除数据。Cookie作为数据交互的手段,服务器将其发送给浏览器并存储,后续请求时一并发送回服务器。文章对比了Session和Cookie的区别,并提供了一个Cookie登录案例,包括相关代码和测试结果。

1. 定义

服务器无法识别每一次HTTP请求的出处(不知道来自哪个终端),它只会接受到一个请求信号,所以就存在一个问题:将用户的响应发送给其他人,必须有一种技术来让服务器知道请求来自哪,这就是会话技术。

会话:就是客户端和服务器之间发生的一系列连续的请求和响应的过程,打开浏览器进行操作到关闭浏览器的过程。

会话状态:指服务器和浏览器在会话过程种产生的状态信息,借助于会话状态,服务器能够把属于同一次会话的一系列请求和响应关联起来。

实现会话有两种方式

  • session
  • cookie

2. Session

2.1 sessionID

属于同一次会话的请求都有一个相同的标识符,sessionID

测试代码

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
	<%
		String sessionID = session.getId();
	%>
	<%=sessionID%>
</body>
</html>

结果展示

不同sessionID的原因:

  • 同一浏览器关闭后再打开,就算作不同的会话
  • 用不同的浏览器打开

在这里插入图片描述

2.2 session常用方法

String getID() 获取sessionID
void setMaxINactiveInterval(int interval) 设置session的失效时间,单位为秒
int getMaxInactiveInterval() 获取当前session的失效时间
void invalidata() 设置session立即失效
void setAttribute(String key,Object value) 通过键值对的形式来存储数据
Object getAttribute(String key) 通过键获取对应的数据
void removeAttribute(String key) 通过键删除对应的数据

3. Cookie

Cookie是服务端在HTTP响应中附带传给浏览器的一个小文本文件,一旦浏览器保存了某个Cookie,在之后的请求和响应过程中,会将此Cookie来回传递,这样就可以通过Cookie这个载体完成客户端和服务端的数据交互。

Cookie

  • 创建cookie
Cookie cookie = new Cookie("name","zhangsan");
response.addCookie(cookie);
  • 读取Cookie
Cookie[] cookies = request.getCookies();
for(Cookie cookie:cookies)
{
	out.write(cookie.toString());
}
Cookie[] cookies = request.getCookies();
for(Cookie cookie:cookies)
{
	out.write(cookie.getName()+":"+cookie.getValue()+"<br/>");
}

3.1 Cookie的常用方法

void setMaxAge(int age) 设置Cookie的有效时间,单位为秒
int getMaxAge() 获取Cookie的有效时间

测试方法:

Cookie[] cookies = request.getCookies();
System.out.println(cookies[0].getMaxAge());

String getName() 获取Cookie的name
String getValue() 获取Cookie的value

3.2 Session和Cookie的区别

sessionCookie
保存在服务器保存在浏览器
保存的数据是Object保存的数据是String
会随着会话的结束而销毁可以长期保存在浏览器中,与会话无关
保存重要信息保存不重要信息
存储用户信息存:setAttribute("name","admin") 取:getAttribute("name")存:response.addCookie(new Cookie("name","admin")). 取:request.getCookies()
生命周期服务端:只要web应用重启就销毁,客户端:只要浏览器关闭就销毁不随服务端的重启而销毁,客户端:默认是只要关闭浏览器就销毁,我们通过setMaxAge()方法设置有效期,一旦设置了有效期,则不随浏览器关闭而销毁,而是由设置的时间来决定。
退出登录session.invalidate()setMaxAge(0)

3.3 Cookie的登录案例

3.3.1 案例代码

cookie_login.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<form action="cookieLogin" method="post">
		<table>
			<tr>
				<td>
					用户名:
				</td>
				<td>
					<input type="text" name="username">
				</td>
			</tr>
			<tr>
				<td>
					密码:
				</td>
				<td>
					<input type="password" name="password">
				</td>
			</tr>
			<tr>
				<td>
					<input type="submit" value="登录">
				</td>
				<td>
					<input type="reset" name="重置"/>
				</td>
			</tr>
		</table>
	</form>
</body>
</html>

CookieLoginServlet

package bysj01;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/cookieLogin")
public class CookieLoginServlet extends HttpServlet{

	private String myusername = "admin";
	private String mypassword = "123456";
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		if(username.equals(myusername) && password.equals(mypassword)) {
			Cookie cookie = new Cookie("name",username);
			resp.addCookie(cookie);
			resp.sendRedirect("cookie_welcome.jsp");
		}else {
			resp.sendRedirect("cookie_login.jsp");
		}
	}
	
}

cookie_welcome.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<%
	Cookie[] cookies = request.getCookies();
	for(Cookie cookie:cookies)
	{
		if(cookie.getName().equals("name")){
			out.write("欢迎回来"+cookie.getValue());
		}
	}
%>
	<a href="cookieLogout">退出登录</a>
</body>
</html>

CookieLogoutServlet

package bysj01;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/cookieLogout")
public class CookieLogoutServlet extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		Cookie[] cookies = req.getCookies();
		for(Cookie cookie:cookies) {
			if(cookie.getName().equals("name")) {
				cookie.setMaxAge(0);
				resp.addCookie(cookie);
				resp.sendRedirect("cookie_login.jsp");
			}
		}
	}

}

3.3.2 案例测试结果

cookie_login.jsp显示结果

在这里插入图片描述
用户名就是servlet中设置的 这个案例设置的是用户名“admin”密码“123456”

cookie_welcome.jsp显示结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

weixin_43820008

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

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

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

打赏作者

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

抵扣说明:

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

余额充值