实际应用中,一个会话应该有多个请求,根据HTTP协议无状态的特点,会话中的每个请求之间无法共享数据,但是实际应用,多个请求之间是需要共享数据,因此,我们需要解决解决一个会话多个请求之间如何共享数据的问题
要解决数据共享问题,可通过以下几种方式:
第一种方式:.使用GET将需要供的数据传递到下一个页面
将需要共享的数据保存到客户端(浏览器),通过Servlet取出客户端中需要共享的数据,就可以完成多个请求之间数据共享
但是,这种方式会将数据暴露在地址栏中,不安全
第二种方式:使用POST将需要供的数据传递到下一个页面:
既然GET可以传递数据,POST不用说也是可以的,使用POST方式会比GET方式稍微安全一点,POST方式不会将数据暴露在地址栏中,但是数据会保存在浏览器中,在浏览器端按F12查看请求参数还是可以看到数据
还有两种方式,一是使用Cookie,另一种是使用Session,这两种方式各有特点,这里我就详细讲一下如何使用Cookie实现数据共享。
Cookie,简单来说,是客户端技术:将需要共享的数据保存在客户端(浏览器),如果一个会话的多个请求,如果有需要共享数据的页面,直接从客户获取需要的数据即可。
Cookie的相关操作:
1.创建Cookie并设置共享数据(可以把Cookie看成一个容器,比如会员卡,里面存储着个人信息)
Cookie cookie = new Cookie(String name,String value);
Cookie cookie = new Cookie(“currentName”,”Rare”)
name: 需要共享数据的名称
value:需要共享的数据
2.将数据保存到客户端(相当于将会员卡给用户)
response对象.addCookie(cookie);
3.获取Cookie信息(相当于第二次购物,出示会员卡)
Cookie cookie = request对象.getCookies();
当数据传到下一个页面,该页面就可以调用该方法获取Cookie,如若想要获取存储在Cookie中的数据,可通过Cookie对象.getName()和Cookie对象.getValue()方法
4.解决不能传输中文的问题
1)先编码
String ret = URLEncoder.encode(String name, String enc);
name:要编码的字符串
enc:需要编码的字符集
2)解码
String stt = URLDecoder.decode(String name,String enc)
name :要解码的字符串
enc:需要解码的字符集
以下是一段简单的使用Cookie传递数据的代码:
login.html
<span style="font-size:18px;"><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/cookie/login" method="post">
账号:<input name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html></span>
LoginServlet.java
<span style="font-size:18px;">import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
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("/cookie/login")
public class LoginServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
//获取请求参数
String username = req.getParameter("username");
//===============Cookie操作=============
//1,创建Cookie并设置共享数据
//URLEncoder.encode(username, "UTF-8") Cookie不能支持中文,因此需编码
Cookie cookie = new Cookie("currentName",URLEncoder.encode(username, "UTF-8"));
//2, 将数据保存到客户端(
resp.addCookie(cookie);
// 修改Cookie
cookie = new Cookie("currentName", "Lu");
// 设置Cookie的路为根路径
//cookie.setPath("/");
resp.addCookie(cookie);
<span style="white-space:pre"> </span>//==================================
//控制页面跳转
out.print("欢迎:"+username+"<br>");
out.print("<a href='/cookie/list'>622邮件</a>");
}
}</span>
ListServlet.java
<span style="font-size:18px;">import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
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("/cookie/list")
public class ListServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
//获取请求参数
//String username = req.getParameter("username");
//处理业务逻辑
//=============Cookie操作=========
String username = "";
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
if("currentName".equals(cookie.getName())){
username = URLDecoder.decode(cookie.getValue(), "UTF-8");
break;
}
}
//================================
//控制页面跳转
out.print("欢迎"+username+"<br>");
for (int i = 0; i < 5; i++) {
//out.print("邮件"+i+"<br>");
out.print("<a href='/cookie/content'>邮件"+i+"</a><br>");
}
}
}</span>