Cookie

来源:互联网 发布:程序员为什么叫程序猿 编辑:程序博客网 时间:2024/06/16 03:03

Cookie和Session

1.业务场景

  • 在登录时要记录账号
  • 在查询等功能页面上显示此账号

2.错误的解决方案

1)使用request记录账号

  • 登录是一个请求,使用一个reqeust
  • 查询是另一个请求,使用另一个request

不同的请求无法通过request共享数据

2)使用config记录账号

  • 开发项目时可能采用多个Servlet处理不同的请求
  • 可能登录是一个Servlet,它使用一个config
  • 可能查询是另一个Servlet,它使用另一个config

不同的Servlet无法通过config共享数据

3)使用context记录账号

  • 浏览器和服务器是多对一的关系
  • 服务器会给每个项目只创建唯一的context
  • 多个浏览器都向这个对象中存数据,其key有冲突

使用一个对象无法给多个浏览器存储名称相同的数据

3.正确的解决方案

  • 使用cookie或session存储数据
  • 数据可以在多个请求之间共用
  • 数据可以在多个Servlet之间共用
  • 服务器会给每个浏览器创建一份cookie/session

上述3点由服务器保障

4.它们的区别

  • cookie存储在浏览器上,服务器压力小,但数据不安全
  • session存储在服务器上,服务器压力大,但数据安全

5.使用建议

  • 重要的数据存入session
  • 其他的数据存入cookie

Cookie

1.案例


2.归纳

2.1基本语法

  • 如何创建cookie
  • 如何获取cookie
  • 如何修改cookie

2.2扩展点

  • 如何修改生存时间
  • 如何存中文
  • 如何修改有效路径

四.Session

1.案例


代码如下:

Cookie:

package web;import java.io.IOException;import java.net.URLEncoder;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 登陆检查,判断帐号密码是否正确 * 相当于NETCTOSS中的MainServlet.login() * */public class LoginServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {//接收参数(帐号密码)String code = req.getParameter("code");//检查通过后将帐号存入cookie//每个cookie对象只能存一条数据,包括key和value,都是字符串Cookie c1 = new Cookie("code", code);//声明Cookie的生存时间,默认<0,存yu内存,浏览器关闭则删除//>0,Cookie保存在客户端的硬盘上,时间过期后删除//=0,Cookie被浏览器删除c1.setMaxAge(6000);//设置cookie的有效路径c1.setPath(req.getContextPath());//或者c1.setPath("/jsp2")//将cookie发送给浏览器.浏览器会自动保存res.addCookie(c1);//创建Cookie存入中文Cookie c2 = new Cookie("city",URLEncoder.encode("北京", "utf-8"));res.addCookie(c2);}}
package web;import java.io.IOException;import java.io.PrintWriter;import java.net.URLDecoder;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 模拟打开主页功能 * 相当于NETCTOSS中的MainServlet.toIndex() * */public class IndexServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {//向浏览器输出主页的内容(略)//获取cookieCookie[] cs = req.getCookies();//将他们输出给浏览器if(cs != null){res.setContentType("text/html;charset=utf-8");PrintWriter out = res.getWriter();for(Cookie c : cs){out.println(c.getName()+":"+URLDecoder.decode(c.getValue(), "utf-8"));}out.close();}}}
package web;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 模拟查询资费 * 相当于NETCTOSS中的MainServlet.findCost() */public class FindCostServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {//模拟查询资费(略)//获取cookie中的帐号,并将其输出Cookie[] cs = req.getCookies();if(cs != null){res.setContentType("text/html;charset=utf-8");PrintWriter out = res.getWriter();for(Cookie c : cs){out.println(c.getName()+":"+c.getValue());}out.close();}}}
配置文件:

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">  <display-name>jsp2</display-name>  <welcome-file-list>    <welcome-file>index.html</welcome-file>    <welcome-file>index.htm</welcome-file>    <welcome-file>index.jsp</welcome-file>    <welcome-file>default.html</welcome-file>    <welcome-file>default.htm</welcome-file>    <welcome-file>default.jsp</welcome-file>  </welcome-file-list>    <!-- 登录 -->  <servlet>    <servlet-name>login</servlet-name>    <servlet-class>web.LoginServlet</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>login</servlet-name>    <url-pattern>/main/login</url-pattern>  </servlet-mapping>    <!-- 主页 -->  <servlet>    <servlet-name>index</servlet-name>    <servlet-class>web.IndexServlet</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>index</servlet-name>    <url-pattern>/main/index</url-pattern>  </servlet-mapping>    <!-- 查询 -->  <servlet>    <servlet-name>findCost</servlet-name>    <servlet-class>web.FindCostServlet</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>findCost</servlet-name>    <url-pattern>/cost/find</url-pattern>  </servlet-mapping></web-app>
输入请求路径:http://localhost:8080/jsp2/main/login?code=caocao

再输入city:北京 code:caocao

则网页显示  city:北京 code:caocao

再输入:http://localhost:8080/jsp2/cost/find

则网页显示  code:caocao

----------------------------------------------------------------------------------------------------------------------------------------------------------------

session:

package web;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class LoginServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {//接收帐号String code = req.getParameter("code");//存入session//session是存储在服务器上的对象,可以存储任意类型的数据HttpSession session = req.getSession();session.setAttribute("code", code);//响应时会自动创建cookie,将session的ID通过cookie发送发给浏览器}}
package web;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class IndexServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {HttpSession session = req.getSession();String code = (String)session.getAttribute("code");//由于本次请求浏览器传入了ID,服务器就根据此ID找到之前存入的session对象res.setContentType("text/html;charset=utf-8");PrintWriter out = res.getWriter();out.println("code:"+code);out.close();} }
配置文件:

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">  <display-name>jsp3</display-name>  <welcome-file-list>    <welcome-file>index.html</welcome-file>    <welcome-file>index.htm</welcome-file>    <welcome-file>index.jsp</welcome-file>    <welcome-file>default.html</welcome-file>    <welcome-file>default.htm</welcome-file>    <welcome-file>default.jsp</welcome-file>  </welcome-file-list>    <servlet>    <servlet-name>login</servlet-name>    <servlet-class>web.LoginServlet</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>login</servlet-name>    <url-pattern>/main/login</url-pattern>  </servlet-mapping>      <servlet>    <servlet-name>index</servlet-name>    <servlet-class>web.IndexServlet</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>index</servlet-name>    <url-pattern>/main/index</url-pattern>  </servlet-mapping>    <session-config>    <session-timeout>1</session-timeout>  </session-config>  </web-app>
输入请求路径:http://localhost:8080/jsp3/main/login?code=zhangsan

再输入:http://localhost:8080/jsp3/main/index

网页显示  code:zhangsan

若过两三分钟刷新页面后code:null   此时session超时





原创粉丝点击