有很多Web程序中第一次登录后,在一定时间内(如2个小时)再次访问同一个Web程序时就无需再次登录,而是直接进入程序的主界面(仅限于本机)。实现这个功能关键就是服务端要识别客户的身份。而用Cookie是最简单的身从验证。

  如果用户第一次登录,可以将用户名作为Cookie写到本地,代码如下:

Cookie cookie = new Cookie("user", user);

cookie.setMaxAge(365 * 24 * 3600);

cookie.setPath("/");

response.addCookie(cookie);

当用户再次访问程序时,服务端程序应该检测这个Cookie是否存在,代码如下:

Cookie[] cookies=request.getCookies();

for(Cookie cookie: cookies)

{

    if(cookie.getName().equals(user))

    {

        // 如果user Cookie存在,进行处理

        break;

    }

}

尽管从客户端可以获得User Cookie,但这上Cookie可能存在很长时间,而且仅凭这个Cookie就自动登录并不安全,因此,可以在服务端使用一个Session来管理用户。也就是当第一次登录成功后,就创建一个Session,并将用户的某些信息保存在Session中。代码如下:

HttpSession session =request.getSession();

session.setAttribute(user, user);

session.setMaxInactiveInterval(2 * 3600);  // Session保存两小时

再次访问程序时,确定了cookie存在后,就会继续验证User Session的存在,代码如下:

Cookie[] cookies=request.getCookies();

for(Cookie cookie: cookies)

{

    if(cookie.getName().equals(user))

    {

        if(session.getAttribute(user) != null)

        {

            // 直接forward到主界面

           break;

        }

        else

        { 

            // forward到登录界面

         }

     }

}

虽然上面的代码可以很好地实现自动登录功能,但是当浏览器关闭,再次启动后,由于Servlet用于保存Session ID的JSESSIONID Cookie是临时的(也就是说不是持久Cookie,当浏览器关闭后,这个Cookie就会被删除),因此,需要将JSESSIONID进行持久化。代码如下:

HttpSession session = request.getSession();

session.setAttribute(user, user);

session.setMaxInactiveInterval(2 * 3600);  // Session保存两小时

Cookie cookie = new Cookie("JSESSIONID", session.getId());

cookie.setMaxAge(2 * 3600);  // 客户端的JSESSIONID也保存两小时

session.setMaxInactiveInterval(interval)

cookie.setPath("/");        

response.addCookie(cookie);

  如果使用上面的代码,即使浏览器关闭,在两小时之内,Web程序仍然可以自动登录。

  如果我们自已加一个JSESSIONID Cookie,在第一次访问Web程序时,HTTP响应头有两个JSESSIONID,但由于这两个JSESSIONID的值完全一样,因此,并没有任何影响。如果在响应头的Set-Cookie字段中有多个相同的Cookie,则按着path和name进行比较,如果这两个值相同,则认为是同一个Cookie,最后一个出现的Cookie将覆盖前面相同的Cookie,如下面的两个Cookie,最后一个将覆盖前一个:

Set-Cookie: JSESSIONID=DDB2274CAC6739E1D6747B0043D5D90E; Path=/web

Set-Cookie: JSESSIONID=mysession; Expires=Thu, 05-Jun-2008 05:02:50 GMT; Path=/web

由于下面两个Cookie的path不同,因此,它们是完全不同的两个Cookie:

Set-Cookie: JSESSIONID=DDB2274CAC6739E1D6747B0043D5D90E; Path=/web1

Set-Cookie: JSESSIONID=mysession; Expires=Thu, 05-Jun-2008 05:02:50 GMT; Path=/web2

  致谢:感谢您的耐心阅读!

