Cookie

来源:互联网 发布:网络汉语教师 编辑:程序博客网 时间:2024/06/11 02:26

Cookie


      Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key和value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。
      Cookies最典型的应用:1.判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入
     此网站时保留用户信息以便简化登录手续。
   2.另一个重要应用场合是“购物车”之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择     不同的商品,这些信息都会写入Cookies,以便在最后付款时提取信息。
Cookie就自动地在Web服务器和浏览器之间来回传递的一小块信息。
Cookie适用于那些需要跨越许多页面的信息。Cookie是属于浏览器端的技术。
Cookie的原理:把共享数据存储在浏览器中,每次请求再把共享数据带到服务端。


1. 在服务器端创建一个Cookie
Cookie cookie = new Cookie("name",name);
2. 把Cookie交还给浏览器
response.addCookie(cookie);
3. 从Cookie中取值
//拿到所有的Cookies
Cookie[] cookies = req.getCookies();
//判断Cookies是否为空
if(cookies!=null){
//遍历Cookies,根据它的key(name),拿到相应的值
for (Cookie cookie : cookies) {
if("name".equals(cookie.getName())){
name = cookie.getValue();
}
}
}
4.解决Cookie不支持中文的问题
传过去的参数要先进行编码:URLEncoder.encode(name, "UTF-8");
从Cookie中拿到参数后要进行解码: URLDecoder.decode(name, "UTF-8");

5.修改Cookie
第一种方式:设置新的值
cookie.setValue("新的值"); 
第二种方式:创建一个新的Cookie,名称一样,进行覆盖
Cookie temp = new Cookie("name","xxxx");
resp.addCookie(cookie); //千万不要忘了修改后交还给浏览器

6.Cookie的生命周期
我们自己创建出来的
默认情况下:当浏览器关闭的时候,Cookie就没有了
我们也可以自己去设置 Cookie到底活多长时间 :cookie.setMaxAge(5); (单位是秒)
7.删除一个Cookie的数据:cookie.setMaxAge(0); 设置存活时间为0即是删除

8.Cookie的路径,cookie的位置是默认在创建它的那一个位置
但是很多时候,咱们整个项目都要使用Cookie.
我们就需要把它的路径设置在根目录下面:cookie.setPath("/");

使用cookie模拟邮箱登录
/** *  邮箱的主界面(第一页面) * */@WebServlet("/cookie/main")public class MainServlet 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");//根据名称获取用户传过来的数据信息String name = req.getParameter("name");/** * 解决cookie不支持中文问题 * 步骤:1、先编码    URLEncoder.encode(String s,String enc) * 2.解码 * *///URLEncoder.encode(name, "UTF-8")这句代码表示把传过来的数据是编码之后的数据,解决了中文问题//在服务器端创建一个cookieCookie cookie = new Cookie("name",URLEncoder.encode(name, "UTF-8"));//把cookie路径设置在根目录下面cookie.setPath("/");cookie.setDomain(".baidu.com");//设置二级域名 了解即可//将cookie交还给浏览器resp.addCookie(cookie);PrintWriter writer = resp.getWriter();writer.println("欢迎您:"+name+"<br />");writer.println("<a href='/list'>您有五封邮件未读!!</a>");}}

/** *  邮箱的邮件列表(第二页面) * */@WebServlet("/list")public class ListServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");resp.setContentType("text/html;Charset=UTF-8");String name = "";//拿到所有的cookiesCookie[] cookies = req.getCookies();//判断cookies是否为空if(cookies!=null){//遍历cookies,根据它的key,拿到对应的值for (Cookie cookie : cookies) {if("name".equals(cookie.getName())){name = cookie.getValue();//进行解码,解决中文问题(因为这里传过来的数据是编码后的数据)name = URLDecoder.decode(name, "UTF-8");/** *  第一种修改cookie中值得方法 *  cookie.setValue(String newValue) *  resp.addCookie(Cookie cookie) *  第二种修改cookie的方法:创建一个新的Cookie,名称一样,进行覆盖 *  采用覆盖原有cookie的办法,但是也必须重新把cookie交还给浏览器 *  Cookie temp = new Cookie("name","xxxxx") * *///修改cookie中指定的值cookie.setValue("66666");//修改cookie后的值必须交还给浏览器resp.addCookie(cookie);}}}PrintWriter writer = resp.getWriter();writer.println("欢迎您:"+name+"<br />");for(int i=1;i<=5;i++){writer.println("<br /> <a href='/cookie/oneinfo'>第"+i+"封邮件!!</a>");}}}

/** *   邮箱中某封邮件具体的内容页面(第三页面) * */@WebServlet("/cookie/oneinfo")public class OneInfoServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");resp.setContentType("text/html;Charset=UTF-8");String name ="";//拿到所有的cookiesCookie[] cookies = req.getCookies();//判断cookies是否为空if(cookies!=null){//遍历cookies,根据它的key,拿到对应的值for (Cookie cookie : cookies) {if("name".equals(cookie.getName())){name = cookie.getValue();//进行解码,解决中文问题(因为这里传过来的数据是编码后的数据)name = URLDecoder.decode(name, "UTF-8");}}}PrintWriter writer = resp.getWriter();writer.println("欢迎您:"+name+"<br />");writer.print("明天一起敲代码");}}