会话技术

来源:互联网 发布:mac怎么移动文件 编辑:程序博客网 时间:2024/06/16 04:12

web应用中路径问题

  • 案例
  • /** * web应用中路径问题 * @author APPle * */public class PathDemo extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html;charset=utf-8");        //目标资源: target.html        /**         * 思考: 目标资源是给谁使用的。         *      给服务器使用的:   / 表示在当前web应用的根目录(webRoot下)         *      给浏览器使用的: /  表示在webapps的根目录下         */        /**         * 1.转发         */        //request.getRequestDispatcher("/target.html").forward(request, response);        /**         * 2.请求重定向         */        //response.sendRedirect("/day11/target.html");        /**         * 3.html页面的超连接href         */        response.getWriter().write("<html><body><a href='/day11/target.html'>超链接</a></body></html>");        /**         * 4.html页面中的form提交地址         */        response.getWriter().write("<html><body><form action='/day11/target.html'><input type='submit'/></form></body></html>");    }}

读取web应用下的资源文件(例如properties)

  • 案例
    /**
    * 读取web应用下的资源文件(例如properties)
    * @author APPle
    */
    public class ResourceDemo extends HttpServlet {

            public void doGet(HttpServletRequest request, HttpServletResponse response)                throws ServletException, IOException {            /**             *  . 代表java命令运行目录。java运行命令在哪里?? 在tomcat/bin目录下             *   结论: 在web项目中, . 代表在tomcat/bin目录下开始,所以不能使用这种相对路径。             */             //读取文件。在web项目下不要这样读取。因为.表示在tomcat/bin目录下            /*File file = new File("./src/db.properties");            FileInputStream in = new FileInputStream(file);*/            /**             * 使用web应用下加载资源文件的方法             */            /**             * 1. getRealPath读取,返回资源文件的绝对路径             */            /*String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");            System.out.println(path);            File file = new File(path);            FileInputStream in = new FileInputStream(file);*/            /**             * 2. getResourceAsStream() 得到资源文件,返回的是输入流             */            InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");            Properties prop = new Properties();            //读取资源文件            prop.load(in);            String user = prop.getProperty("user");            String password = prop.getProperty("password");            System.out.println("user="+user);            System.out.println("password="+password);        }    }

{会话管理入门}

生活中会话

            我: 小张,你会跳小苹果码?            小张: 会,怎么了?            我: 公司年会上要表演节目,你教教我把            小张:没问题,一顿饭而已。            我: OK。            。。。。。。。。在这次生活中的会话中产生通话记录(会话数据)

软件中的会话

一次会话: 打开浏览器 -> 访问一些服务器内容 -> 关闭浏览器

登录场景

打开浏览器 -> 浏览到登陆页面 -> 输入用户名和密码 -> 访问到用户主页(显示用户名)                                                            修改密码(输入原密码)问题:在此处登录会话过程中产生的数据(用户会话数据)如何保存下来呢?

购物场景

打开浏览器 -> 浏览商品列表  -> 加入购物车(把商品信息保存下来)  -> 关闭浏览器         打开浏览器->  直接进入购物车 -> 查看到上次加入购物车的商品 -> 下订单 -> 支付问题: 在购物会话过程中,如何保存商品信息??
会话管理: 管理浏览器客户端 和 服务器端之间会话过程中产生的会话数据。
域对象: 实现资源之间的数据共享。            request域对象            context域对象

登录场景:

        小张: 输入“张三” (保存数据: context.setAttribute("name","张三")) -> 用户主页(显示“张三”)        小李: 输入“李四”(保存数据:context.setAttribute("name","李四")) ->   用户主页(显示“李四”)            问题: context是所有用户公有的资源?会覆盖数据。        小张: 输入“张三”(保存数据: request.setAttribute("name","张三"))- > 用户主页(显示“张三”)                             问题: 一定要使用转发技术来跳转页面?

解决办法: 可以使用session域对象来保存会话数据.

会话技术

Cookie技术:会话数据保存在浏览器客户端。Session技术:会话数据保存在服务器端。

Cooke技术

Cookie技术:会话数据保存在浏览器客户端。 

Cookie技术核心

Cookie类:用于存储会话数据            1)构造Cookie对象                Cookie(java.lang.String name, java.lang.String value)            2)设置cookie                void setPath(java.lang.String uri)   :设置cookie的有效访问路径                void setMaxAge(int expiry) : 设置cookie的有效时间                void setValue(java.lang.String newValue) :设置cookie的值            3)发送cookie到浏览器端保存                void response.addCookie(Cookie cookie)  : 发送cookie            4)服务器接收cookie                Cookie[] request.getCookies()  : 接收cookie

第一个cookie的程序

  • 案例

    public class CookieDemo1 extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        //1.创建Cookie对象        Cookie cookie1 = new Cookie("name","eric");        /**         * 1)设置cookie的有效路径。默认情况:有效路径在当前web应用下。 /day11         */        //cookie1.setPath("/day11");        /**         * 2)设置cookie的有效时间         * 正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。            负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!!            零:表示删除同名的cookie数据         */        //cookie1.setMaxAge(20); //20秒,从最后不调用cookie开始计算        cookie1.setMaxAge(-1); //cookie保存在浏览器内存(会话cookie)        //cookie1.setMaxAge(0);        //2.把cookie数据发送到浏览器        //推荐使用这种方法,避免手动发送cookie信息        response.addCookie(cookie1);        //3.接收浏览器发送的cookie信息        Cookie[] cookies = request.getCookies();        //注意:判断null,否则空指针        if(cookies!=null){            //遍历            for(Cookie c:cookies){                String name = c.getName();                String value = c.getValue();                System.out.println(name+"="+value);            }        }else{            System.out.println("没有接收cookie数据");        }    }}

