解决会话多个请求之间数据共享的问题:使用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>





0 0
原创粉丝点击