利用Cookie和Session保持WEB客户端始终在线

转自:http://blog.csdn.net/kingtrue1/article/details/4389814


问题描述:有些WEB业务系统,比如物流、ERP等用户比较习惯把浏览器一直打开,当有新业务发生时,用户会即时录入,当通过SESSION时,由于会话已过期,经常会导致提交失败,用户不得不又要重新登陆并录入单据,影响系统的使用。

 

分析:做WEB开发的用户基本都会遇到保持用户会话的问题,由于HTTP协议是一个无状态的协议,所以我们不得不利用Cookie(客户端方式)或利用SESSION(服务器方式,新打开的浏览器时会自动创建一个SESSIONID,名称随应用服务器而不同),用Cookie时不安全,因为它是附在HTTP请求的头信息里的,在浏览器地址栏中输入“javascript:document.write(document.cookie)”可显示COOKIE信息(IE6和IE7中均可以),Session又受服务器限制,一般会限制十几至几十分钟以内。下面介绍一种折衷的办法,利用Cookie与Session相结合的办法,保持服务器一直在线。

 

解决办法:(JAVA代码)

1,用户登陆时,在保存SESSION信息同时,将登陆信息以加密的方式保存到Cookie中。

   //以下为代码片段,拷贝后需要处理

public static String checkAuth(HttpServletRequest request,HttpServletResponse response,String mark,String userid,String pwd){
  UserAuthClient userAuth= new UserAuthClient();
  String info=userAuth.getUserAuthHttpPort().check(userid,pwd,request.getRemoteAddr());
  if(info.equals("ok")){
   HttpSession session=request.getSession();
   DESPlus des;
   try {
    des = DESPlus(request.getRemoteAddr());//加密密码为IP地址
    setCookie(request,response,"SN",des.encrypt(userid+";"+pwd));//设置Cookie

    session.setAttribute("Employee", employee);//设置SESSION
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
  return info;
  
 }

 

 

2,验证用户

//查看用户存根是否存在,如果存在通过用户存根直接通过存根创建用户登陆信息

public static Employee getEmployee(HttpServletRequest request,HttpServletResponse response){
  //用户是否已经登陆,如果已经登陆,则返回用户信息

  HttpSession session=request.getSession();
  Employee employee=(Employee)session.getAttribute("Employee");
  if(employee!=null)return employee;//验证成功


  DESPlus des;
  try {
   des = new DESPlus(request.getRemoteAddr());
   String SN=getCookiebyName(request,"SN");
   if(SN==null)return null;
   SN=des.decrypt(SN);
   if(SN==null)return null;
   String [] strs=SN.split(";");
   if(strs==null || strs.length!=2)return null;

   String userid=str[0];

   String pwd=str[1];
   String isok=checkAuth(request,response,userid,pwd);//重新登陆,成功时会创建会话
   if(isok.equals("ok")){
    return (Employee)session.getAttribute("Employee");
   }
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return employee;

 }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值