JSP ---[Cookie]

Posted 小智RE0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP ---[Cookie]相关的知识,希望对你有一定的参考价值。


cookie


cookie (储存在用户本地终端上的数据)

Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息; Cookie 并不是它的原意“甜饼”的意思, 而是一个保存在客户机中的简单的文本文件, 这个文件与特定的 Web 文档关联在一起, 保存了该客户机访问这个Web 文档时的信息, 当客户机再次访问这个 Web 文档时这些信息可供该文档使用。由于“Cookie”具有可以保存在客户机上的神奇特性, 因此它可以帮助我们实现记录用户个人信息的功能, 而这一切都不必使用复杂的CGI等程序;举例来说, 一个 Web 站点可能会为每一个访问者产生一个唯一的ID, 然后以 Cookie 文件的形式保存在每个用户的机器上。如果使用浏览器访问 Web, 会看到所有保存在硬盘上的 Cookie。在这个文件夹里每一个文件都是一个由“名/值”对组成的文本文件,另外还有一个文件保存有所有对应的 Web 站点的信息。在这里的每个 Cookie 文件都是一个简单而又普通的文本文件。透过文件名, 就可以看到是哪个 Web 站点在机器上放置了Cookie(当然站点信息在文件里也有保存)

Cookie是一段不超过4KB的小型文本数据,由一个名称(Name)、一个值(Value)和其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。

组成说明
Name/Value设置Cookie的名称及相对应的值
Expires属性设置Cookie的生存期。
Path属性定义Web站点上可以访问当前Cookie的目录
Domain属性指定可访问当前 Cookie 的 Web 站点或域
Secure属性指定是否使用HTTPS安全协议发送Cookie
HTTPOnly 属性用于防止客户端脚本通过document.cookie属性访问Cookie

通过cookie对象,可以从服务器端向客户端响应一些信息,这些信息存储在浏览器的内存中,浏览器关闭,数据就不存在.

Cookie是保存在客户端的小文本保存的位置分两种

  • 保存在客户端浏览器的所占内存中,关闭浏览器后,Cookie就不再存在。
  • 保存在客户PC机的硬盘上,可设置有效时间,超出时间后失效。

Tomcat9后可以直接存中文数据


创建cookie对象

以键值对形式的字符串存储.

Cookie newCookie=new Cookie(“name", “value");


cookie类中的方法

方法注释
void setMaxAge(int expiry)设置Cookie的有效期(以秒为单位),Cookie保存在硬盘上,或者保存在内存中
void setValue(String value)在Cookie创建后,对Cookie进行赋值
String getName( )获取Cookie的名称(键)
String getValue( )获取Cookie的值
String getMaxAge( )获取Cookie的有效时间,以秒为单位

将cookie保存客户端

需要使用响应HttpServletResponse中的addCookie( cookie对象 )方法


通过一个案例看看 cookie 的基础应用

(1)在登录时,浏览器保存用户名和和密码;默认存在浏览器中;关闭浏览器后,存储的数据信息就会消失.

  • servlet文件,LoginServlet
//使用注解方式配置servlet
@WebServlet(name = "login",urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求编码格式;
        req.setCharacterEncoding("utf-8");
            //获取页面中对应name的值;
            String account = req.getParameter("account");
            String password = req.getParameter("password");
            //是否记住密码的标记;
        String rememberPW = req.getParameter("RememberPW");

             //创建session对象;
             HttpSession session;

            //这里仅仅是用equals方法进行了判断;
            if (account.equals("xiaozhi") && password.equals("123456")) {
                //当拿到的标记不为空时;创建cookie对象封装数据;
                if(rememberPW!=null){
                    Cookie name=new Cookie("name",account);
                    Cookie pw=new Cookie("password",password);
                    //在响应时将cookie对象传到客户端;
                    resp.addCookie(name);
                    resp.addCookie(pw);
                }
                //从请求对象中获取对应的session对象;
                session = req.getSession();
                //将上面获取到的account的值设置给名为 name的属性;(以键值对的形式);
                session.setAttribute("name",account);
                //若符合条件,则重定向到页面LoginSuccess.jsp;
                resp.sendRedirect("loginSuccess.jsp");
            } else {
                //从请求对象中获取对应的session对象;
                session=req.getSession();
                //设置属性名为 errorMsg 的值为 "账号或密码错误!"
                session.setAttribute("errorMsg", "账号或密码错误!");
               //将页面重定向到login.jsp;
                resp.sendRedirect("login.jsp");
            }
       }
}
  • 登录页面,login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<div>
    <%--获取到session对象中属性名为 errorMsg 的值 ;若不存在,则返回 null--%>
    <%--此时获取到的session对象和客户端访问服务器的是同一个;(都在同一个浏览器)--%>
<%
    String errorMsg =(String) session.getAttribute("errorMsg");
    out.print(errorMsg+"<br/>");

%>
</div>
<form action="login" method="post">
    账号:<input type="text" name="account"/><br/>
    密码:<input type="password" name="password"/><br/>
    <input type="submit" value="登录"/><br/>
    记住密码:<input type="checkbox" name="RememberPW" value="RememberPW"/>
</form>
</body>
</html>
  • 登录成功loginSuccess.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录成功</title>
</head>
<body>
<%--通过getAttribute方法获取到指定的参数名(name)对应的值;若不存在,则返回 null--%>
<%--此时获取到的session对象和客户端访问服务器的是同一个;(都在同一个浏览器)--%>
<%
    String account = (String) session.getAttribute("name");
%>
<%
    out.print("用户==> "+account+"你来了!"+"<br/>");
%>
</body>
</html>

启动服务器

