会话与状态管理cookie

会话与状态管理

  • WEB应用中的会话是指一个客户端浏览器与WEB服务器之间连续发生的一系列请求和响应过程。
  • WEB应用的会话状态是指WEB服务器与浏览器在会话过程中产生的状态信息,借助会话状态,WEB服务器能够把属于同一会话中的一系列的请求和响应过程关联起来。

在 Servlet 规范中,常用以下两种机制完成会话跟踪

  • Cookie
  • Session

cookie

  • Cookie是在浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一个小文本文件
  • 一旦WEB浏览器保存了某个Cookie,那么它在以后每次访问该WEB服务器时,都会在HTTP请求头中将这个Cookie回传给WEB服务器。
  • 底层的实现原理: WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器
  • 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
  • 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
  • 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。

Cookie的使用:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  //创建一个cookie  并保存信息
    Cookie cookie = new Cookie("username","admin");
    //将cookie信息响应给客户端
    resp.addCookie(cookie);
    req.getRequestDispatcher("/success.jsp").forward(req,resp);
}

在这里插入图片描述

cookie的获取

	<%--获取所有的cookie对象 --%>
    <%
         Cookie[]  cookies =   request.getCookies();
         for(Cookie cookie : cookies){
         String name =  cookie.getName();
         String value = cookie.getValue();
    %>
    <h1><%=name%></h1>--- <h1><%=value%></h1>
    <br/>
    <%
        }
    %>

在这里插入图片描述
JSSESIONID:是服务端产生 来标记一次会话的数据 会话ID 每一个会话值都是唯一的

存储我们自定义的信息

username= admin

在cookie中寻找自己关注的cookie

Cookie[]  cookies =   request.getCookies();
for(Cookie cookie : cookies){
    String name =  cookie.getName();
    String value="";
    //寻找关注的cookie信息
    if(name.equals("username")){
        value = cookie.getValue();
    }
}

Cookie的分类:

cookie分为会话cookie和持久cookie

setMaxAge()设置cookie的存储时间

时间单位为秒

如果是-1 则表示永久存储 无限期

如果cookie没有设置maxAge 则为会话cookie

//存储时间为一天 
cookie.setMaxAge(60*60*24);

Cookie实现自动登录

@WebServlet("/login.do")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取用户名
        //如果用户名不为空 则进行用户名密码的校验 如果校验通过 则直接登录 并将登录信息保存到cookie
        //如果用户名为空 获取cookie中的数据 cookie中是否有登录所需信息 如果有 则直接校验 校验通过登录
        // 校验不通过则返回登录页面 让用户重新登录
        String username = req.getParameter("username");
        if (username != null && !username.equals("")){
            if ("admin".equals(username)){//校验通过
                //并将信息保存到cookie
                Cookie cookie = new Cookie("username",username);
                cookie.setMaxAge(60*60);
                resp.addCookie(cookie);
                resp.sendRedirect("/home.jsp");//重定向到主页
            }else{
                resp.sendRedirect("/login.jsp");//重定向到登录页面
            }
        }else {
            Cookie[] cookies = req.getCookies();
            if (cookies != null && cookies.length > 0) {
                for (Cookie cookie : cookies) {
                    String cookieName = cookie.getName();
                    if ("username".equals(cookieName)){
                        String cookieValue = cookie.getValue();
                        if ("admin".equals(cookieValue)){
                            resp.sendRedirect("/home.jsp");//重定向到主页
                        }else {
                            resp.sendRedirect("/login.jsp");//重定向到登录页面
                        }
                    }else {
                        resp.sendRedirect("/login.jsp");//重定向到登录页面
                    }
                }
            }else {
                resp.sendRedirect("/login.jsp");//重定向到登录页面
            }
        }
    }

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

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录页面</title>
</head>
<body>
<form action="/login.do" method="post">
    <input type="text" name="username" value=""><br><br>
    <input type="checkbox" name="isAutoLogin">
    <input type="submit" value="登录">
</form>
</body>
</html>

success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
	//获取所有cookie对象
    Cookie[] cookies = request.getCookies();
    if (cookies != null && cookies.length > 0){
        for (Cookie cookie : cookies){
            String name = cookie.getName();
            String value;
            //寻找关注的cookie信息
            if (name.equals("username")){
                value = cookie.getValue();

    %>
    <h1><%=name%></h1>---<h1><%=value%></h1>
    <%
            }
        }
    }
    %>
</body>
</html>

显示用户最后访问该应用的时间

@WebServlet("/index")
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        String lastAccessTime = "";
        if (cookies != null && cookies.length > 1){
            for (Cookie cookie : cookies) {
                String cookieName = cookie.getName();
                if ("lastAccessTime".equals(cookieName)) {
                    lastAccessTime = cookie.getValue();
                }
            }
        }
        //生成日期并格式化成字符串
        Date date = new Date();
        String dateStr = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss").format(date);//cookie字符串不能用空格
        //将生成的字符串写入cookie
        Cookie cookie1 = new Cookie("lastAccessTime",dateStr);
        //设置cookie寿命
        cookie1.setMaxAge(60*60);
        resp.addCookie(cookie1);

        req.setAttribute("lastAccessTime",lastAccessTime);
        req.getRequestDispatcher("/index.jsp").forward(req,resp);
    }

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

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
 index 页面
  <%
    String lastAccessTime = (String) request.getAttribute("lastAccessTime");
    if (lastAccessTime != null && !"".equals(lastAccessTime)) {
  %>
 <h1>您的最后一次访问时间为:<%=lastAccessTime%></h1>
  <%
    }else {

    }
  %>
  </body>
</html>

Cookie中存取中文

要想在cookie中存储中文,那么必须使用URLEncoder类里面的encode(String s, String enc)方法进行中文转码,例如:

Cookie cookie = new Cookie("userName", URLEncoder.encode("北京", "UTF-8"));
response.addCookie(cookie);

在获取cookie中的中文数据时,再使用URLDecoder类里面的decode(String s, String enc)进行解码,例如:

 URLDecoder.decode(cookies[i].getValue(), "UTF-8")
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值