在日常生活中,我们和别人的一次交流就是回话。web会话可简单理解为:用户开一个浏览器,访问某一个web站点,在这个站点点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。比如我们在网上购物,登陆后,会话开始,关闭浏览器后,这个会话就结束了。当我们再次打开浏览器,想要购物的时候,还得重新登陆。(但是,有的时候我们长时间静止在网站上,再次看时需要重新登陆,这是也了安全)
注意:并不是打开一个网页就是一个会话,比如ie打开个标签并不是会话,而是右键菜单–文件–新建会话(不同浏览器不一样)。
原因:http无状态的协议,什么是无状态呢,是指http没有记忆的功能。如果没有状态的情况下,需要每次链接都传送大量数据,比如说在购物的时候,如果没有cookie和session每浏览加入购物车一次都得重新登陆。
为了解决这一问题,两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session。
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
cookies有什么作用呢?比如我们在某个网站注册了,当我们下次访问的时候,会向你问好。比较常见的是记住密码(一周内记住我)之类的。很方便我们再次访问。
以记住用户名和密码为例:
我们在myeclipse中新建web project项目
在AServler中发送给浏览器用户名和密码,在BServlet中得到用户名和年龄了:
代码如下:
在AServlet中
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 发送cookie让浏览器记住
//创建Cookie对象,记住的内容是键值对形式;
Cookie cookie = new Cookie("name", "yu");
Cookie cookie2 = new Cookie("age", "20");
//将cookie发送给浏览器;
response.addCookie(cookie);
response.addCookie(cookie2);
}
}
在BServlet中
public class BServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 取出在AServlet要求在浏览器中记住的信息
Cookie cookies[] = request.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
if (c.getName().equals("name")) {
System.out.println("从AServlet中获取的用户名" + c.getValue());
} else if (c.getName().equals("age")) {
System.out.println("从AServlet中获取的用户名" + c.getValue());
}
}
}
}
}
然后首先访问AServlet,再访问BServlet,这样看打印日志:
这样我们就从BServlet中取出AServlet中的用户名和密码了。
首先访问AServlet的时候
分析,使用Fiddler抓包:
从上面可以看出这就是浏览器记住cookie的位置
当我们再次访问浏览器的时候,从请求中可以看出cookie从请求头在携带过去
session也是一种会话,cookie是把数据写在客户端,而session是把数据存储在服务器
session技术基于cookie没有cookie,session也无法完成。
既然session是存储在服务器的工作,那么我们客户端就少了很多工作
1、浏览器在第一次访问服务器时,服务器发现没有携带sessionId,会自动创建session对象。并将创建的cookie对象保存sessionId发送给浏览器。
2、在浏览器发送请求时,带有cookieid的session
1、使用Session完成用户登陆;利用Session实现一次性验证码
2、利用Session防止表单重复提交
用session实现验证码
下面这篇是session在android中的使用(android中图片验证码)
http://blog.csdn.net/androidxiaogang/article/details/51943216
在我们登陆后,都会设置session的时效,确保用户在一段时间内没有登陆,重新登陆。一方面为用户安全,另一方面减少服务器压力。
session的时效设置是由服务器的时间来统计的
比如设置session.setMaxInactiveInterval(600),即在没有活动10分钟后,session将失效。 这时候提示用户重新登陆就可以了