- 前言
- 一、cookie
- 1、什么是cookie
- 2、创建并添加cookie对象
- A.Step
- B.XML configuration
- C.通过反射分流
- D.Code
- E.Result
- 3、如何获取cookie对象
- A.Step
- B.Code
- C.Result
- D.cookieUtil之寻找cookie对象
- 4、如何修改cookie对象值
- A.方案
- B.Result
- 5、查看浏览器的cookie
- 6、cookie的生命控制
- A.默认-1
- B.立即删除
- C.存活1小时
- Result
- 7、cookie的有效路径Path
- 8、免用户名登录
- A.Step
- B.Code
- 二、Session
- 1、什么是Session
- 2、创建和获取Session对象
- 3、存储、获取信息
- 4、可控Session对象的生命周期
- 三、为什么能通过请求获取session
- 总结
- 参考文献
- 附录
- 1、cookie.html
- 2、session.html
一、cookie 1、什么是cookie了解cookie和Session技术。
cookie主要用于存储键值对。cookie技术是服务器通知客户端保存键值对(cookie对象)的一种技术。保存好键值对后,每次发送请求附带cookie对象发送给服务器,每个cookie对象的大小不能超过4kb。
public cookie(String name, String value) {
validation.validate(name);
this.name = name;
this.value = value;
}
2、创建并添加cookie对象
A.Step
B.XML configuration
C.通过反射分流cookieServlet com.xhu.servlet.cookieServlet cookieServlet /cookieServlet
package com.xhu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
public abstract class baseServlet 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 {
req.setCharacterEncoding("utf-8");
String action = req.getParameter("action");
try {
Method declaredMethod = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
declaredMethod.setAccessible(true);
declaredMethod.invoke(this, req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
D.Code
package com.xhu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class cookieServlet extends baseServlet {
protected void createcookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.创建cookie对象
cookie c1 = new cookie("username", "root");
cookie c2 = new cookie("password", "root");
//2.设置response编码以及浏览器的解码格式
resp.setContentType("text/html;charset=utf-8");
//3.通知浏览器本地存cookie
resp.addcookie(c1);
resp.addcookie(c2);
//4.创建成功
resp.getWriter().print("cookie对象创建成功");
}
}
E.Result
3、如何获取cookie对象
A.Step
B.Code
protected void getcookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取所有cookie对象
cookie[] cookies = req.getcookies();
//2.打印cookie对象
PrintWriter writer = resp.getWriter();
for (int i = 0; i < cookies.length; i++) {
writer.print(cookies[i].getName() + ":" + cookies[i].getValue());
writer.println();
}
}
C.Result
D.cookieUtil之寻找cookie对象
package com.xhu.utils;
import javax.servlet.http.cookie;
public class cookieUtil {
public static cookie findcookie(String name, cookie[] cookies) {
if (name == null || cookies == null || cookies.length == 0)
return null;
for (cookie cookie : cookies) {
if (name.equals(cookie.getName()))
return cookie;
}
return null;
}
}
4、如何修改cookie对象值
A.方案
1)方案一
服务端生成新的同名不同值cookie对象,然后把其添加在响应头中,浏览器会自动根据响应头的set-cookie来更新。
protected void updatecookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.生成同名不同值cookie对象。
cookie cookie = new cookie("password", "lls");
//2.将cookie对象添加到响应头。
resp.setContentType("text/html;charset=utf-8");
resp.addcookie(cookie);
//3.回传消息添加成功给浏览器
resp.getWriter().println("password成功修改为lls");
}
2)方案2
寻找指定cookie对象,然后setValue,最后通知客户端。
protected void updatecookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.寻找指定cookie对象
cookie cookie = cookieUtil.findcookie("password", req.getcookies());
//2.修改cookie对象值
cookie.setValue("root");
//3.通知客户端
resp.setContentType("text/html;charset=utf-8");
resp.addcookie(cookie);
//4.回传消息修改成功给浏览器
resp.getWriter().println("password成功修改为root");
}
B.Result
对cookie对象的生命控制,指设置它的存活时间。通过setMaxAge()来设置
A.默认-1默认-1表示session级别,当浏览器关闭时则将cookie对象删除。private int maxAge = -1;
protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.生成cookie对象
cookie cookie = new cookie("defaultLife","defaultLife");
//2.将默认生命周期的cookie对象回传浏览器
resp.setContentType("text/html;charset=utf-8");
resp.addcookie(cookie);
//3.通知消息
resp.getWriter().println("默认生命周期的cookie对象创建成功");
}
B.立即删除
protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.生成cookie对象
cookie cookie = new cookie("deleteNow","deleteNow");
//2。设置其生命周期为立马删除
cookie.setMaxAge(0);
//3.通知客户端
resp.setContentType("text/html;charset=utf-8");
resp.addcookie(cookie);
//3.回传消息
resp.getWriter().println("设置立马删除的cookie对象成功");
}
C.存活1小时
protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.生成cookie对象
cookie cookie = new cookie("life3600","life3600");
//2。设置其生命周期为一个小时后删除
cookie.setMaxAge(60 * 60);
//3.通知客户端
resp.setContentType("text/html;charset=utf-8");
resp.addcookie(cookie);
//4.回传消息
resp.getWriter().println("设置存活一小时的cookie对象成功");
}
Result
7、cookie的有效路径Path
当请求发起时,浏览器会把cookie对象附带在请求头里发送给服务器,而只有请求路径能跟cookie对象的Path匹配时才能将该cookie对象发送给服务端。
| cookieA-path | cookieB-path |
|---|---|
| /工程路径/cookieServlet | /工程路径/ |
| cookie对象 | 请求路径 | 能否发送 |
|---|---|---|
| cookieA | /工程路径 | 能 |
| cookieB | /工程路径 | 能 |
| cookieA | /工程路径/cookieS | 否 |
| cookieB | /工程路径/cookieS | 能 |
protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.生成cookie对象
cookie cookie = new cookie("path","path");
//2。设置其path路径
cookie.setPath(req.getContextPath()+"cookieS");
//3.通知客户端
resp.setContentType("text/html;charset=utf-8");
resp.addcookie(cookie);
//4.回传消息
resp.getWriter().println("path路径设置完成");
}
8、免用户名登录
A.Step
B.Code
protected void login(HttpServletRequest req, HttpServletResponse resp) throws Exception {
//获取参数
String username = req.getParameter("username");
String password = req.getParameter("password");
//判断系统是否存在该用户
User user = us.login(username, password);
//不存在该用户
if (user == null) {
req.setAttribute("errorMsg", "用户名和密码错误");
req.setAttribute("username", username);
req.setAttribute("password", password);
req.getRequestDispatcher("/pages/user/login.jsp").forward(req, resp);
return;
}
req.getSession().setAttribute("user", user);
cookie cookie = new cookie("username", user.getUsername());
resp.setContentType("text/html;charset=utf-8");
resp.addcookie(cookie);
req.getRequestDispatcher("pages/user/login_success.jsp").forward(req, resp);
}
二、Session
1、什么是Session
规范HttpSession,用于维护客户端与服务端一次连接过程中所需要维护的信息,如客户端与服务端连接的唯一标识id、客户端登录成功后的用户信息。session存储在服务端。
2、创建和获取Session对象request.getSession()获取该请求Session对象。
第一次请求则该操作是创建并获取Session对象,否则是获取当前Session对象。
1)如何判断是否为创建?request.getSession().isNew()
HttpSession session = request.getSession();
User user = new User("username","password");
session.setAttribute("user",user);
user = session.getAttribute("user");
4、可控Session对象的生命周期
HttpSession session = req.getSession();
//获取session超时时长
session.getMaxInactiveInterval();
//设置session超时时长为1小时,负数表示永不销毁。
session.setMaxInactiveInterval(60 * 60);
//让session马上无效
session.invalidate();
Tomcat的web.xml中配置了超时时长,如果想修改该项目中所有的session默认时长,就可以改idea整合tomcat下的web.xml
三、为什么能通过请求获取session30
一旦session对象创建,则每次response都会让客户端添加cookie对象,该对象的存了session的唯一标识符id,而每次请求都会带上该cookie对象,所以服务端能根据传过来的cookie对象中的id来找到当前连接的session对象。
1)cookie存入客户端(浏览器)
2)session存入服务端(Tomcat)
3)通过cookie对象来寻找Session对象。
[1] JavaWeb 尚硅谷
附录 1、cookie.html2、session.htmlcookie
Session



