html获取session的值_开发中你一定碰到过cookie和session问题,今天一并帮你解决!

一、会话的概念

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

二、会话过程中要解决的一些问题

每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。

三、保存会话数据的两种技术

1、Cookie

Cookie意为"甜饼",是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。

由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。

Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

2、Session

Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

四、Cookie类的主要方法

int getMaxAge()返回Cookie过期之前的最大时间,以秒计算。void setMaxAge(intexpiry)以秒计算,设置Cookie过期时间。String getName()返回Cookie的名字。名字和值是我们始终关心的两个部分,笔者会在后面详细介绍 getName/setName。void setValue(String newValue)Cookie创建后设置一个新的值。String getValue()返回Cookie的值。笔者也将在后面详细介绍getValue/setValue。void setDomain(String pattern)设置cookie中Cookie适用的域名String getDomain()返回Cookie中Cookie适用的域名. 使用getDomain() 方法可以指示浏览器把Cookie返回给同 一域内的其他服务器,而通常Cookie只返回给与发送它的服务器名字完全相同的服务器。注意域名必须以点开始(例如.http://yesky.com)void setPath(String uri)指定Cookie适用的路径。String getPath()返回Cookie适用的路径。如果不指定路径,Cookie将返回给当前页面所在目录及其子目录下 的所有页面。void setSecure(boolean flag)指出浏览器使用的安全协议,例如HTTPS或SSL。boolean getSecure()如果浏览器通过安全协议发送cookies将返回true值,如果浏览器使用标准协议则返回false值。void setVersion(int v)Cookie所遵从的协议版本。int getVersion()返回Cookie所遵从的协议版本。void setComment(String purpose)设置cookie中注释。String getComment()返回Cookie中注释,如果没有注释的话将返回空值。Cookie(String name, String value)实例化Cookie对象,传入cooke名称和cookie的值。

response接口也中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段。 同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie。

五、Cookie使用

1、使用cookie记录用户上一次访问的时间

public class CookieDemo extends HttpServlet{

    private static final long serialVersionUID = 5757885987685925915L;

    @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 {
        //设置服务器以UTF-8编码输出
        resp.setCharacterEncoding("UTF-8");
        //设置浏览器以UTF-8编码进行接收
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();

        //获取Cookie数组
        Cookie[] cookie = req.getCookies();
        if(cookie == null){
            out.write("这是你的第一次访问!");
        } else {
            for (Cookie ck : cookie) {
                if(ck.getName().equals("cookieName")){
                    //获取Cookie里面保存的数据
                    Long time = Long.parseLong(ck.getValue());
                    Date date = new Date(time);
                    out.write("上次访问时间:" + date.toLocaleString());
                }
            }
        }

        //创建一个cookie,cookie的名字是cookieName
        Cookie cookies = new Cookie("cookieName", System.currentTimeMillis()+"");
        //设置Cookie的有效期为1天,这样即使关闭了浏览器,下次再访问时,也依然可以通过cookie获取用户上一次访问的时间。
        cookies.setMaxAge(24*60*60);
        //将cookie对象添加到response对象中
        resp.addCookie(cookies);
    }
}

第一次访问时,如下所示:

a201576b84e368c402319fc306b08b7e.png

再次访问:

45593e1711a45d7fa216c33d2c5b610f.png

2、删除Cookie

public class CookieDemo 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 {
          //创建一个名字为lastAccessTime的cookie
        Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+"");
        //将cookie的有效期设置为0,命令浏览器删除该cookie
        cookie.setMaxAge(0);
        req.addCookie(cookie);
    }
}

3、cookie中存/取中文

public class CookieDemo2 extends HttpServlet{

    private static final long serialVersionUID = 5757885987685925915L;

    @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 {
        //设置服务器以UTF-8编码输出
        resp.setCharacterEncoding("UTF-8");
        //设置浏览器以UTF-8编码进行接收
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();

        //创建一个cookie,cookie的名字是cookieName
        //存储中文时,使用URLEncoder类里面的encode(String s, String enc)方法进行中文转码
        Cookie cookies = new Cookie("cookieName", URLEncoder.encode("哎哟!不错哟", "UTF-8"));
        //将cookie对象添加到response对象中
        resp.addCookie(cookies);

        //获取Cookie数组
        Cookie[] cookie = req.getCookies();
        if(cookie != null){
            for (Cookie ck : cookie) {
                if(ck.getName().equals("cookieName")){
                    //获取Cookie里面保存的数据
                    String text = ck.getValue();
                    //使用URLDecoder类里面的decode(String s, String enc)进行解码
                    out.write("存储的中文数据:" + URLDecoder.decode(text, "UTF-8"));
                }
            }
        }
    }
}

结果如下:

46aa285738d5a210083ec46170e584bc.png
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值