zoukankan      html  css  js  c++  java
  • 【JavaWeb 实际项目_Cookie&Session 06】

    一、Cookie

    1、什么是Cookie

    cookie是服务器通知客户端保存键值对的一种技术

    客户端有了cookie以后,每次请求都发送给服务器

    每个cookie的大小都不能超过4kb

    2、如何创建Cookie

    1)创建cookie-session的JavaWeb项目-->com.wufq.servelt包-->CookieServlet类、BaseServlet类(导入book已有的)

    2)修改web.xml的请求路径

     <servlet>
            <servlet-name>CookieServlet</servlet-name>
            <servlet-class>com.wufq.servlet.CookieServlet</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>CookieServlet</servlet-name>
            <url-pattern>/cookieServlet</url-pattern>
        </servlet-mapping>

    3)修改cookie.html的请求地址

    <title>Cookie</title>
        <base href="http://localhost:8080/cookie_session/">
    <style type="text/css">
    
        ul li {
            list-style: none;
        }
        
    </style>
    </head>
    <body>
        <iframe name="target" width="500" height="500" style="float: left;"></iframe>
        <div style="float: left;">
            <ul>
                <li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li>
                <li><a href="" target="target">Cookie的获取</a></li>
                <li><a href="" target="target">Cookie值的修改</a></li>
                <li>Cookie的存活周期</li>

    4)CookieServlet类创建createCookie方法(实现cookie对象的实现)

    public class CookieServlet extends BaseServlet{
    
        protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            //1、创建cookie对象
            Cookie cookie = new Cookie("key1", "value1");
            //2、通知客户端保存cookie
            resp.addCookie(cookie);
            
            resp.getWriter().write("Cookie创建成功!");
        }

    5)启动程序以后,测试发现:存在两个问题:

    5.1)显示到浏览器上面的中文出现乱码

    5.2) cookie可以一次创建多个cookie,并且一定要用response.addCookie(cookie)通知客户端,否则客户端接收不到cookie信息

    解决这两个问题的方法:

    第一个问题的解决方法:在BaseServlet的doPost请求内加上

    @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String action = req.getParameter("action");
            //解决post请求中文乱码问题
            //一定要在获取请求参数调用之前执行才有效
            req.setCharacterEncoding("UTF-8");
            //解决响应中文的乱码问题
            resp.setContentType("text/html;charset=UTF-8");
    
            try {
    //          //通过反射获取login,regist方法
                Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
                //调用方法
                method.invoke(this,req, resp);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    第二个问题实现的方式:

    在CookieServlet类内多创建几个Cookie对象

            Cookie cookie2 = new Cookie("key2", "value2");
            resp.addCookie(cookie2);
            
            Cookie cookie3 = new Cookie("key3", "value3");
            resp.addCookie(cookie3);

    验证:响应头Set-cookie保存cookie的键值对

    3、cookie的获取

    1)服务器获取客户端的Cookie只需要一行代码:req.getCookie():Cookie[]

    protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            Cookie[] cookies = req.getCookies();
            for(Cookie cookie : cookies) {
                /*
                *
                 * cookie.getName() 获取cookie的key
                 * cookie.getValue() 获取cookie的value
                */
                resp.getWriter().write("Cookie[ "+cookie.getName()+":"+cookie.getValue()+" ]"+"</br>");
            }
            Cookie iWantCookie = CookieUtil.findCookie("key2",cookies);
            
            if (iWantCookie != null) {
                resp.getWriter().write("找到了需要cookie");
            }
        }

    除了去获取全部的cookie,在实际项目中还常用cookie的key去查找对应的值==>这种通用的方法一般会写成工具类

    cookieUtil类

    public class CookieUtil {
    
        public static Cookie findCookie(String name,Cookie[] cookies){
            if(name == null||cookies==null||cookies.length == 0){
                return null;
            }
            for(Cookie cookie : cookies) {
                if (cookie.getName().equals(name)) {
                    return cookie;
                }
            }
            return null;
        }
    }

    4、修改cookie

    protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           /*
           * 第一种方式:
           * 1、创建一个要修改的同名的cookie对象
           * 2、在构造器内重新赋值
           * 3、把cookie返回给浏览器
            */
            Cookie cookie = new Cookie("key1", "newValue1");
            resp.addCookie(cookie); 
    
            /*
            * 第二种方式:
            * 1、查找到cookie的值
            * 2、用setCookie修改
            * 3、返回给浏览器
            */
            Cookie key2 = CookieUtil.findCookie("key2", req.getCookies());
            key2.setValue("newValue2");
            resp.addCookie(key2);
        }

    5、Cookie的生命控制

    指的设置cookie的失效时间

    setMaxAge()  -->主要由这个方法控制

    正数:表示在指定的描述后过期

    负数:表示浏览器一关,Cookie就会被删除(默认值是-1)

    零:表示马上删除

     protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            Cookie cookie = new Cookie("default","default");
            cookie.setMaxAge(-1);
            resp.addCookie(cookie);
        }
        protected void nowDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            Cookie cookie = new Cookie("nowDelete","nowDelete");
            cookie.setMaxAge(0);
            resp.addCookie(cookie);
            resp.getWriter().write("nowDelete被删除");
        }
    
        protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            Cookie cookie = new Cookie("life3600","life3600");
            cookie.setMaxAge(30);
            resp.addCookie(cookie);
            resp.getWriter().write("life3600");
        }

    6、cookie有效路径Path设置

    cookie的path属性可以有效的过滤那些cookie可以发送给服务器,那些不发

    path属性通过请求地址来进行有效的过滤

    比如:

    cookieA   path:/工程名

    cookie    path: /工程名/abc

    请求的地址如下:http://localhost:8080/工程名/a.html

    cookieA和CookieB都发送

    http://localhost:8080/工程名/abc/a.html

    cookieA不发送,CookieB发送

    protected void pathCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            Cookie cookie = new Cookie("path","path");
            cookie.setPath(req.getContextPath()+"/abc");
            resp.addCookie(cookie);
            resp.getWriter().write("创建了一个带path路径的cookie");
        }

    #Cookie练习:免输入用户名登录

  • 相关阅读:
    Effective Go(官方文档)笔记
    Python中的列表、元祖、字典
    obj-c编程15[Cocoa实例02]:KVC和KVO的实际运用
    HDU 3435A new Graph Game(网络流之最小费用流)
    蜗牛—Android基础之button监听器
    网络流小结
    Android 音频的播放之二MediaPlayer
    零基础学python-3.7 还有一个程序 python读写文本
    BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第11章节--为Office和SP解决方式开发集成Apps Office的JavaScript对象模型
    jdk的动态代理源代码解析
  • 原文地址:https://www.cnblogs.com/frankruby/p/15107860.html
Copyright © 2011-2022 走看看