会话之Cookie和Session的使用


**会话:**在Web中,会话表示从浏览器打开某个网站和服务器进行交互,无论进行哪些操作,直到关闭浏览器,这个过程,称之为一次会话
如何算会话结束:

  • 客户端关闭
  • 服务器销毁
    会话所涉及的两个端(客户端和服务端),JavaWeb中针对这两个不同的端,诞生了两个机制
    客户端来看,诞生了Cookie,在本地浏览器留下了标识符,会话从浏览器中提交信息
    服务器端来看,诞生了Session,再服务器端留下了标识符,会话从服务器中提交信息
Cookie

构造器:

Cookie cookie =new Cookie(String name ,String value);

服务器响应cookie给客户端

Response.addCookie(cookie);

服务查看用户带来的请求中是否含有cookie

//可以使用cookie来判断用户是否来过
Cookie[] cookie=Request.getCookie();
//判断cookie是否为空,然后遍历
For(int i=0;i<cookie.length;i++){
	Cookie cookie=cookie[i];
	cookie.getName();
	cookie.getValue();
}
cookie示例:

需求:通过cookie判断用户是否来过,若没有来过,就让他办张卡0_0,若来过,显示上次来的时间

public class CookieTest extends HttpServlet {
	//设置全局标识符
    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
        Cookie[] cookies = request.getCookies();
        System.out.println("cookie:"+cookies);
        if (flag){//如果flag是真,来过
            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是真,没来过
            response.getWriter().println("你是第一次来,还想要会员套餐");
            System.out.println("给该用户一个cookie");
        }

        //建立一个cookie
        Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
        //设置cookie保存的时间 //cookie.setMaxAge();
        //把这个cookie发给客户端
        response.addCookie(cookie);
        //response.addCookie(new Cookie("lastLoginTime",System.currentTimeMillis()+""));
        flag = true;
    }
}

(别忘记配置web.xml…)
第一次访问的时候,自上而下,还没有创建cookie,因此,此时标识符判断会进入else{}里,接着代码执行,创建cookie,在我们刷新页面后,因为cookie已经在上次创建了,因此这次就会变成了第二次访问,会随之打印上次来的时间
有一个点:在给cookie添加value属性的上次时间时,value应为String类型,我们可以使用System.currentTimeMillis+""拼接的形式,将时间和空字符串拼接来实现

Session

只要客户端一旦连接上服务器,服务器就会自动产生Session;

一个连接对应一个session,session可以在一个会话中传递信息;

        //得到sessionID,一次会话,一个seesionID;
        HttpSession session =req.getSession();
        String id = session.getId();
        //输出在网页中
        resp.getWriter().println("获得的sessionId:\n"+id);

通过setAttribute设置值。

通过getAttribute获得值。

由服务器端控制,服务器如果重启了,信息就会丢失!

Session示例

需求:使用session在两个servlet之间进行传递数据

servlet01:(将数据写入session中,并输出Sessionid)
public class SessionTest 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");
        //Session由服务器自动创建,如何获得session
        //HttpSession 得到的sessioin对象
        HttpSession session = req.getSession();
        //得到sessionID,一次会话,一个seesionID;
        String id = session.getId();
        resp.getWriter().println("获得的sessionId:\n"+id);
        String name = "暮凌寒雪";
        //向session中存入一个值;
        session.setAttribute("name",name);
        resp.getWriter().println("存入信息成功:"+name);
    }
}
servlet02:将session中的值读取出来,并输出sessionid
//获得session存入的值
public class SessionTest2 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");

        //获得
        HttpSession session = req.getSession();
        System.out.println("得到的SessionID:"+session.getId());

        String name = (String) session.getAttribute("name");
        resp.getWriter().println("得到的session存入的信息"+name);
    }
}

(别忘了配置web.xml)
session相对于cookie而言,要简单一些,可以通过get/setAttribute来传入或者读取数据

会话注销方法:
  1. 可以通过代码注销会话:
session.invalidate();//了解即可,不推荐使用
  1. 在web.xml中设置会话自动过期,时间是以分钟为单位,
	<session-config>
		<session-timeout>1</session-timeout>
	</session-config>

一分钟过期…

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值