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;
}