这个写在前边:
session和cokie的区别
- Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
- Session把用户的数据写到被用户独占Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
- Session对象有服务器创建
初识Cookie和Session
Cookie
cookie就是把我们用户的信息写在浏览器的内存,为了方便服务器更好的提取我们用户信息的一种技术。用户访问一次浏览器用户的信息就会被cookie存储起来,此时如果没有设置它的存活时间,那么这个cookie的存活时间就是浏览器的默认时间
request.getCookies();//获取浏览器中的cookie
Cookie logNameTime = new Cookie("", "");//创建一个Cookie
logNameTime.setMaxAge();//设置Cookie的最大存活时间,这个时间是秒
response.addCookie(logNameTime);//把Cookie响应给浏览器
cookie中文乱码问题可以通过java.net.URLEncoder
的encode()
方法来进行编码,通过java.net.URLEncode
的decode()
方法解码。
URLEncoder.encode("王五","UTE-8");//编码
URLDecoder.decode(cookie.getValue(),"UTF-8"));//解码
下边看一个具体的小例子
package com.zkw.cookie;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
//用户上一次访问的时间
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[] cookies = req.getCookies();
if(cookies != null){
out.write("你上以访问的时间是:");
for (Cookie cookie : cookies) {
if (cookie.getName().equals("LogNameTime")){
long l = Long.parseLong(cookie.getValue());
Date date = new Date(l);
out.write(date.toLocaleString());
}
}
}else{
out.write("你是第一次访问本站!!!");
}
Cookie logNameTime = new Cookie("LogNameTime", System.currentTimeMillis()+"");
logNameTime.setMaxAge(24*60*60);
resp.addCookie(logNameTime);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
在浏览器中看Cookie的位置,以谷歌浏览器为例
session
Cookie中保存的数据都是String类型的有一定的局限性。
session中保存的数据一个是String类型一个是Object类型,session的信息是存储在服务器上的,每一个浏览器只有一个session
session的销毁主要有两种方法一种是通过session.invalidate()
方法来实现,在使用这一种方法是最好先使用session.removeAttribute("name");
来移除session;另一种是通过配置web.xml文件来实现自动销毁。
<session-config>
<!-- 这里可以设置 session的自动注销的时间,这个时间是以分钟为单位的,我这里设置的是1分钟之后自动注销-->
<session-timeout>1</session-timeout>
</session-config>
下边看一个小例子
package com.zkw.session;
import com.zkw.pojo.Person;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置防止中文乱码
resp.setCharacterEncoding("UTF-8");
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
//获取session
HttpSession session = req.getSession();
//给session中存东西
session.setAttribute("person",new Person("王五",3));
//获取session的id
String sessionId = session.getId();
//判断session是不是新创建的
if (session.isNew()){
resp.getWriter().write("这个session是新创建的它的Id为:"+sessionId);
}else{
resp.getWriter().write("这个session是已经存在服务器中了它的Id为:"+sessionId);
}
//取出在session中存的数据
Person person = (Person)session.getAttribute("person");
System.out.println(person.toString());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
这里的Person是一个类。
当然这些都需要配置web.xml文件在这里就不给出来了,其实配置的方法就那几步,不会的小伙伴们可以看一下博主前几期的博客。还有那个Person类里边只有两个属性一个是name一个是Id