删除cookie

  • 案例

    public class DeleteCookie extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        /**         * 需求: 删除cookie         */        Cookie cookie = new Cookie("name","xxxx");        cookie.setMaxAge(0);//删除同名的cookie        response.addCookie(cookie);        System.out.println("删除成功");    }}

案例-用户上次访问时间

  • 案例

    public class HistServlet extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html;charset=utf-8");        //获取当前时间        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");        String curTime = format.format(new Date());        //取得cookie        Cookie[] cookies = request.getCookies();        String lastTime = null;        if(cookies!=null){            for (Cookie cookie : cookies) {                if(cookie.getName().equals("lastTime")){                    //有lastTime的cookie,已经是第n次访问                    lastTime = cookie.getValue();//上次访问的时间                    //第n次访问                    //1.把上次显示时间显示到浏览器                    response.getWriter().write("欢迎回来,你上次访问的时间为:"+lastTime+",当前时间为:"+curTime);                    //2.更新cookie                    cookie.setValue(curTime);                    cookie.setMaxAge(1*30*24*60*60);                    //3.把更新后的cookie发送到浏览器                    response.addCookie(cookie);                    break;                }            }        }        /**         * 第一次访问(没有cookie 或 有cookie,但没有名为lastTime的cookie)         */        if(cookies==null || lastTime==null){            //1.显示当前时间到浏览器            response.getWriter().write("你是首次访问本网站,当前时间为:"+curTime);            //2.创建Cookie对象            Cookie cookie = new Cookie("lastTime",curTime);            cookie.setMaxAge(1*30*24*60*60);//保存一个月            //3.把cookie发送到浏览器保存            response.addCookie(cookie);        }    }}

Session技术

        Cookie的局限:            1)Cookie只能存字符串类型。不能保存对象            2)只能存非中文。            3)1个Cookie的容量不超过4KB。        如果要保存非字符串,超过4kb内容,只能使用session技术!!!        Session特点:                会话数据保存在服务器端。(内存中)

Session技术核心

HttpSession类:用于保存会话数据            1)创建或得到session对象                HttpSession getSession()                  HttpSession getSession(boolean create)              2)设置session对象                void setMaxInactiveInterval(int interval)  : 设置session的有效时间                void invalidate()     : 销毁session对象                java.lang.String getId()  : 得到session编号            3)保存会话数据到session对象                void setAttribute(java.lang.String name, java.lang.Object value)  : 保存数据                java.lang.Object getAttribute(java.lang.String name)  : 获取数据                void removeAttribute(java.lang.String name) : 清除数据

Session原理

问题: 服务器能够识别不同的浏览者!!!
现象:

   前提: 在哪个session域对象保存数据,就必须从哪个域对象取出!!!!        浏览器1:(给s1分配一个唯一的标记:s001,把s001发送给浏览器)                1)创建session对象,保存会话数据                        HttpSession session = request.getSession();   --保存会话数据 s1        浏览器1    的新窗口(带着s001的标记到服务器查询,s001->s1,返回s1)                 1)得到session对象的会话数据                        HttpSession session = request.getSession();   --可以取出  s1        新的浏览器1:(没有带s001,不能返回s1)                1)得到session对象的会话数据                        HttpSession session = request.getSession();   --不可以取出  s2        浏览器2:(没有带s001,不能返回s1)                1)得到session对象的会话数据                        HttpSession session = request.getSession();  --不可以取出  s3        代码解读:HttpSession session = request.getSession();        1)第一次访问创建session对象,给session对象分配一个唯一的ID,叫JSESSIONID                new HttpSession();        2)把JSESSIONID作为Cookie的值发送给浏览器保存                Cookie cookie = new Cookie("JSESSIONID", sessionID);                response.addCookie(cookie);        3)第二次访问的时候,浏览器带着JSESSIONID的cookie访问服务器        4)服务器得到JSESSIONID,在服务器的内存中搜索是否存放对应编号的session对象。                if(找到){                    return map.get(sessionID);                }                Map<String,HttpSession>]                <"s001", s1>                <"s001,"s2>        5)如果找到对应编号的session对象,直接返回该对象        6)如果找不到对应编号的session对象,创建新的session对象,继续走1的流程        结论:通过JSESSION的cookie值在服务器找session对象!!!!!

Sesson细节

        1)java.lang.String getId()  : 得到session编号        2)两个getSession方法:                getSession(true) / getSession()  : 创建或得到session对象。没有匹配的session编号,自动创                                                建新的session对象。                getSession(false):              得到session对象。没有匹配的session编号,返回null        3)void setMaxInactiveInterval(int interval)  : 设置session的有效时间                    session对象销毁时间:                        3.1 默认情况30分服务器自动回收                        3.2 修改session回收时间                        3.3 全局修改session有效时间                            <!-- 修改session全局有效时间:分钟 -->                            <session-config>                                <session-timeout>1</session-timeout>                            </session-config>                        3.4.手动销毁session对象                            void invalidate()     : 销毁session对象        4)如何避免浏览器的JSESSIONID的cookie随着浏览器关闭而丢失的问题                            //手动发送一个硬盘保存的cookie给浏览器            Cookie c = new Cookie("JSESSIONID",session.getId());            c.setMaxAge(60*60);            response.addCookie(c);

总结:

            1)会话管理: 浏览器和服务器会话过程中的产生的会话数据的管理。            2)Cookie技术:                    new Cookie("name","value")                    response.addCookie(coookie)                    request.getCookies()            3)Session技术                    request.getSession();                    setAttrbute("name","会话数据");                    getAttribute("会话数据")
1 0