Cookie与Session
文章目录
1. Cookie
1.1 cookie原理
cookie是服务器创建,通过响应对象传递到浏览器,浏览器对cookie中的数据进行保存(缓存)。以后每次浏览器发请求时,浏览器会携带所有的cookie信息发送到服务器,服务器可以通过请求对象获取对应的cookie信息。
1.2 cookie特点
1.2.1 不支持中文
//对name进行编码处理
String name = URLEncoder.encode(name, "UTF-8");
//对cookie的值进行解码处理
string value = URLDecoder.decode(cookie.getValue(),"utf-8");
1.2.2 修改cookie中的值
1、new一个同名的cookie,然后将这个new出来的cookie响应到浏览器,浏览器就会覆盖原有的值。
Cookie cookie = new Cookie("username","admin");
resp.addCookie(cookie)
2、根据对应的name拿到cookie对象,然后再设置对应的cookie值。
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("username")) {
//解码
username = URLDecoder.decode(cookie.getValue(),"utf-8");
resp.addCookie(cookie);
}
}
}
1.2.3 删除cookie
cookie.setMaxAge(int second);
second为正数:代表多少秒后cookie失效。
second为0:就代表删除当前cookie。
second为负数:关闭浏览器cookie就失效。
1.2.4 路径问题
/cookie/login 在这个路径下面保存的Cookie
/cookie/* 这个路径下面是可以拿到Cookie
/cookie2/* 这个路径下面拿不到Cookie
cookie.setPath("/");//设置保存在根路径下,都可以访问
1.3 cookie缺点
- 只能保存字符串,不能保存对象及集合。
- 不能保存中文。
- cookie保存在浏览器,不安全。
- 浏览器可以禁用cookie。
2. Session
2.1 session原理
session是服务器创建,保存在服务器端。当浏览器某一次请求浏览器,创建了一个session对象,这个session对象由一个唯一的标志ID,服务器会将这个sessionid通过cookie返回给浏览器,以后每次请求,浏览器都会携带这个sessionid到服务器。
2.2 session特点
2.2.1 获取与修改值
HttpSession session = request.getSession(boolean value);
value:true -> 如果有直接拿,如果没有就创建一个。
value:false -> 如果有直接拿,如果没有就返回null。
session.setAttribute("username","tom");
2.2.2 设置死亡时间
参数的的意义:按照浏览器请求静默的时长来计算的。距最后一次请求的时间长度。
- 直接设置
session.setMaxInactiveInterval(Integer interval)
- 通过web.xml配置
<session-config>
<session-timeout>1000</session-timeout>
</session-config>
- 如果设置为负数:浏览器一关闭,session就失效。
3. 表单重复提交
1、按钮点击之后,js代码禁用按钮。
2、session+令牌验证。
- jsp页面
<%@ page import="java.util.UUID" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>salary</title>
</head>
<body>
<%
UUID uuid = UUID.randomUUID();
request.getSession().setAttribute("token",uuid);
%>
<form action="/xx/safe">
<input type="hidden" name="cmd" value="token">
<input type="hidden" name="token" value="${token}">
转账:<input type="text" name="salary"><br>
<input type="submit" value="确定转账">
</form>
</body>
</html>
- 请求处理
private void token(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("text/html;charset=utf-8");
//获取表达数据
String salary = req.getParameter("salary");
//获取表单
String tokenClient = req.getParameter("token");
//从session域中获取值
Object tokenServer = req.getSession().getAttribute("token");
//移除session域中的值
req.getSession().removeAttribute("token");
if(tokenServer==null || "".equals(tokenServer.toString())){
PrintWriter writer = resp.getWriter();
writer.println("<h1>请不要重复提交!!</h1><br>");
writer.println("<a href='/xx/salary.jsp'>点击返回转账页面</a>");
writer.close();
}
if(tokenServer.toString().equals(tokenClient)){
System.out.println("扣除:"+salary);
}
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
resp.sendRedirect("/xx/salary.jsp");
}