Cookie和Session

本篇记录Spring工程对Cookie和Session的操作

Cookie操作

Cookie读取

总结:为control类的方法增加一个HttpServletRequest参数,通过request.getCookies()取得cookie
数组。然后再循环遍历数组即可

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

@RequestMapping("/songlist")
public Map index(HttpServletRequest request) {
  Map returnData = new HashMap();
  returnData.put("result", "this is song list");
  returnData.put("author", songAuthor);

  Cookie[] cookies = request.getCookies();
  returnData.put("cookies", cookies);

  return returnData;
}

使用注解读取Cookie

control类的方法增加一个@CookieValue("xxxx") String xxxx参数即可,注意使用时要填入 正确的cookie 名字

import org.springframework.web.bind.annotation.CookieValue;

@RequestMapping("/songlist")
public Map index(@CookieValue("JSESSIONID") String jSessionId) {//这里读取了名为“JSESSIONID”的Cookie,并将其值传入了jSessionId字符串中
  Map returnData = new HashMap();
  returnData.put("result", "this is song list");
  returnData.put("author", songAuthor);
  returnData.put("JSESSIONID", jSessionId);

  return returnData;
}

添加Cookie

总结:为control类的方法增加一个HttpServletRequest参数,通过request.addCookie()添加cookie对象即可。

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

@RequestMapping("/songlist")
public Map index(HttpServletResponse response) {
  Map returnData = new HashMap();
  returnData.put("result", "this is song list");
  returnData.put("name", songName);

  //第一个参数是cookie的名称,第二个参数是cookie的值
  Cookie cookie = new Cookie("sessionId","CookieTestInfo");
  // 设置的是 cookie 的域名,就是会在哪个域名下生成 cookie 值
  cookie.setDomain("youkeda.com");
  // 是 cookie 的路径,一般就是写到 / ,不会写其他路径的
  cookie.setPath("/");
  // 设置cookie 的最大存活时间,-1 代表随浏览器的有效期,也就是浏览器关闭掉,这个 cookie 就失效了。
  cookie.setMaxAge(-1);
  // 设置是否只能服务器修改,浏览器端不能修改,安全有保障
  cookie.setHttpOnly(false);
  response.addCookie(cookie);

  returnData.put("message", "add cookie successfule");
  return returnData;
}

Session操作

session是用于客户端存放用户id以及登录状态等重要信息的方法,cookie作为session id的载体与客户端通讯,如上面名为JSESSIONID的cookie,是专门用来记录用户session的。

读取Session

cookie相似,从HttpServiceRequest对象中获取HttpSession对象,使用的语句是requset.getSession()

不同的是,返回结果不是数组,而是对象,在attribute属性中用key->value的形式储存多个数据。

如储存登录信息的数据key是userLoginInfo那么语句就是session.getAttribute("userLoginInfo")

由于登录信息实例对象要在网络上传输,就必须实现序列化接口Serializable,否则会报错。(即创建一个getAttribute所返回的类且这个类连接着接口)

import java.io.Serializable;

public class UserLoginInfo implements Serializable {
  private String userId;
  private String userName;
}

完整操作大致如下:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@RequestMapping("/songlist")
public Map index(HttpServletRequest request, HttpServletResponse response) {
  Map returnData = new HashMap();
  returnData.put("result", "this is song list");

  // 取得 HttpSession 对象
  HttpSession session = request.getSession();
  // 读取登录信息
  UserLoginInfo userLoginInfo = (UserLoginInfo)session.getAttribute("userLoginInfo");
  if (userLoginInfo == null) {
    // 未登录
    returnData.put("loginInfo", "not login");
  } else {
    // 已登录
    returnData.put("loginInfo", "already login");
  }

  return returnData;
}

写入Session

getAttribute()对应,写入session使用方法 setAttribute()(使用这个方法来告诉服务器登录状态)

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@RequestMapping("/loginmock")
public Map loginMock(HttpServletRequest request, HttpServletResponse response) {
  Map returnData = new HashMap();

  // 假设对比用户名和密码成功
  // 仅演示的登录信息对象
  UserLoginInfo userLoginInfo = new UserLoginInfo();
  userLoginInfo.setUserId("12334445576788");
  userLoginInfo.setUserName("ZhangSan");
  // 取得 HttpSession 对象
  HttpSession session = request.getSession();
  // 写入登录信息
  session.setAttribute("userLoginInfo", userLoginInfo);
  returnData.put("message", "login successfule");

  return returnData;
}