JavaWeb——Cookie 与 Session

本文介绍了会话的概念,Cookie和Session两种常用会话技术,包括Cookie的工作原理、创建与使用,以及Session的服务器端实现、获取、生命周期管理,重点讲解了如何通过Cookie记录登录状态和Session在登录过程中的应用。
摘要由CSDN通过智能技术生成

目录

1、简介

1.1、什么是会话

1.2、会话的作用

1.3、常用的会话技术

1.4、Cookie

1.4.1 什么是Cookie?

1.4.2、Cookie的说明

1.4.3、Cookie的创建

1.4.4、记录客户上次登录时间

​编辑

1.5、Session

1.5.1、什么是Session

1.5.2、获得Session对象

1.5.3、Session什么情况会销毁

1.5.4、登录


1、简介

1.1、什么是会话

用户打开浏览器,浏览不同的网页(资源),发出多个请求,直到关闭浏览器的过程,称为一次会话(多次请求)。

1.2、会话的作用

我们在会话的过程(多次请求)之中,用户可能会产生一些数据,这些数据话有的需要保存起来的,我们就可以通过会话技术保存用户各自的数据。

1.3、常用的会话技术

常用的会话技术Cookie和Session。        

1.4、Cookie

1.4.1 什么是Cookie?

Cookie是客户端(浏览器)的技术,用户浏览的信息以键值对(key=value)的形式保存在浏览器上。如果没有关闭浏览器,再次访问服务器,会把cookie带到服务端,服务端就可以做响应的处理。

1.4.2、Cookie的说明

1.单个cookie大小不超过4kb。

2.同一个域名下cookie的数量一般不超过20个(浏览器不同,会不同)。

3.cookie用于存储少量不敏感的数据。

4.cookie可以用来区分不同的客户端(在不登录时候,配合session)。

1.4.3、Cookie的创建
//Cookie的创建
 Cookie  cookie = new Cookie(“username”,”haoren”)
//设置Cookie的存活时间(单位:秒)
cookie.setMaxAge(3600);
//(注意:正数:持久化(外存),负数:默认值(存在内存),零:删除cookie)
//设置Cookie的作用域
c.setPath("/");//所有webapp都可以看到这个cookie
c.setPath("/Web1")//只有Web1可以看到
//写出Cookie:
response.addCookie(c);

//读取cookie
Cookie[] cookies = request.getCookies();
1.4.4、记录客户上次登录时间
package com.org.controller;

import com.org.domain.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.*;

@WebServlet("/ServletDemo9")
public class ServletDemo9 extends HttpServlet{
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        Cookie[] cookies = req.getCookies();
        //当有time这个cookie时候设置为true
        boolean flag = false;
        if(cookies!=null && cookies.length>0){
            for (Cookie cookie : cookies) {
                if("time".equals(cookie.getName())){
                    flag = true;
                    //要处理编码的问题
                    resp.getWriter().print("上次访问时间:"+ URLDecoder.decode(cookie.getValue(), "utf-8"));
                    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    Cookie ck = new Cookie("time", URLEncoder.encode(sf.format(new Date()),"utf-8"));
                    ck.setMaxAge(3600);
                    ck.setPath("/servlet");
                    resp.addCookie(ck);
                    break;
                }
            }

            if(flag==false){
                SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Cookie ck = new Cookie("time", URLEncoder.encode(sf.format(new Date()),"utf-8"));
                ck.setMaxAge(3600);
                ck.setPath("/servlet");
                resp.addCookie(ck);
            }
        }

        if(cookies==null || cookies.length==0){

            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Cookie ck = new Cookie("time", URLEncoder.encode(sf.format(new Date()),"utf-8"));
            ck.setMaxAge(3600);
            ck.setPath("/servlet");
            resp.addCookie(ck);
        }


    }
}

1.5、Session

1.5.1、什么是Session

session是服务器端的技术。服务器为每一个浏览器开辟一块内存空间,即session。由于内存空间是每一个浏览器独享的,所有用户在访问的时候,可以把信息保存在session对象中。同时,每一个session对象都对应一个sessionId,服务器把sessionId写到cookie中,再次访问的时候,浏览器会把cookie(sessionId)带过来,找到对应的session对象。

1.5.2、获得Session对象
//获得Session对象
HttpSession session = request.getSession();
//域对象(多次请求共享数据):
session.setAttribute(String name,Object value)
session.getAttribute(String name)
session.removeAttribute(String name)
1.5.3、Session什么情况会销毁

1、Session在服务器关闭

        当服务器关闭(正常关闭和启动服务器,不能直接关闭虚拟机),两次获得的session对象还是同一个,tomcat帮我们做了session的钝化处理(将服务器内存中的session对象序列化到了外存中,见下图),

当服务器重启后又进行了session对象活化(又读入了内存)。

2、Session默认失效时间30分钟

  在工程中web.xml中修改存活时间

  <session-config>

  <session-timeout>30</session-timeout>

  </session-config>

  默认配置是配置在config下的web.xml

3、当浏览器关闭后,服务器不关闭,两次获得session不是同一个。

如果想要想要相同

  Cookie ck = new Cookie(“JSESSIONID”,sesssion.getId());

  ck.setMaxAge(3600);

  response.addCookie(c);

1.5.4、登录
/**
         * 登录
         */
        if ("login".equals(userAction)) {
            User user = new User();
                try {
                    BeanUtils.populate(user,req.getParameterMap());
                    Map<String, String> error = ValidateDemo.validateUser(user);
                    if (error.isEmpty()){
                        UserService userService = new UserService();
                        boolean flag = userService.login(user.getUsername(), user.getPassword());
                        if (flag){
                            //判断是否需要用户名和密码
                            String[] autoLogins = req.getParameterValues("autoLogin");
                            if (autoLogins != null && autoLogins.length > 0){
                                //记录用户名和密码
                                Cookie userCookie = new Cookie("username", user.getUsername());
                                Cookie psdCookie = new Cookie("password", user.getPassword());
                                userCookie.setMaxAge(2592000);
                                psdCookie.setMaxAge(2592000);
                                userCookie.setPath("/servlet");
                                psdCookie.setPath("/servlet");
                                resp.addCookie(userCookie);
                                resp.addCookie(psdCookie);
                                //设置一个登录成功的标志
                                req.getSession().setAttribute("username",user.getUsername());
                                req.getRequestDispatcher("/WEB-INF/pages/index.jsp").forward(req,resp);
                            }else {
                                req.getSession().setAttribute("username",user.getUsername());
                                req.getRequestDispatcher("/WEB-INF/pages/index.jsp").forward(req,resp);
                            }
                        }else {
                            req.setAttribute("fail","登录失败!");
                            req.getRequestDispatcher("login2.jsp").forward(req,resp);
                        }
                    }else {
                        req.setAttribute("error",error);
                        req.getRequestDispatcher("login2.jsp").forward(req,resp);
                    }
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
        }

登录成功之后记录用户名和密码自动进入到主页。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值