进入成功页面,可看到页面在重定向时,就已经拿到了服务器响应过来的cookie对象;

查看页面cookie信息;浏览器会话结束时,cookie就会消失


(2)设置 cookie 保存在客户PC机的硬盘上,可设置有效时间,超出时间后失效。

LoginServlet类中响应发送cookie时,先设置有效时间.

......
 //当拿到的标记不为空时;创建cookie对象封装数据;
                if(rememberPW!=null){
                    Cookie name=new Cookie("name",account);
                    Cookie pw=new Cookie("password",password);
                    //设置Cookie的有效期(以秒为单位)
                    name.setMaxAge(365*24*3600);
                    pw.setMaxAge(365*24*3600);
                    //在响应时将cookie对象传到客户端;
                    resp.addCookie(name);
                    resp.addCookie(pw);
                }
......                

启动浏览器;登录成功,查看页面保存的cookie

关闭浏览器;查看浏览器缓存


再次访问与保存Cookie相同域名的网站时,HTTP协议将把有效时间内的Cookie都发送到服务器,容器将把Cookie封装到请求中

那么浏览器得到响应过来的cookie值时;
需要先使用HttpServletRequest类的getCookies( )方法获取到所有cookie,该方法的返回值类型为cookie[ ]数组;(注意对拿到的cookie进行判空处理)
然后在通过getName( ),getValue( ); 方法获取名称和值;


案例;

(1)在服务器端获取cookie
在登录的jsp文件中直接编写Java代码;
login.jsp;将获取到的值输到账号密码填入框中.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<%--在服务器端获取到cookie--%>
<%
    //定义用户名和密码两个变量;
    String name = "";
    String password = "";
    //获取请求中的所有cookie;
    Cookie[] cookies = request.getCookies();
    //对获取的cookie判空;避免出现空指针异常;
    if (cookies != null) {
        //遍历获取到的cookie数组;
        for(Cookie ck:cookies){
            //得到对应name的cookie后;取到对应的值;
            if(ck.getName().equals("name")){
                name=ck.getValue();
            }
            if(ck.getName().equals("password")){
                password=ck.getValue();
            }
        }
    }
%>
<div>
    <%--获取到session对象中属性名为 errorMsg 的值 ;若不存在,则返回 null--%>
    <%--此时获取到的session对象和客户端访问服务器的是同一个;(都在同一个浏览器)--%>
<%
    String errorMsg =(String) session.getAttribute("errorMsg");
    out.print(errorMsg+"<br/>");
%>
    <%--这里直接在用户名和密码标签的value输入值;--%>
</div>
<form action="login" method="post">
    账号:<input type="text" name="account" value="<%out.print(name);%>"/><br/>
    密码:<input type="password" name="password" value="<%out.print(password);%>"/><br/>
    <input type="submit" value="登录"/><br/>
    记住密码:<input type="checkbox" name="RememberPW" value="RememberPW"/>
</form>
</body>
</html>

启动浏览器,刷新页面,就会直接将在请求中获取到的用户名与密码;输在表单的输入框中.


(2)在客户端获取cookie;通过JS语言中获取网页对象的办法;
login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<%--在客户端获取到cookie--%>
<%--部署jQuery--%>
<script src="js/jquery.1.8.3.min.js" type="text/javascript"></script>
<script type="text/javascript">
    $(function () {
        //将取到的字符串按分号分隔为数组;
        var str = document.cookie.split(";");
        for (let i = 0; i < str.length; i++) {
            //遍历时拿到单个的值;
            var chStr = str[i];
            //将键和值按=分隔为数组;
            var halfChStr = chStr.split("=");
            //注意去除空格再进行判断;
            if (halfChStr[0].trim() == "name") {
                //通过取到对应的Id进行赋值;
                $("#nmId").val(halfChStr[1]);
            }
            if (halfChStr[0].trim() == "password") {
                $("#pwId").val(halfChStr[1]);
            }
        }
    });
</script>

<div>
    <%--获取到session对象中属性名为 errorMsg 的值 ;若不存在,则返回 null--%>
    <%--此时获取到的session对象和客户端访问服务器的是同一个;(都在同一个浏览器)--%>
<%
    String errorMsg =(String) session.getAttribute("errorMsg");
    out.print(errorMsg+"<br/>");
%>
    <%--这里直接在用户名和密码标签的value输入值;--%>
</div>
<form action="login" method="post">
    账号:<input type="text" name="account" value=""id="nmId"/><br/>
    密码:<input type="password" name="password" value="" id="pwId"/><br/>
    <input type="submit" value="登录"/><br/>
    记住密码:<input type="checkbox" name="RememberPW" value="RememberPW"/>
</form>
</body>
</html>

启动浏览器,刷新页面,就会直接将在浏览器的缓存中获取用户名与密码;输在表单的输入框中.


cookie与session的区别


  • session在服务器端保存用户信息,Cookie在客户端保存用户信息
  • session中可以保存任意对象,Cookie保存的是字符串(键值对对应);
  • session生命周期结束后,信息随之消失,Cookie可以长期保存在客户端硬盘上,也可以临时保存在浏览器内存中
  • session由于存储在服务器;所以安全性高.
  • 存储大小不同,Cookie是一段不超过4KB的小型文本数据,由一个名称(Name)、一个值(Value)和其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。而session存储数据大小高于cookie.

以上是关于JSP ---[Cookie]的主要内容,如果未能解决你的问题,请参考以下文章

jsp frame

19 jsp——jsp的转发标签

JSP_动作和隐式对象

在jsp页面中如何获取另一个jsp页面提交的信息

jsp中将一个jsp引入另一个jsp指定位置

JSP学习日记