JavaWeb学习(七)---会话/Cookie对象/Session对象/多个Web资源通过Session共享数据/如何注销Session

JavaWeb学习(七)—会话/Cookie对象/Session对象/多个Web资源通过Session共享数据/如何注销Session

​ 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。通常会话是长期保持的,无论用户关闭多少次浏览器,这个会话都要存在。每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。

​ 那么,客户端和服务器到底该如何保存这些数据呢?Java衍生了两个技术:SessionCookie

01 Cookie

Cookie客户端技术,服务器通过Response将每个用户的数据以Cookie的形式发送给浏览器,浏览器将其存储在自己的内存中,当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的Cookie去。服务器可以通过Request拿到该用户的Cookie。这样,web资源处理的就是用户各自的数据了。

如何创建Cookie

//name:标识该信息的名称 value:设置值
Cookie cookie = new Cookie(String name,String value);

服务器如何将Cookie响应回传给客户端

Response.addCookie(Cookie);

服务器如何查看客户端携带的Cookie

Cookie[] cookies = Request.getCookie();
Cookie.getName();
Cookie.getValue();

案例:使用cookie记录用户上一次访问的时间

public class CookieTest extends HttpServlet {
	
    //定义一个标志位,初始值为false,用来判断用户是否是第一次访问该url
    boolean flag = false;
    

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //避免乱码问题:
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        
        //通过请求获取用户的Cookie
        Cookie[] cookies = request.getCookies();

        if (flag){//flag=true,表示用户不是第一次访问该url
            if (cookies!=null){//你有cookie
                for (int i = 0; i < cookies.length ; i++) {
                    Cookie cookie = cookies[i];
                    if (cookie.getName().equals("lastLoginTime")){
                        response.getWriter().println("你上一次来的时间为:"+cookie.getValue());
                        System.out.println("刷新了cookie");
                    }
                }
            }
        }else { //flag=false,表示用户是第一次访问该url
            response.getWriter().println("这是您第一次访问该页面");
        }


        //建立一个cookie,并把这个cookie发给客户端
       response.addCookie(new Cookie("lastLoginTime",System.currentTimeMillis()+""));
       
        //将flag置为true,当用户再次访问该url时,会直接进入读取cookie的逻辑
       flag = true;


    }
}

注意事项

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

02 Session

Session服务器端技术默认情况下,一个浏览器独占一个session对象。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。可以通俗的理解为,一个用户可以通过一个Session访问多个Web资源,且各个Web资源可以通过Session读取保存的用户数据。

Session实现原理:服务器创建session出来后,会把session的id号,cookie的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着sessionid号去,服务器通过识别客户机浏览器的session_id,就会使用内存中与之对应的session为之服务。

事实上,只要客户端一旦连接上服务器,服务器就会自动产生Session,Session可以在一个会话中传递数据(即多个程序通过session获取数据),如果服务器重启,存储在session中的数据就会丢失

如何获取Session对象

//使用request对象的getSession()获取session,如果session不存在则创建一个
HttpSession session = request.getSession();
//获取session的Id
String sessionId = session.getId();
//判断session是不是新创建的
if (session.isNew()) {
     response.getWriter().print("session创建成功,session的id是:"+sessionId);
}else {
     response.getWriter().print("服务器已经存在session,session的id是:"+sessionId);
}
  • 案例:多个Web资源通过Session共享数据
public class SessionTest01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html");

        HttpSession session = req.getSession();
        String id = session.getId();
        resp.getWriter().println("

获得一个sessionId:

"
+id); String name = "Curry"; session.setAttribute("username",name); resp.getWriter().println("

当前session设置了一个用户名:

"
+name); } }
public class SessionTest02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setCharacterEncoding("UTF-8");

        resp.setCharacterEncoding("UTF-8");

        resp.setContentType("text/html");

        String  username = (String) req.getSession().getAttribute("username");

        resp.getWriter().println("

从session中获取到的用户名为:

"
+username); } }

运行结果:
JavaWeb学习(七)---会话/Cookie对象/Session对象/多个Web资源通过Session共享数据/如何注销Session_第1张图片
JavaWeb学习(七)---会话/Cookie对象/Session对象/多个Web资源通过Session共享数据/如何注销Session_第2张图片

  • 如何注销Session?

    session对象默认30分钟没有使用,则服务器会自动销毁session

    可以使用以下两种方式注销Session:

    • 需要在程序中手动设置Session失效时,通过invalidate();注销当前Session。
    request.getSession().invalidate();
    
    • web.xml文件中配置session的失效时间 :
    
    <session-config>
        <session-timeout>15session-timeout>
    session-config>
    

03 Session和Cookie的区别

Cookie是把用户的数据写给用户的浏览器,属于客户端技术

Session是把用户的数据写到用户独占的session中,属于服务端技术

Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。


你可能感兴趣的:(JavaWeb)