6 Cookies 和Session
2018-02-12 11:45
127 查看
1.HTTP协议无状态带来的问题
2.解决一个会话中多个请求之间共享数据的三种方式
3.Cookie
// Cookie cookie1 = new Cookie("currentName", "jinken");
// resp.addCookie(cookie1);
}
}
}
}
http协议在一个会话中的多个请求之间是不能共享数据的 (实际是需要在一个会话的多个请求共享数据) 会话跟踪技术:在一个会话共享数据
2.解决一个会话中多个请求之间共享数据的三种方式
①.使用GET方式,将需要共享的数据以参数的形式传递给下一个页面即可 使用GET方式共享数据,所有数据都暴露在地址栏中,不安全 ②使用cookie技术 将需要共享的数据封装到浏览器的请求头中 ③使用session技术
3.Cookie
客户端技术,将需要共享的数据存放在浏览器中,每次请求时,对应需要共享数据的 页面只需在浏览器获取需要的数据即可。 ①创建Cookie对象共享数据 Cookie cookie=new Cookie(String name,String value); ②将cookie响应给浏览器 resp.addCookie(cookie); ③从请求对象获取所有的cookie Cookie[] cookies=req.getCookies(); for(Cookie cookie:cookies){ if("currentName".equals(cookie.getName())){ String username=cookie.getValue(); } }
4.cookie中文问题的解决方案,先编码后解码 编码: Cookie cookie=new Cookie("currentName",URLEncoder.encode(username,"utf-8")); 解码: username=URLDecoder.decode(cookie.getValue(),"utf-8"); Cookie的缺陷: Cookie不能存储中文字符 Cookie一次只能存储单个字符串,不能存储对象 cookie大小限制在4kb内 cookie数据是存储在浏览器中的,浏览器把Cookie数据删除了,那么共享数据就找不回来了 不同Cookie下面的路径是不同的,路径不同的Cookie之间是不能共享数据的 解决方案: 将Cookie路径设置项目的根路径 cookie.setPath(“/”) @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"); //接受请求参数 String username = req.getParameter("username"); //================================================ //创建Cookie对象,并且共享数据 (相当办卡的操作) Cookie cookie = new Cookie("currentName", URLEncoder.encode(username,"utf-8")); //设置Cookie的时长 单位 秒 //cookie.setMaxAge(10); //删除Cookie //cookie.setMaxAge(0); //设置Cookie的路径为根路径 cookie.setPath("/"); //将Cookie数据响应给浏览器 (相当于将办理好的会员卡给用户) resp.addCookie(cookie); //创建新的Cookie ,覆盖之前的cookie (相当于修改了cookie)
// Cookie cookie1 = new Cookie("currentName", "jinken");
// resp.addCookie(cookie1);
//================================================ PrintWriter out = resp.getWriter(); out.print("欢迎 : "+username+" <br>"); out.print("<a href='/ooxx/list'>收件箱(500)</a>"); }
}
@WebServlet("/ooxx/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"); // ============================================= String username = null; // 从请求对象中获取所有的cookie Cookie[] cookies = req.getCookies(); for (Cookie cookie : cookies) { if("currentName".equals(cookie.getName())){ username = URLDecoder.decode(cookie.getValue(), "utf-8"); break; } } // ============================================= PrintWriter out = resp.getWriter(); out.print("欢迎 :"+username+" <br>"); for (int i = 0; i < 5; i++) { out.print("<a href='/cookie/content'>邮件 (" + i + ")</a><br/>"); } }
}
@WebServlet("/cookie/content") public class ContentServlet 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"); String username = null; // ============================================= Cookie[] cookies = req.getCookies(); for (Cookie cookie : cookies) { if("currentName".equals(cookie.getName())){ username = URLDecoder.decode(cookie.getValue(), "utf-8"); } } // ============================================= PrintWriter out = resp.getWriter(); out.print("欢迎 : "+username+" <br>"); out.print("班长, 你最近好吗?"); }
}
jsp中书写Cookies <% Cookie cookie = new Cookie( URLEncoder.encode("姓名","UTF-8"), URLEncoder.encode("李佳龙","UTF-8") ); response.addCookie(cookie); %> <html> <title>Cookie-中文</title> <body> <% if(request.getCookies()!=null) { for(Cookie coo : request.getCookies()) { String name =URLDecoder.decode(coo.getName(),"UTF-8"); String value = URLDecoder.decode(coo.getValue(),"UTF-8"); out.println(name "-- " value); } } %> el表达式: ${cookie}<!-- 显示所有Cookie对象 --> ${cookie.age.name }<!-- 显示Cookie名为age的name --> ${cookie.age.value }<!-- 显示Cookie名为age的值 --> 4.Session Session是服务器端技术(把识别数据/共享数据存放在服务端) 为每一个用户的浏览器创建独立的session,可以把数据存放在各自的session中, 取数据也从各自session取 (session是一个特殊的cookie,session得底层依然是cookie技术,cookie是内存地址 JSESSIONID) 1.获取Session对象 HttpSession session=request.getSession(); 如果内存中有session对象,返回,没有则创建一个并返回 2.共享数据 setAttribute("USER_IN_SESSION",user); 3.获取共享数据 getAttribute("USER_IN_SESSION"); 当cookie被禁用后,URL重写问题 浏览器禁用cookie后,就再也不能接收服务器响应的cookie,此时cookie和session 就不能共享数据,直接访问URL地址是不能获取共享数据的 使用URL重写 resp.encodeURL(String url); 如果浏览器禁用cookie,url会自动加上jsessionid,如果没有禁用,就不会 加上jsessionid @WebServlet("/session/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"); //接受请求参数 String username = req.getParameter("username"); String password = req.getParameter("password"); User user = new User(); user.setUsername(username); user.setPassword(password); //================================================ //1.获取Sesion对象 HttpSession session = req.getSession(); //2.将数据共享的Session对象中 //session.setAttribute("USERNAME_IN_SESSION", username); session.setAttribute("USER_IN_SESSION", user); //3.修改共享数据 //session.setAttribute("USERNAME_IN_SESSION", "虚竹"); //4.删除session中共享的数据 //session.removeAttribute("USERNAME_IN_SESSION"); //5.清空Sesion对象中所有数据 //session.invalidate(); //6.设置当前Session10秒钟超时 //session.setMaxInactiveInterval(10); //获取Session的id String sessionId = session.getId(); System.out.println(sessionId); //================================================ //使用url重写 //String newUrl = resp.encodeURL(String oldUrl); // 如果浏览器禁用了 Cookie,newUrl后面会自动加上 jsessionid,如果没有禁用,就不会加上jsession PrintWriter out = resp.getWriter(); out.print("欢迎 : "+username+" <br>"); // out.print("<a href='/session/list;jsessionid="+session.getId()+"'>收件箱(500)</a>"); out.print("<a href='"+resp.encodeURL("/session/list")+"'>收件箱(500)</a>"); } } @WebServlet("/session/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"); // ============================================= //获取Session对象 HttpSession session = req.getSession(); //获取sesion共享的数据 User user = (User)session.getAttribute("USER_IN_SESSION"); System.out.println(user); // ============================================= PrintWriter out = resp.getWriter(); out.print("欢迎 :"+user.getUsername()+" <br>"); for (int i = 0; i < 5; i++) { //out.print("<a href='/session/content;jsessionid="+session.getId()+"'>邮件 (" + i + ")</a><br/>"); out.print("<a href='"+resp.encodeURL("/session/content")+"'>邮件 (" + i + ")</a><br/>"); } } }
@WebServlet("/session/content") public class ContentServlet 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"); // ============================================= // 获取Session对象 HttpSession session = req.getSession(); // 获取sesion共享的数据 User user = (User) session.getAttribute("USER_IN_SESSION"); // ============================================= PrintWriter out = resp.getWriter(); out.print("欢迎 : " + user.getUsername() + " <br>"); out.print("班长, 你最近好吗?"); }
}
相关文章推荐
- ssd sftp传输文件问题出现 failed to open a secure file transfer session
- PHP中SESSION不能跨页传递问题的解决办法
- 如何将use添加到session 和从session移除
- HttpClient简单请求和session的保持
- session和cookie
- (6)nodejs学习---cookie和session
- 客户端防表单重复提交和服务器端session防表单重复提交
- WWDC 2013 Session笔记 - iOS7中的多任务
- Cookie和Session专题
- [置顶]解决session过期跳转到登陆页面并跳出iframe框架
- Apache + tomcat实现高并发负载均衡方案(二)----stickysession的集群
- haproxy、nginx以及httpd负载均衡tomcat主机,session保持问题
- Session的生命周期
- session的工作机制
- 在ashx文件中使用session的解决思路
- IE下嵌入iframe获取session问题
- org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContex
- jsp对象以及session设置(二)
- a different object with the same identifier value was already associated withthe session异常解决方案
- CodeIgniter 判断用户超时登录清除session