cookie实现自动登录的更多相关文章

  1. C#检测并安装https站点的数字证书,CefSharp和HttpWebRequest通过会话Cookie实现自动登录访问https站点

    HttpUtil工具类: using System; using System.Collections.Generic; using System.IO; using System.Linq; usi ...

  2. struts2与cookie实现自动登录和验证码验证

    主要介绍struts2与cookie结合实现自动登录 struts2与cookie结合时要注意采用.action 动作的方式实现cookie的读取 struts2的jar包 链接数据库文件 db.pr ...

  3. 使用cookie下次自动登录

    登录时勾选了自动登录处理: 1.加密账号和IP,保存在cookie中,cookie('auto', $value, $time) 2.解密cookie,取出账号和上次IP,判断上次IP==当前IP.账 ...

  4. cookie技术自动登录

    user public class User implements Serializable{ private String username; private String nick; privat ...

  5. 使用cookie实现自动登录

    一.从登录——>主页面,进行的过程是,输入 用户名和密码,以及验证码,点击“登录”跳转到Activity.jsp login1.action(跳转到登录页面) /** 跳转到login(有积分排 ...

  6. Spring mvc session cookie实现自动登录

    设计过程 1. user表存储用户名密码等信息,login表存放用户登陆状态的表 user表中存储username,pwd,等信息 login表存username,series(UUID),token ...

  7. 如何设计相对安全的cookie自动登录系统

    很多网站登录的时候,都会有一个"记住我"功能,用户可以在限定时间段内免登录, 比如豆瓣.人人.新浪微博等都有这种设计.这种技术其实就是基于 cookie的自动登录, 用户登录的时候 ...

  8. 自己Cookie写的自动登录功能 包含BASE64 和MD5的使用

    sql表 username  password字段 User类 有 id username password等字段 Service有一函数 @Override public User findUser ...

  9. 爬虫模拟cookie自动登录(人人网自动登录)

    什么是cookie? 在网站中,HTTP请求时无状态的,也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是谁,cookie的出现就是为了解决这个问题,第一次登陆后服 ...

随机推荐

  1. 关于linux下DB2创建数据库报错问题

    公司业务需要,把服务搭在中标下,在中标下装了DB2 Express-C v9.7.1,之前用着没有问题,隔了一段时间没用,最近又需要用到它,出了一些菜鸟问题,记录下来以免有人和我犯同样的错误...进入 ...

  2. MyBatis入门(一)

    一.MyBaris简介 1)MyBaris发展过程 MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundation 迁移 ...

  3. Linux 学习手记(6): 磁盘、分区、MBR与GPT

    1. 磁盘在LINUX中的表示 Linux所有设备都被抽象为一个文件,保存在/dev目录下 设备名称一般为hd[a-z]或者sd[a-z]([a-z]为分区号),如:hda.hdb.sda.sdb I ...

  4. 多线程下C#如何保证线程安全?

    多线程编程相对于单线程会出现一个特有的问题,就是线程安全的问题.所谓的线程安全,就是如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是 ...

  5. .NET正则表达式匹配Silverlight

    这是一个.NET正则表达式匹配工具的Silverlight 在页面中加入以下代码就可以了: <"> <param name="source" value ...

  6. reactjs学习一(环境搭配react+es6+webpack热部署)

    reactjs学习一(环境搭配react+es6+webpack热部署) 本文的源码在这里下载 https://github.com/tianxiangbing/webpack-study   或者使 ...

  7. 你真的知道setTimeout是如何运行的吗

    大家看下如下代码,猜猜执行结果: var start = new Date; setTimeout(function(){ console.log('时间流逝了:'+(new Date - start ...

  8. ae显示标注

    //添加标注,比TextElment功能更强大 public static void ToAddAnnotate(ILayer layer, string fieldName) { IGeoFeatu ...

  9. SharePoint 2010 网站备份还原简单介绍

    今天尝试了SharePoint2010网站的备份和还原,从网上搜一些文档看看,然后自己试试,感觉和2007的操作没什么太大的区别,跟大家分享下自己尝试的命令行方式和数据库的方式,2007自己常用的也是 ...

  10. Kotlin语法(其他)

    三.其他 [TOC] 1. 多重声明 有时候可以通过给对象插入多个成员函数做区别是很方便的: val (name, age) = person 多重声明一次创建了多个变量.我们声明了俩个新变量:nam ...