Cookie与Session

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"); 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章