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了。