session和cookie d9

cookie  

  首先小甜饼的引入的原因:http是纯文本无状态的协议,这就会导致无法判断当前操作是否是同一个人执行的,也就是说买东西的时候服务器无法判断是否是一个人买的。可以将cookie理解成身份证,他是唯一标识个人的东西,我们可以通过这个东西向浏览器发出请求,并通过它得到响应。

  其次需要知道他的流程,它的产生是服务器创建的,可以是直接的Cookie cookie=new Cookie();也可以是在jsp里创建,这就需要理解了,本质是在servlet,jsp的底层就是serlvet,因为jsp在执行的过程中它会生成对应java文件。所以都是在servlet里创建的。服务器通过响应头将cookie发送给浏览器,浏览器通过请求头将Cookie发回给服务器,服务器可以根据不同cookie来识别不同用户,这就实现了区别对待。

  具体的使用

 -创建Cookie   Cookie cookie=new Cookie(name,value); 在这里需要注意的是如果直接获取cookies.name获取的是键的名字,而不会出现里面的值,需要调它的value属性。 

 -发送Cookie 服务器数据处理。response.addCookie(cookie);注意可以发送多个cookie,区别于重定向。

 -读取Cookie  request.getCookies(); 返回的是一个Cookie数组。 虽然Cookie是一个键值对结构,但是它并没有给咱们提供一个根据键获取值的方法。我们要想读取Cookie的信息,只能通过遍历数组。

- 修改Cookie      一旦Cookie发给浏览器以后,服务器便不能直接修改Cookie,但是可以通过使用同名Cookie来替换的老Cookie方式来间接的修改,相当于更新。

Cookie的有效时间

  Cookie的默认有效时间为一次会话,当关闭浏览器时,Cookie也就失效了,需要注意的是它不是跨浏览器使用的。

  可以通过设置他的有效时间来控制他的操作,一般默认的时间为小于0,也就是说单次会话有效,当秒数大于0时有效时间为对应的实践。具体的函数 cookie.setMaxAge(30);里面的单位是秒,一般设置成两周,也就cookie.setMaxAge(60*60*24*14),相当于持久化了。一般不在cookie里传中文,需要先编码再解码。

Cookie的路径

  path就是在哪些网址里会携带cookie参数,默认的是项目的根目录,访问当前项目的资源就行。可以通过set Path()方法来设置Cookie的有效路径,也就是cookie.setPath(request.getContextPath()+"/hello");里面最好写绝对路径。

package com.neuedu.cookie;

import java.io.IOException;

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;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public LoginServlet() {
        super();
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name=request.getParameter("name");
        String password=request.getParameter("password");
        Cookie[] cookies=request.getCookies();
        Cookie cookie=new Cookie("name", name);
        response.addCookie(cookie);
        Cookie cookie2=new Cookie("password", password);
        response.addCookie(cookie2);
        if (cookie!=null) {
            for (Cookie c:cookies) {
                System.out.println(c.getValue()+c.getName());
            }
        }
        if ("yantao".equals(name)&&"t12345".equals(password)) {
            response.sendRedirect(request.getContextPath()+"/loginsucs.jsp");
        }
        else{
            request.getRequestDispatcher("/login.jsp").forward(request, response);
        }
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/LoginServlet" method="post">

    用户名<input type="text" value="${cookie.name.value}" name="name">
    密码<input type="text" value="${cookie.password.value}" name="password">
    <input type="submit" value="提交"/>
    </form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    用户${cookie.name.value}登陆成功
</body>
</html>

这里只实现业务层和前段交流,先从前段login.jsp输入账号密码,这时候cookie已经创建了,再服务器端获取前端数据,并判断是否是我想要的,如果是就重定向到登陆成功页面,否则返回登陆页面并实现里面的回显功能,将带到后端的值放到cookie里再带回给前台但是这样就会出现一个问题,值多了该如何处理,这就该用到session了。

  

原文地址:https://www.cnblogs.com/guomingyt/p/7906270.html