zoukankan      html  css  js  c++  java
  • Java Web网站应用中的单点登录

    采用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();
        }
    }
  • 相关阅读:
    dotnet core 获取 MacAddress 地址方法
    dotnet core 获取 MacAddress 地址方法
    dotnet core 发布只带必要的依赖文件
    dotnet core 发布只带必要的依赖文件
    Developing Universal Windows Apps 开发UWA应用 问答
    Developing Universal Windows Apps 开发UWA应用 问答
    cmd 如何跨驱动器移动文件夹
    cmd 如何跨驱动器移动文件夹
    C++ 驱动开发 error LNK2019
    C++ 驱动开发 error LNK2019
  • 原文地址:https://www.cnblogs.com/gisblogs/p/3964051.html
Copyright © 2011-2022 走看看