采用SSH架构加以说明:
1.  建立一个登录管理类LoginManager
2.  在LoginManager中定义一个集合,管理登录的用户。
3.  在Spring中将LoginManager配置成单例
4.  如果使用自定义的用户管理类,则为了说明方便,将此类命名为UserContext(表示用户授权的上下文)
5.  如果未使用自定义的用户管理类,则直接使用Session。
6.  在登录授权对象中,检查用户是否是合法用户,如果是合法用户,则在LoginManager的集合中查找用户是否已经在线,如果不在线,则将用户加入集合。
7.  处理策略一:如果用户已经在线,则取新登录用户的Session,将它失效,则能阻止新登录用户登录。
8.  处理策略二:如果用户已经在线,则取出在线用户的Session,将它失效,再把新登录用户加入LoginManager的集合。则先登录用户不能执行有权限的操作,只能重新登录。

代码片段:
1. applicationContext.xml

<bean id="loginManager" class="LoginManager" scope="singleton" />
<bean id="action" class="LoginAction" scopt="prototype" >
<property name="laginManager" ref="loginManager" />
</bean>

2. LoginManager.java

Collection<Session> sessions;

public Session login(Session session) {
for (Session s : sessions) {
if (s 与 session 是同一用户)
策略一: return session
策略二:{
sessions.add(session); // 这两行在循环中操作集合类会抛出异常
sessions.remove(s); // 此处仅为简单示范代码,实际代码中应该在循环外处理
return s;
}
}
sessions.add(session); return null;
}

3. LoginAction.java

LoginManager loginManager;

public String execute() throws Exception {
取session
检查用户名,密码
if (是合法用户) {
session = loginManager.login(session);
if (null!=session) session.invalidate();
}
}

4. 如果自定义了UserContext,则可将集合改成Collection<UserContext> users;

5. UserContext.java

Session session;
Session getSession() {
return this.session;
} boolean login(String userName, String password) {
访问数据库,检查用户名密码
return 是否合法;
} boolean sameUser(UserContext uc) {
return uc.userName.equals(this.userName);
}

6. 修改LoginManager.java

Collection<UserContext> users;

public UserContext login(UserContext user) {
for (UserContext uc : users) {
if (uc.sameUser(user))
策略一: return user
策略二:{
users.add(user); // 这两行在循环中操作集合类会抛出异常
users.remove(uc); // 此处仅为简单示范代码,实际代码中应该在循环外处理
return uc;
}
}
users.add(user); return null;
}

7. 修改LoginAction.java

public String execute() throws Exception {
取session // 也可以在UserContext内部取session。
UserContext user = new UserContext();
user.setSession(session);
if (user.login(userName, password)) {
UserContext uc = loginManager.login(user);
if (null!=uc) uc.getSession().invalidate();
}
}

Java Web网站应用中的单点登录的更多相关文章

  1. 使用 CAS 在 Tomcat 中实现单点登录 http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/

    developerWorks 中国 技术主题 Open source 文档库 使用 CAS 在 Tomcat 中实现单点登录 单点登录(Single Sign On , 简称 SSO )是目前比较流行 ...

  2. 在Java web项目中防止用户注销后使用浏览器中的“后退”按钮返回注销前页面

    一背景 公司安全整改, 要求:系统中对于关键业务操作应确保使用浏览器"后退"功能无法回到上一步操作界面. 提供:凭证提供所有被检查系统关键业务操作后回退视频,视频显示关键业务操作后 ...

  3. JAVA WEB项目中各种路径的获取

    JAVA WEB项目中各种路径的获取 标签: java webpath文件路径 2014-02-14 15:04 1746人阅读 评论(0) 收藏 举报  分类: JAVA开发(41)  1.可以在s ...

  4. Java Web开发中MVC设计模式简介

    一.有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容.但是我们之前自己编写的应用一般存在无条 ...

  5. linux 下用renameTo方法修改java web项目中文件夹名称问题

    经测试,在Linux环境中安装tomcat,然后启动其中的项目,在项目中使用java.io.File.renameTo(File dest)方法可行. 之前在本地运行代码可以修改,然后传到Linux服 ...

  6. 对Java Web项目中路径的理解

    第一个:文件分隔符 坑比Window.window分隔符 用\;unix采用/.于是用File.separator来跨平台 请注意:这是文件路径.在File f = new File(“c:\\hah ...

  7. 在Java Web项目中添加定时任务

    在Java Web程序中加入定时任务,这里介绍两种方式:1.使用监听器注入:2.使用Spring注解@Scheduled注入. 推荐使用第二种形式. 一.使用监听器注入 ①:创建监听器类: impor ...

  8. Java Web项目中缺少Java EE 6 Libraries怎么添加

    Java Web项目中缺少Java EE 6 Libraries怎么添加 具体步骤如下: 1.项目名称上点击鼠标右键,选择"Build Path-->Configure Build P ...

  9. Java Web开发中路径问题小结

     Java Web开发中,路径问题是个挺麻烦的问题,本文小结了几个常见的路径问题,希望能对各位读者有所帮助. (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 ...

随机推荐

  1. C 结构体小结

    看了三天结构体,是时候总结一下了. 关于结构体的声明: struct Student { ]; char sex; int age; ]; }; /*然后定义一个Student 类型的 student ...

  2. 【Django】Django 如何使用 Django设置的日志?

    代码: from django.core.management.base import BaseCommand, CommandError from django.db import models # ...

  3. 【云计算】Docker集中化web界面管理平台shipyard

    Docker集中化web界面管理平台shipyard docker shipyard seanlook                        2015年01月05日发布             ...

  4. phpmyadmin 主机名自动补全

    2015年2月9日 14:29:25 新安装的phpmyadmin在登录界面中, 主机名的输入框没有自动补全功能, 导致每次都得手动输入ip地址 找到 phpmyadmin/libraries/aut ...

  5. php中正则表达式的匹配和数据验证总结

    正则表达式能匹配复杂的字符串形式,比字符串处理函数功能更加多,只不过执行效率有所降低,但是可以实现非常复杂的匹配,下面总结一下 1.简单的字符串匹配,判断指定字符串是不是在另一个字符串中,和字符串查找 ...

  6. Java for LeetCode 145 Binary Tree Postorder Traversal

    Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary ...

  7. Java for LeetCode 031 Next Permutation

    Next Permutation Total Accepted: 33595 Total Submissions: 134095     Implement next permutation, whi ...

  8. 虚拟机下安装ubuntu后root密码设置

    ctrl+alt+t:调出命令行. 问题描述: 在虚拟机下安装了ubuntu中要输入用户名,一般情况下大家都会输入一个自己的网名或绰号之类的,密码也在这时设置过了. 但是当安装成功之后,使用命令#su ...

  9. Vigenère 密码(luogu 1079)

    题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南 ...

  10. redhad借用CentOs yum 安装

    RedHat linux 默认是安装了yum软件的,但是由于激活认证的原因让redhat无法直接进行yum安装一些软件,如果我们需要在redhat下直接yum安装软件,我们只用把yum的源修改成Cen ...