`
javajdbc
  • 浏览: 43107 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

java操作cookie 实现两周内自动登录

阅读更多

一、什么是用户自动登录?

   对于我们的网站向已注册用户提供某些专门的服务,比如网上购物、在线下载、收费浏览等等,就会要求用户在使用这些服务之前进入登录页面,输入用户名和密码,并进行验证。

    如果用户经常访问我们的网站,假如每天都访问一次,或者好几次,那么用户每次都重复这些登录操作就会感到相当厌烦。通过一些简单的技术手段,我们可以让网站“记住”那些在曾经登录过的用户。当该用户下次再来访问的时候,网站可以识别该用户,并为其自动完成登录过程。

二、基本思路

   作为网站的编写者,我们无从知道坐在电脑前的那个人是谁。我们能够知道的是,访问网站的是哪一台电脑——这一点可以通过Cookie实现。因此,对用户的识别实际上就是对客户端电脑的识别。

 简单的说,当用户第一次登录网站的时候,网站向客户端发送一个包含有用户名的Cookie。当用户在之后的某个时候再次访问,浏览器就会向网站服务器回送这个Cookie,于是,我们可以从这个Cookie中读取到用户名,然后调用登录的方法,从而实现自动为用户登录。

三、防止欺骗

   Cookie只是一个普通的文本文件,那里面包含的字符串可以直接用记事本打开并进行编辑。因此任何人在任何电脑上都可以伪造一个包含有他人用户名 的 Cookie,从而实现对他人身份的冒用。要解决这个问题,就要在Cookie中附加一项信息,这个信息需要具有以下特性:1、和该用户一一对应;2、伪 造难度大。这些内容和用户名一起,以Cookie的形式发送给用户的浏览器。并且,服务器必须能够记住这项内容,以便用户再次访问的时候进行核对。

   理论上,可以使用该用户的密码。密码具备了前述的两个特点。但是因为Cookie本身未经加密,保存于其中的密码(应该加密)可以被任何人看到,因此这个方法极不安全。

   另一种可以加以利用的信息是用户访问时的Session id。因为Session id是一个由系统随机产生的、无规律的、长度较长的字符串,因此它很难被伪造。要把它和用户对应起来,我们需要在数据库中添加一个表,这个表至少有两个字 段,一个是用户名,一个是Session id。当用户首次登录的时候,我们把当前的Session id和用户名分别用Cookie发送给用户,同时,把这两项作为一条记录插入数据库。这样,当用户再次访问的时候,服务器就可以读取客户端发来的这两个 Cookie,并且用它们的值和数据库中的记录比对。如果在数据库中找到了相应记录,就说明这台电脑的确是该用户上次登录时使用的电脑,进而可以为该用户自动登录。

四、实现

1、在登录页面中添加一个复选框,让用户选择是否愿意在一定时间内实现自动登陆,例如两周。

代码:
<input type="checkbox" name="autologin">两周内自动登录

2、在负责处理登录过程的Servlet中,判断用户是否选择了该复选框。如果是,则执行这两个操作:向用户发送两个Cookie,以及向数据库写入一条相应的记录。

代码:

Cookie ckUsername, ckSessionid;

if (autologin.equals("on")) {
   // 如果用户选择了“两周内自动登录”,则向用户发送两个cookie。
   // 一个cookie记录用户名,另一个记录唯一的验证码,
   // 并将此验证码写入数据库,以备用户返回时查询。(防止伪造cookie)
   ckUsername = new Cookie("autoLoginUser", user.getUsername()); // user是代表用户的bean
   ckUsername.setMaxAge(60 * 60 * 24 * 14);   //设置Cookie有效期为14天
   res.addCookie(ckUsername);

   sessionid = session.getId(); // 取得当前的session id
   ckSessionid = new Cookie("sessionid", sessionid);
   ckSessionid.setMaxAge(60 * 60 * 24 * 14);
   res.addCookie(ckSessionid);

   // 在数据库中插入相应记录
   userSessionDAO.insertUserSession(user, sessionid);
}

3、实现自动登录。因为用户下次访问的时候,可能直接访问网站的任何页面(例如通过收藏夹),而不一定是首页或者登录页面,所以我们需要用Filter拦截到达该网站的所有请求,并执行自动登录。

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
   HttpServletRequest request = (HttpServletRequest) req; 
   HttpSession session = request.getSession(true);
   String username;
   String sessionid;   // 此sessionid是上次用户登录时保存于用户端的识别码,用于用户后续访问的自动登录。不是本次访问的session id。
   Cookie[] cookies;
   CookieManager cm = new CookieManager(); // CookieManager是一个自定义的类,用于从Cookie数组中查找并返回指定名称的Cookie值。
   boolean isAutoLogin;

   // 如果session中没有user对象,则创建一个。
   User user = (User) session.getAttribute("user");
   if (user == null) { 
    user = new User(); // 此时user中的username属性为"",表示用户未登录。
   }

   // 如果user对象的username为"",表示用户未登录。则执行自动登录过程。
   // 否则不自动登录。
   if (user.getUsername().equals("")) {
    // 检查用户浏览器是否发送了上次登录的用户名和sessionid,
    // 如果是,则为用户自动登陆。
    cookies = request.getCookies();
    username = cm.getCookieValue(cookies, "autoLoginUser");
    sessionid = cm.getCookieValue(cookies, "sessionid");
    isAutoLogin = userSessionDAO.getAutoLoginState(username, sessionid); // 如果在数据库中找到了相应记录,则说明可以自动登录。

    if (isAutoLogin) {
     user.setUsername(username);
     user.setNickname(DBUtil.getNickName(username));
     session.setAttribute("user", user); // 将user bean添加到session中。
    }
   }
   chain.doFilter(req, resp);
}

4、注销。只有当用户在上次访问时,未经注销就离开网站,我们才能在该用户下次访问时执行自动登录。如果用户显式的执行了注销操作,那就表示该用户 不希望我们记住他。我们需要在执行注销操作的Servlet中,从数据库中删除相应记录。这样,下次用户访问的时候就不会执行自动登录了。

五、改进

用户可能为了方便,自行修改Cookie中的有效期,从而达到长期自动登录的目的。对某些存有敏感信息的网站来说,这样做并不安全。当用户长时间没有使用他的电脑,或者将电脑遗弃、转让了,而保存于其中的Cookie仍然是有效的,这就为用户和网站带来潜在的风险。

要解决这个问题,我们可以在数据库中增加一个字段,用以记录自动登录的过期日。这样,是否执行自动登录就不再以客户端的Cookie有效期为准,而 是以服务器端数据库中的信息为准。当我们想要调整用户自动登录的有效期的时候,只需要修改数据库中相应的日期字段即可,因而这一过程变得更加安全。

 

分享到:
评论
5 楼 pandatyut 2014-06-09  
你好!我想问一下CookieManager cm = new CookieManager(); // CookieManager是一个自定义的类,用于从Cookie数组中查找并返回指定名称的Cookie值。CookieManager是怎么写的啊?
4 楼 Mr_WangB 2013-12-24  
相见恨晚
3 楼 a123159521 2012-01-13  
即使电脑被盗,其实问题也不大,只要在支付等敏感功能,必须重新登陆就可以了。还有楼主把sessionId当密码用,靠谱?

还有一个问题未加密,安全性很弱的。可以根据用户名+时间+密码+公钥+私钥进行加密,然后进行解密,如果还感觉不够安全,可以二次加密,只需要按规则解密就可以了.[请求拦截,你的sessionId就被盗了]



2 楼 沈冠军 2011-01-20  
好极了,下次试试
1 楼 marc0658 2011-01-14  
写得灰常好,对我很有帮助。辛苦!

相关推荐

    java操作cookie-实现两周内自动登录.doc

    java 操作 Cookie 实现两周内自动登录 java 操作 Cookie 实现两周内自动登录是指通过在用户第一次登录网站时,网站向客户端发送一个包含有用户名的 Cookie,当用户下次访问时,浏览器将该 Cookie 发送回网站服务器...

    JS实现两周内自动登录功能

    标题中的“JS实现两周内自动登录功能”是指利用JavaScript编程语言设计的一种机制,使得用户在登录网站后,如果选择“两周内自动登录”,则在两周内的每次访问,系统都能自动填充用户名和密码,免去用户手动输入的...

    JAVA通过Session和Cookie实现网站自动登录的技术

    JAVA 通过 Session 和 Cookie 实现网站自动登录的技术 在网站开发中,实现自动登录功能是非常重要的,JAVA 通过 Session 和 Cookie 实现网站自动登录的技术是其中的一种方法。本文将详细介绍如何使用 Session 和 ...

    实现cookie记住自动登录

    1.代码是完整的导入到 myEclipse 中就可以使用 2.实现struts cookie 记住两周 自动登录功能 3.访问地址:http://127.0.0.1:8080/cookie/index.jsp 4.系统默认有两个账户 在 UserDao 中可以查到

    Java 模拟cookie登陆简单操作示例

    Java 模拟Cookie 登陆简单操作示例 在本文中,我们将介绍 Java 模拟 Cookie 登陆的简单操作,结合实例...本示例可以帮助开发者快速了解 Java 模拟 Cookie 登陆的实现原理和实现方法,为实际开发中提供了有价值的参考。

    JAVA通过Session和Cookie实现网站自动登录

    ### JAVA通过Session和Cookie实现网站自动登录 在现代Web应用开发中,用户认证与授权是极为重要的环节之一。为了提供良好的用户体验,很多网站都提供了自动登录功能,即用户首次登录后,在一定时间内再次访问该网站...

    Spring Security实现两周内自动登录"记住我"功能

    【Spring Security实现两周内自动登录"记住我"功能】 在Web应用程序中,"记住我"功能是一个常见的特性,它允许用户在一定时间内无须再次登录即可访问应用。Spring Security是Java开发中广泛使用的安全框架,提供了...

    使用Java servlet实现自动登录退出功能

    使用Java Servlet实现自动登录退出功能需要了解Java Servlet、自动登录退出功能、Cookie、Filter、UserDao、UserService、Servlet的生命周期、Filter的生命周期、HttpServletRequest和HttpServletResponse等概念。

    java cookie 读写,记住密码 自动登录

    本主题将详细讲解如何使用Java进行Cookie的读写操作,以及如何利用Cookie实现记住密码和自动登录功能。 1. **Cookie基本概念** Cookie是由服务器发送到用户浏览器并存储在本地的一小块数据,当用户再次请求同一...

    java 操作cookie

    Java 操作 Cookie Java 操作 Cookie 是一种常用的 Web 开发技术,用于在服务器端和客户端之间交换数据。Cookie 是一种小文本文件,存储在客户端浏览器中,用于记录用户的行为和偏好。下面我们将详细介绍 Java 操作 ...

    Cookie 实现WebView自动登录

    本文将详细探讨Cookie与WebView的结合使用,以及如何在iOS中实现自动登录。 一、Cookie基础 Cookie是由服务器端发送到客户端(浏览器)的一小段文本信息,用于存储用户的状态信息,如登录状态、个性化设置等。当...

    JAVA爬虫实现自动登录淘宝

    JAVA爬虫实现自动登录淘宝 JAVA爬虫是指使用JAVA编程语言来实现网页爬虫的技术。爬虫是指模拟用户的行为来自动获取网络资源的程序。JAVA爬虫可以用来自动登录淘宝网,实现自动登录淘宝网的功能。 在本例中,我们...

    Cookie实现自动登录

    本文将深入探讨Cookie如何实现自动登录,以及与之相关的源码和工具。 Cookie是Web服务器发送到用户浏览器并存储在本地的一小段数据,用于在后续请求中识别用户。它们是HTTP协议无状态特性的补充,因为HTTP本身不...

    教你用Java安全有效的实现两星期内自动登陆功能

    ### 教你用Java安全有效地实现两周内自动登录功能 #### 概述 本文将详细介绍如何使用Java技术安全地实现用户两周内的自动登录功能。自动登录功能为用户提供了一种便捷的体验,允许用户在一定时间内无需重复输入...

    jsp cookie+session实现简易自动登录

    本文实例为大家分享了jsp cookie+session实现简易自动登录的具体代码,供大家参考,具体内容如下 关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。 如果设置了...

    关于java应用cookie

    ### 关于Java应用Cookie知识点详解 #### 一、Cookie简介 Cookie是一种常用的技术,用于存储用户的访问信息。在Web开发中,服务器可以将少量的信息发送到客户端浏览器,并存储在客户端,这种信息就是Cookie。当...

    Java Web登录自动填入用户名密码

    总的来说,实现“Java Web登录自动填入用户名密码”功能需要结合前端页面、后端逻辑和浏览器的Cookie机制。在设计时,不仅要关注功能实现,还要考虑安全性与用户体验。通过学习和实践,开发者可以更好地掌握Java Web...

Global site tag (gtag.js) - Google Analytics