WEB应用程序状态管理

来源:互联网 发布:html源码怎么用 编辑:程序博客网 时间:2024/04/30 09:10
作用:实现请求响应过程结束后,WEB服务器记得用户曾经做过的请求,和发出过的响应,甚至跨多个请求保留信息;
解决办法:如何保存用户的登录状态信息;cookies、Session、URL重写、隐藏表单bidden;

一、表单的隐藏字段:
<input type="hidden" name= "session" value="...">
使用场景
1.1对用户在网站上的访问进行会话跟踪;
1.2为服务器端程序提供预定义的输入
1.3存储动态产生的页面上下文信息;
应用一:在多表单中的监控和跟踪;在一个页面有多个表单的时候,可以监控用户点选的那个表单;通过实现动态改变表达的value,以掌握表单是否已经登录过
应用二:对表单中点选进行增删查改,通过hidden动态改变对选中框的value的值,当需要改变的时候就将这个提交给后台,进行增删查改;
【实操案例:对表格操作实现购物车功能】:
第一步:设置表格,在每个表格的tr中设置,index = "1";index = "2";index = "3"
第二步:将选中的表格的信息保存在hidden,然后将这些信息提交给servlet,servlet将数据拿去操作持久层;
【总结:hidden】:
可以区分多个表单提交,可以保存当前用户操作表格的状态。
防止表单重复提交,保存用于登录的状态【如何做?】
缺点:动态操作才能保留用户的信息,无法实现保存用户的信息在固定的地方;


二、保存用户的会话状态;Cookie
会话含义:打开浏览器,通过超链接或者按钮访问服务器获取到内容到关闭浏览器。称为一次会话
会话解决问题:用户访问服务器,想要保存当前的数据,
主要作用:将访问的次数,及时间进行记录,以客户自定义方式显示WEB站点,客户无需输入用户名和密码访问应用程序【这个方案安全性很差,勿用】;
2.1、cookies含义:1、是客户端端的保存技术,程序把每个用户的数据都通过键值对的方式保存到cookie;再把cookie发送给服务器端,服务器端进行创建设置,再将服务器创建的返回放在客户端cookes里面/2、下次请求的时候,将cookie放在请求头里面,再次访问服务器,服务器就可以根据cookie里面的内容来判断当前用户的状态;
【实操案例-cookie以键值对形式存储指定的信息,指定删除行】:
Post中,
response.setContentType("text/html;charset=utf-8");
PrintWrite out = respone.getWriter();
//获取cookie 数组的形式;
cookie[] cookie = request.getCookies();
//获取cookie的名字
cookie[i].getName()
//获取cookie的值
cookie[i].getValue()
//创建一个cookie
Cookie cook = new Cookie("userName","xiaowang");
//将cook添加到respone中去
respone.addCookid( cook );
//设置cookies保存的有效期--以秒为单位 同时可以通过设置存续期为0销毁他;
cook.setMaxAge(24*3600);
实现在cookie保存用户的登录时间,提示用户多久没有登录
cookie[] cookie = request.getCookies();
if(cookie != null){
for( int i = 0 ; i<coookie.length; i++ ){
if( "lastTime".equals(cookie[i].getName()) ){
long lo = Long.parseLong( cookie[i].getValue());
Date da = new Date( lo );
da.toLoocaleString();
}
}
}else{
打印第一次访问
}
将每次访问的时间信息记录下来,交给response传回客户端; cookie内部信息以键值对的形式存储信息;
Cookie coo = new Cookie("lastTime",System.currentTimeMillis()+"");
coo.setMaxAge(24*3600);
response.addCookie(coo);
实现日期时间中文格式化:da.toLoocaleString();
返回以毫秒为单位的当前时间:System.currentTimeMillis();
【细节补充】:
1、一台电脑可以存储200个cookie,在登录界面的时候,cookie会自动匹配会话的文件路径和查找资源的是否一致,一致才能被调用;
2、设置过期时间cookie信息被保存在本地硬盘,

实现客户的账号,密码保存安全性不高;因此安全性更高的为Session,将客户信息保存在服务器
三、Session
含 义:Session 是服务器端的技术,利用这个技术。我们可以为每一个浏览器(用户)创建一个独享的Session对象;
实现过程:接收到访问产生一个Session id,将Session id 保存在cookie里面,再将cookie发送回客户端,客户端下次访问的时候将Session id 从cookie里面的相关信息提取出来交给服务器,服务器取出SessionID去匹配Session匹配上了就可以实现登录;
httpSession是Session机制的实现规范,Session仅仅是一个接口,当服务器被停止或者重启的时候Session也会被清空;
创建:Session(Session id)-- newcookie-- respone.addCookie(coo)---cookies
//创建对象: getSession()方法封装了实现过程:
实现第一步,int id = request.getSessionId();
第二步,获取到cookie里面的id和session进行匹配
第三步,匹配成功则返回匹配的session对象,匹配失败,则创建一个session
HttpSession session = request.getSession();
//不创建新的,只是匹配使用:
HttpSession session = request.getSession( false );【实现给某些用户创建session,某些不创建,加false不创建,不加则创建; 在if(seesion!=null){ }中判断给session创建
//在session中存储一个键值对的用户名和密码;(String,Object)一个名字绑定一个对象;
session.setAttribute("username","xiaowang");
//判断session是否是新创建的返回布尔类型值,新创建返回true,否则返回false;
session.isNew()
//session.getAttribute("username");通过名字获取Session对象中保存的对象
//session.removeAttribute("username");删除与指定名字对应的对象
//getCreationTime(): 返回第一次创建会话的时间;
//getLastAccessedTime();返回容器最后一次得到该会话ID的请求时间;
//getId()返回每个session的唯一标识;
//会话超时管理:session的销毁时间设置,cookie可以设置销毁时间;这是最长不活动时间
方式一:session.setMaxInactiveInterval(10); 以秒为单位,这里是10秒;
方式二:立即销毁:session.invalidate(); 立即销毁,【用于注销功能到登录界面】
方式三:在xml中 以分钟为单位,表示最长不活动时间
<!-- 只能是正数,表 示分钟作为单位 ,最长不活动时间间隔-->
- <session-config>
  <session-timeout>1</session-timeout>
  </session-config>
  </web-app>
补充】:编码集三件套
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html ;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
【小细节】:session,要满足使用条件必须:sessionid存在(cookie存在-按照会话周期) session存在
解决方案】:设置cookie的最大保存时间,会覆盖getsession底层自己创建好的cookie
Cookie c = new Cookie("",);

【总结】:上下文对象是所有servlet和所有的用户都共享的;session是所有servlet所共享的,但是每一个用户只有一个session;

URL重写
为了很好的维护和保留用户状态信息,有的客户会禁用cookie,这时用URL重写是很好的解决方案;

0 0