1.保存会话的两种技术
1.1、cookie:
Cookie是客户端技术(请求,响应),程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
1,2、session:
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
1.3、cookie和session的区别
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能 考虑到减轻服务器性能方面,应当使用COOKIE。
3、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 考虑到安全应当使用session。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、所以个人建议:
将登陆信息等重要信息存放为SESSION。
其他信息如果需要保留,可以放在COOKIE中。
上面内容引用地址:http://t.csdnimg.cn/Wc5xP
2、Cookie
1.从请求中拿到cookie信息
2.服务器响应给客户端cookie
//cookie相关常用方法
Cookie[] cookies = req.getCookies();//获得cookie,这里返回数组,说明cookie可能存在多个
cookie.getName()//获得cookie中的key
cookie.getValue()//获得cookie中的value
Cookie cookie = new Cookie(String key,String value);//创建一个cookie
cookie.setMaxAge(24*60*60);//设置cookie有效期为一天
resp.addCookie(cookie);//响应给客户端一个cookie,这里我们发现他需要的参数是Cookie类型的对象,注意不是上面那个数组。
2.1、用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");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
//cookie,服务器从客户端获取,从请求中获取
Cookie[] cookies = req.getCookies();//获得cookie,这里返回数组,说明cookie可能存在多个
//判断cookie是否存在
if(cookies!=null){
//如果存在怎么办
out.write("你上一次访问的时间是:");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
if(cookie.getName().equals("lastLoginTime")){
long l = Long.parseLong(cookie.getValue());
Date date = new Date(l);
out.write(date.toLocaleString());
}
}
}else {
out.write("这是您第一次访问本站");
}
//服务器给客户端响应一个cookie
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");//传入的是字符串的键值对
cookie.setMaxAge(24*60*60);//cookie有效期为一天
resp.addCookie(cookie);//这里我们发现他需要的参数是Cookie类型的数据,注意不是上面那个数组
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
运行
刷新页面。
cookie一般会保存在本地的用户目录下的appdata。
2.2、cookie的一些细节问题
一个网站的cookie是否存在上限?细节问题。
- 一个cookie只能保存一个信息;键值对。
- 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie。
- cookie大小有限制,4KB。
- 300个cookie浏览器上限。
删除cookie:
- 不设置有效期,关闭浏览器,自动失效。
- 有效期设置为0。
2.3、删除cookie的方法
有效期设置为0
//删除cookie
public class CookieDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建一个cookie,名字必须和要删除的名字一样
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");//传入的是字符串的键值对
//将cookie有效期设置为零
cookie.setMaxAge(0);
//响应这个cookie
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
运行c1,cookie正常创建显示
运行c2,
再次运行c1
2.4、解决乱码问题最快的方式
编码URLEncoder.encode
解码URLDecoder.decode
//中文数据传递,解决乱码最快途径,一个编码,一个解码
public class CookieDemo03 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");
PrintWriter out = resp.getWriter();
Cookie[] cookies = req.getCookies();
if(cookies!=null){
out.write("您上次访问的时间是:");
for (int i = 0; i < cookies.length; i++) {
Cookie cook = cookies[i];
if (cook.getName().equals("name")){
//响应数据解码URLDecoder.decode
out.write(URLDecoder.decode(cook.getValue()));
}
}
}else {
out.write("您第一次访问本站");
}
//设置数据编码URLEncoder.encode
Cookie cookie = new Cookie("name", URLEncoder.encode("王少楠"));
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3、Session(重点)
3.1、什么是Session:会话
- 服务器会给每一个用户(浏览器)创建一个Session对象。
- 一个session独占一个浏览器,只要浏览器没有关闭,这个session就一直存在。
- 用户登录之后,整个网站它都可以访问,而不是每个页面都要登录。-->保存购物车的信息
3.2、Session和Cookie区别(再次强调):
- Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以存多个)。
- Session是把用户的数据写到用户独占的Session中,服务器端保存(建议只保存重要信息,减少服务器资源浪费)。
- Session对象由服务器创建。
3.4、使用场景
- 保存一个用户的登录信息
- 购物车信息
- 在整个网站中经常会使用的数据,我们将它保存在session中。
3.5、使用Session
3.5.1、使用Session存数据
//使用Session存数据
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.解决乱码问题
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//2。得到Session
HttpSession session = req.getSession();
//3.给Session中存东西
session.setAttribute("name","王少楠");//存储一个数据
session.setAttribute("person",new Person("刘畅",3));//存储对象数据
//获取Session的ID
String id = session.getId();
//判断Session是否是新创建的
boolean aNew = session.isNew();
if(aNew){
resp.getWriter().write("Session创建成功,SessionID为:"+id);
}else {
resp.getWriter().write("Session已经在服务区存在了"+id);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>sessionDemo01</servlet-name>
<servlet-class>com.wsn.servlet.SessionDemo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sessionDemo01</servlet-name>
<url-pattern>/s1</url-pattern>
</servlet-mapping>
运行sessionDemo01
删除session再次运行,创建成功
3.5.2、使用Session读取数据
SessionDemo02
//使用Session读取数据
public class SessionDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.解决乱码问题
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//2.取Session
HttpSession session = req.getSession();//创建Session
//2.1取值(一个数据)
Object value = session.getAttribute("name");
resp.getWriter().write(String.valueOf(value));
//2.2取对象的值
Person person = (Person) session.getAttribute("person");
resp.getWriter().write(String.valueOf(person));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
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 String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
xml
<servlet>
<servlet-name>sessionDemo02</servlet-name>
<servlet-class>com.wsn.servlet.SessionDemo02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sessionDemo02</servlet-name>
<url-pattern>/s2</url-pattern>
</servlet-mapping>
运行sessionDemo02发现值为空,说明session还没有创建
运行sessionDemo01后再次运行sessionDemo02发现值正常取到
3.5.3、使用Session删除和注销
SessionDemo03
//注销session
public class SessionDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();//创建Session
session.removeAttribute("person");//删除session
//手动注销session
session.invalidate();//注销session 注销相当于关掉浏览器
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
xml
<servlet>
<servlet-name>sessionDemo03</servlet-name>
<servlet-class>com.wsn.servlet.SessionDemo03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sessionDemo03</servlet-name>
<url-pattern>/s3</url-pattern>
</servlet-mapping>
运行,先进sessionDemo01,再进sessionDemo02,发现Session正常创建和取到
然后进sessionDemo03,再进sessionDemo01,发现Session重新创建ID也变了,说明注销和删除成功
进sessionDemo03,再进s2,发现值为null也可以证明注销和删除成功
3.5.4、在web.xml中实现定时自动注销
<session-config>
<!--以分钟为单位,十五分钟后 session自动失效-->
<session-timeout>15</session-timeout>
</session-config>
配置完这个后,在浏览器中每十五分钟Seesion都会注销,然后立即重新创建一个新的ID。