解决会话多个请求之间数据共享的问题:使用Cookie
来源:互联网 发布:知乎补充回答 编辑:程序博客网 时间:2024/05/23 22:57
实际应用中,一个会话应该有多个请求,根据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;@Overrideprotected 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);// 修改Cookiecookie = 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;@Overrideprotected 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>
- 解决会话多个请求之间数据共享的问题:使用Cookie
- 多个activity之间的数据共享
- 多个线程之间共享数据的方式(卖票问题,存取款问题)
- 解决ajax跨域请求数据cookie丢失问题
- ASP.NET与ASP之间的COOKIE共享问题
- 项目之间Cookie的共享
- 项目之间Cookie的共享
- 使用Volley请求数据,并使用Gson解析(解决请求来的数据乱码问题)
- Android Preference的使用总结(很全很详细)以及SharedPreferences多个程序之间共享数据
- 多个Activity之间共享数据的5种方式
- Java多个线程之间处理共享数据的方式
- Java多个线程之间处理共享数据的方式
- Java多个线程之间处理共享数据的方式
- Java多个线程之间处理共享数据的方式
- angularJS--多个控制器之间的数据共享
- angularJS--多个控制器之间的数据共享
- Java多个线程之间处理共享数据的方式
- Java多个线程之间处理共享数据的方式
- 客户端http请求 会带ip吗
- 将QQ截图添加至右键菜单
- 51nod-1240莫比乌斯函数
- 为你详细解读HTTP请求头的具体含意
- 动态规划——在做题中理解你的美
- 解决会话多个请求之间数据共享的问题:使用Cookie
- javaScript基础(二)
- C++ 运算符理论小结
- 深入实践boost读书笔记1
- 定位器
- HTTP 头部解释
- 计算机的组成及其功能
- 视频解码和硬解码
- 五个海盗如何分100个金币呢?