Java之Cookie与Session
Cookie、Session
Cookie:服务端生成Cookie发给客户端用于认证
Session:服务端进行进行登记,每人有不同的Session
session与cookie的区别
Cookie:当用户打开浏览器访问网站,服务器端会生成一个cookie发给客户端,客户端访问网站就会携带cookie
Session:客户端请求服务端,服务端会生成一个sessionid,每个用户唯一,用类似于发给客户端cookie的方式发给客户端这个sessionid,用sessionid来辨别这次请求是那个客户端发来的。而在服务器端保存的session会存入很多东西,也是根据sessionid来辨别这些session中的内容是哪个用户的。
- cookie是将用户的数据写给用户的浏览器,用浏览器保存,可保存多个cookie
- session是将用户的数据,写给用户的session,服务器端保存,不建议保存太多
- session由服务器创建
cookie
一个web站点可以发多个cookie
常用方法
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + ""); //新建一个cookie
resp.addCookie(cookie); //响应给客户端cookie
Cookie[] cookies = req.getCookies(); //获得cookie数组
cookie.setMaxAge(24*60*60); //设置cookie有效期
cookie.getName() //获得cookie名字
cookie.getValue() //获得cookie的值
服务端发送给客户端cookie
//服务端发给客户端cookie
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
resp.addCookie(cookie);
服务端获取客户端带来的cookie
//服务器端从客户端获取cookie
Cookie[] cookies = req.getCookies(); //这里返回数组,可能存在多个cookie
设置cookie有效期,以秒为单位
cookie.setMaxAge(24*60*60);
例子:保存cookie上一次访问的时间
public class CookieDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
//服务器端从客户端获取cookie
Cookie[] cookies = req.getCookies(); //这里返回数组,可能存在多个cookie
//判断cookie是否为空
if (cookies!=null){
out.write("上一次访问的时间是:");
for (int i = 0; i <cookies.length; i++) {
//获取cookie
Cookie cookie = cookies[i];
//获取cookie中的名字
if (cookie.getName().equals("lastLoginTime")){
//获取cookie中的值
long lastLoginTime = Long.parseLong(cookie.getValue());
Date date = new Date(lastLoginTime);
out.write(date.toLocaleString());
}
}
}else {
out.write("第一次访问");
}
//服务端发给客户端cookie
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
删除cookie
不设置有效期,关闭浏览器自动失效
设置cookie有效期为0
创建一个cookie,名字必须和要删除的cookie名字一致
public class CookieDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie lastLoginTime = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
//设置有效期为0
lastLoginTime.setMaxAge(0);
resp.addCookie(lastLoginTime);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
URL编解码
URLEncoder.encode("str", "utf-8"); //str进行URL编码
URLDecoder.decode("str", "utf-8"); //str进行URL解码
session
session在浏览器一打开就存在了,会类似于发送给客户端cookie一样。但这只是SessionID的操作,Session还可以设置其他的属性。
之前Servlet文章有提过,Servlet之间本身是无法通信,例如分享数据的。但是可以通过ServletContext上下文实现,其实在Session中通过Attribute也可以实现Servlet之间的通信的。
Cookie cookie = new Cookie("JSESSIONID", sessionId);
resp.addCookie(cookie);
常用方法
方法 | 作用 |
---|---|
req.getSession() | 获得一个session |
session.setAttribute("name", "Zh1z3ven") | 设置属性,value部分可以是一个对象 |
session.getAttribute("name") | 获取属性 |
session.removeAttribute("name"); | 删除属性 |
session.invalidate(); | 注销session |
session.getId() | 获取sessionid |
session.isNew() | 判断是否为新创建的session |
例子:创建session,获取sessionid,设置session属性
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决编码问题
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
//得到session
HttpSession session = req.getSession();
//设置session属性
session.setAttribute("name", "Zh1z3ven");
//获取sessionid
String sessionId = session.getId();
//判断是否为新创建的session
boolean aNew = session.isNew();
if (aNew){
resp.getWriter().write("session创建成功,sessionID为:" + sessionId);
}else {
resp.getWriter().write("session已经在服务器中存在, SessionID为:" + sessionId);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
获取sessin属性,新建一个person类
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
修改前面demo中设置属性值的语句
session.setAttribute("name", new Person("Zh1z3ven", 18));
获取session属性中的person对象
public class SessionDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决编码问题
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
//得到session
HttpSession session = req.getSession();
//获取Session信息
Person name = (Person) session.getAttribute("name");
System.out.println(name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
这里就实现了不同的Servlet之间数据共享。
注销Session
删除属性,注销session。但是注销了会马上生成一个新的session
HttpSession session = req.getSession();
session.removeAttribute("name");
session.invalidate();
也可以在web.xml设置session过期时间
<!-- 设置session配置-->
<session-config>
<!-- 设置session过期时间,以分钟为单位-->
<session-timeout>2</session-timeout>
</session-config>