美文网首页
会话管理

会话管理

作者: 达摩君 | 来源:发表于2017-10-30 20:06 被阅读6次

会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
会话过程中要解决的一些问题?
每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。
例如:用户点击超链接通过一个servlet购买了一个商品,程序应该想办法保存用户购买的商品,以便于用户点结帐servlet时,结帐servlet可以得到用户购买的商品为用户结帐。

保存会话数据的两种技术

1、Cookie

Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
javax.servlet.http.Cookie类用于创建一个Cookie,response接口中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段。 同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie。Cookie类的方法:

  • public Cookie(String name,String value)
  • setValue与getValue方法
  • setMaxAge与getMaxAge方法 (秒)
  • setPath与getPath方法
  • setDomain与getDomain方法
  • getName方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");

        PrintWriter out = response.getWriter();

        Cookie[] cookies = request.getCookies();
        for (int i = 0; cookies != null && i < cookies.length; i ++) {
            out.write("aaaaaa");
            if (cookies[i].getName().equals("lastAccessTime")){
                out.write("bbbbb");
                long l = Long.parseLong(cookies[i].getValue());
                out.write("你上次登录时间为" + new Date(l).toString());
            }
        }

        Cookie cook = new Cookie("lastAccessTime",System.currentTimeMillis() + "");
        response.addCookie(cook);
    }
Cookie细节
  • 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
  • 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
    浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
  • 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
  • 注意,删除cookie时,path必须一致,否则不会删除
属性

name: 名称不能唯一确定一个cookie。路径可能不同
value: 不能存中文
path: 默认是写入cookie那个应用的访问路径
如:http://localhost:8080/day10/servlet/cookieDemo1
Path: /day10/servlet/
当客户端访问服务器其它资源时,根据访问路径来决定是否带着cookie到服务器
当访问的路径是以cookie中path开头的路径,就带cookie,否则就不带。
maxAge: cookie的保存时间。默认是-1(表示保存在浏览器的内存中)。
单位是秒
负数:cookie存在浏览器的内存中。
0:删除。路径要保持一致,否则会删错了。
正数:缓存(持久化到磁盘中)的时间

记住用户名

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

        String name = "";
        String check = "";

        Cookie[] cookies = request.getCookies();
        for (int i = 0; cookies!=null && i < cookies.length; i++) {
            if ("username".equals(cookies[i].getName())) {
                name = cookies[i].getValue();
                check = "checked='checked'";
            }
        }

        out.write("<form action = '"+request.getContextPath()+"/demo3' method = 'post'>");
        out.write("用户名:<input type='text' name='username' value='"+name+"'><br>");
        out.write("密码:<input type='password' name='psd'><br>");
        out.write("<input type='checkbox' name='remember' "+check+">记住用户名<br>");
        out.write("<input type='submit' value='登录'>");
        out.write("</form>");
    }
==============================
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        request.setCharacterEncoding("utf-8");

        PrintWriter out = response.getWriter();

        String username = request.getParameter("username");
        String password = request.getParameter("psd");
        String check = request.getParameter("remember");

        Cookie cookie = new Cookie("username",username);
        cookie.setPath("/");

        if ("ljb".equals(username) && "123".equals(password)) {
            out.print("登录成功");
            if (check != null) {

                cookie.setMaxAge(Integer.MAX_VALUE);
            } else {
                out.print("清除成功");
                cookie.setMaxAge(0);
            }
            response.addCookie(cookie);

        } else {
            out.print("登录失败");
            response.setHeader("refresh","2;url='"+request.getContextPath()+"/demo2'");
        }
    }
2、HttpSession

Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的HttpSession对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
Session和Cookie的主要区别在于:
Cookie是把用户的数据写给用户的浏览器。
Session技术把用户的数据写到用户独占的session中。
Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象

1、为什么要学HttpSession?

它也是一个域对象: session servletContext request
同一个会话下,可以使一个应用的多个资源共享数据
cookie客户端技术,只能存字符串。HttpSession服务器端的技术,它可以存对象

2、常用方法

把数据保存在HttpSession对象中,该对象也是一个域对象。
void setAttribute(String name,Object value);
Object getAttribute(String name);
void removeAttribute(String name);
HttpSession.getId():

setMaxInactiveInterval(int interval) 设置session的存活时间
invalidate() 使此会话无效

getSession():内部执行原理
HttpSession request.getSession():内部执行原理
1、获取名称为JSESSIONID的cookie的值。
2、没有这样的cookie,创建一个新的HttpSession对象,分配一个唯一的SessionID,并且向客户端写了一个名字为JSESSIONID=sessionID的cookie
3、有这样的Cookie,获取cookie的值(即HttpSession对象的值),从服务器的内存中根据ID找那个HttpSession对象:
找到了:取出继续为你服务。
找不到:从2开始。

HttpSession request.getSession(boolean create):
参数:
true:和getSession()功能一样。
false:根据客户端JSESSIONID的cookie的值,找对应的HttpSession对象,找不到返回null(不会创建新的,只是查询)

3、客户端禁用Cookie后的会话数据保存问题

客户端禁用cookie:浏览器永远不会向服务器发送cookie的请求消息头

解决方案:
方案一:在主页上给出提示:请不要禁用您的cookie
方案二:URL重写。必须对网站的所有地址都重写。

http://url--->http://url;JSESSIONID=111

response.encodeURL(String url);
看浏览器有没有发送cookie请求消息头,没有就重写URL,有就不重写。

request.getSession();必须写

相关文章

  • day12_编码实战&Jsp基础

    1课程回顾 会话管理 1)会话管理:管理浏览器和服务器之间的会话过程中产生的会话数据 2)Cookie技术:会话数...

  • 会话管理

    会话? 使用Cookie实现会话管理 HttpSession HttpSession原理

  • 会话管理

    会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会...

  • 会话管理

    一、会话的必要性:客户跟踪 Http协议是无状态协议,Web服务器没有短期记忆。在有些应用场景(例如:购物车)下,...

  • 会话管理

    1.加载web应用资源文件 这两句在Servlet中是等价的。 在servlet中,只要是路径就要写/。 思考:目...

  • 会话管理

    1、什么是会话管理? 我们都知道HTTP协议是无状态协议。啥意思呢?就是请求完成连接就断开了,下次再请求的时...

  • 会话管理

    会话管理 用户通过Web应用程序进行登录到退出这一过程中其中有一个阶段就是服务端会给登录成功的客户端生成一个Ses...

  • web安全总结(三)

    三、因会话管理疏忽引发的安全漏洞 会话管理是用来管理用户状态的必备功能,但是如果在会话挂你上有所疏忽,就会导致用户...

  • 远程桌面

    会话连接数设置 "管理员"帐号登录 开始 -> 管理工具 -> 远程桌面服务 ->远程桌面会话主机配置会话主机配置...

  • 子层功能

    NAS(非接入层)功能如下: 会话管理:包括会话建立、修改、释放及Qos协议 用户管理:包括用户数据管理,以及附着...

网友评论

      本文标题:会话管理

      本文链接:https://www.haomeiwen.com/subject/mbippxtx.html