一、什么是用户自动登录?
对于我们的网站向已注册用户提供某些专门的服务,比如网上购物、在线下载、收费浏览等等,就会要求用户在使用这些服务之前进入登录页面,输入用户名和密码,并进行验证。
如果用户经常访问我们的网站,假如每天都访问一次,或者好几次,那么用户每次都重复这些登录操作就会感到相当厌烦。通过一些简单的技术手段,我们可以让网站“记住”那些在曾经登录过的用户。当该用户下次再来访问的时候,网站可以识别该用户,并为其自动完成登录过程。
二、基本思路
作为网站的编写者,我们无从知道坐在电脑前的那个人是谁。我们能够知道的是,访问网站的是哪一台电脑——这一点可以通过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有效期为准,而 是以服务器端数据库中的信息为准。当我们想要调整用户自动登录的有效期的时候,只需要修改数据库中相应的日期字段即可,因而这一过程变得更加安全。
相关推荐
下面我们将深入探讨这个主题,包括J2EE中的会话管理、Cookie的工作原理以及如何实现自动登录。 首先,J2EE提供了一套完整的会话管理机制,主要是通过Session对象来实现。Session是服务器为每个客户端维护的状态信息...
本项目“j2ee练习8实现页面自动跳转”旨在解决一个购物界面的跳转问题,最初存在功能无法实现的问题,但经过修正后,已经成功实现了这一目标。以下将详细介绍该知识点及其相关技术。 1. **请求转发与重定向** - **...
3. **设定Session生命周期**:设置Session的有效时间,以实现自动注销功能。 4. **开发一个下载文件的JavaEE Web应用**:创建一个能够提供文件下载服务的Web应用。 5. **开发一个Session监听器**:实现Session创建和...
- **Cookie**:客户端用来存储少量数据的一种方式,当浏览器向服务器发送请求时会自动带上对应的Cookie。 示例代码: ```java // 设置Session HttpSession session = request.getSession(); session.setAttribute(...
在J2EE中,**Session**和**Cookie**是两种非常重要的用户会话管理技术,它们用来在服务器和客户端之间持久化数据,尤其是在用户浏览网站时保持用户的登录状态和其他相关信息。 **1. Session技术** Session是服务器...
6. **实践应用**:通过编写实际的代码,例如创建一个简单的登录系统,实现基于Session和Cookie的用户认证和会话管理。 在"_ex2"这个文件中,可能包含了你完成练习的代码示例。分析和理解这些代码将有助于你巩固理论...
- **实现方法**:如何将Web服务集成到现有的J2EE应用中。 #### 五、应用部署 ##### 38. 应用服务器安装 (UNIT38) - **安装步骤**:详细介绍如何安装和配置应用服务器。 - **常用应用服务器**:IBM WebSphere、...
本项目“经典毕业设计网上书店”正是基于J2EE技术实现的一个实例,旨在展示如何运用这些技术来创建一个完整的电子商务网站。 1. **项目架构** 该项目通常采用三层架构设计:表现层、业务逻辑层和数据访问层。表现...
【标题】和【描述】提及的是一个针对新手的J2EE实战项目,主要涉及使用JSP和数据库技术来开发一个OA(Office Automation)自动化办公系统。这个项目旨在帮助初学者熟悉J2EE环境下的Web应用开发,特别是与数据库交互...
以上就是Java J2EE环境下实现登录模块的关键知识点。实际开发中,开发者需要根据项目需求,结合这些技术来设计和实现一个高效、安全的登录系统。在提供的"web06_login"压缩包中,可能包含了示例代码或教程,供学习者...
在本项目中,J2EE的组件模型包括了Servlet、JSP(JavaServer Pages)、EJB(Enterprise JavaBeans)等,它们共同协作以实现系统的业务逻辑和数据处理。 1. **Servlet**:Servlet是Java中处理HTTP请求的服务器端组件...
在J2EE应用程序开发中,验证码(CAPTCHA)是一种常用的安全机制,用于防止自动化脚本或机器人进行恶意操作,如批量注册、恶意登录等。验证码通常由字母和数字组成,设计目的是让人类用户能轻松识别,但对计算机程序...
当用户尝试访问系统B时,系统B会检查是否有有效的票据,如果有,则自动登录用户,无需再次输入凭证。 在J2EE环境中,我们可以利用Servlet Filter来拦截所有HTTP请求,检查用户是否已经登录。Filter是Java Web应用中...
本篇文章将深入探讨如何使用J2EE实现用户登录、信息修改以及数据添加等功能。 首先,让我们关注登录功能的实现。在J2EE中,登录通常涉及到用户接口(UI)、控制器(Controller)和数据访问对象(DAO)。用户在UI上...
4. **EJB(Enterprise JavaBeans)**:在J2EE环境中,EJB是可重用的服务器端组件,用于实现业务逻辑。在博客系统中,可能有UserBean来处理用户操作,ArticleBean来处理文章管理等。 5. **MVC(Model-View-...
- **观察者模式**:多对一的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。 **4. 经典企业设计模式** - **MVC (Model-View-Controller)**:将业务逻辑、数据和界面展示分离。 -...
《基于J2EE网上招聘系统的设计与实现》这篇毕业论文主要探讨了如何利用J2EE技术构建一个高效、便捷的在线招聘系统。J2EE(Java 2 Platform, Enterprise Edition)是一个用于开发和部署企业级应用程序的开放平台,它...
《基于BS模式的J2EE技术的百飞特网上订餐系统的设计与实现》 本项目是一款采用J2EE技术构建的BS(Browser-Server,浏览器-服务器)模式的网上订餐系统,旨在提供便捷、高效的餐饮服务。该系统不仅实现了用户在线...
### J2EE课程总结 #### 数据库:Oracle **1. Oracle SQL基础知识** - **选择行**:通过`SELECT`语句结合`WHERE`子句来实现特定条件下的数据筛选。 - **限制选择行**:利用`LIMIT`或`ROWNUM`来限制返回结果的数量...
- **Application 对象的作用**:Application 对象实现了 `javax.servlet.ServletContext` 接口,它在整个应用生命周期内保持不变,直到服务器关闭。这意味着所有用户共享同一个 application 对象。 - **应用场景**...