一、综述
1.1本课任务
1、在新闻系统中保存用户状态
2、登录时自动填写用户名
3、统计页面访问次数
1.2学习目标
二、session
2.1问题引入
我们在上一节课中知道:request的setAttribute()方法的作用域仅限于一次请求。在重定向之后,之前设置的request的mess值无法被取到;转发的话这个值是可以被取到的,这是因为服务器内部自动完成了跳转,无形中延长了request作用域。那除了request之外,还有哪些对象可以用来传递属性值?其作用域如何?
2.2session
1、session的开启和作用域
session这个词经常跟会话绑定在一块,一次session就是一次会话。所谓的一次会话就是浏览器和服务器的一次通话。从我打开浏览器访问一个服务器开始,就是创建了一个session,会话就开始了。session的结束方式可以设置,有三种方式,以后再说。会话可以在多次请求中保存和使用数据。session的作用域是一个会话。所以这个地方就可以解决上一节的那个重定向之后拿不到值得问题了。具体代码如下:
运行结果:
session的作用域比request更大。session是一次会话,但它更是一种机制。服务器端要来记录客户端的状态,那怎么知道是一个用户的操作啊?需要有一种机制来做这件事,这个机制就是session。所以session就是服务器用来记录同一个客户端的状态的机制。(每一个session有一个自己的id,可以根据这个id来判断是否是一个客户,可以通过session的getID方法拿到一个session的id)
2、session的id
在上述代码中,去拿到自己的session看一下,看登录失败和登录成功的时候的id值是否相同:
代码:
运行之后的session的id是一样的。
同时在同一个浏览器上先后访问同一个服务器的session的id是相同的,而不同浏览器上访问同一个服务器的session的id是不同的。
3、示例
session是在服务器端存的信息,你的一个信息放到session里面就意味着你的这个信息放到服务器了。服务器记录这么多用户信息,会很大占用内存,所以不可能什么东西都往session里面放的,一般比如用户名才会往里面放。
需求:当我登录的时候,如果登录成功了,则跳转到新闻页面,并弹出欢迎;如果没有登录,则显示用户名和密码框。
示例代码:
运行结果:
登录,同时登录之后再次打开该新闻页面:
在另一个浏览器上直接访问该页面,未登录:
session是单用户、多页面可共享的。session的数据是保存在服务器端的。每一个session有一个唯一的session的id