单机版redis实现集群效果

很简单,就是需要操作redis时,子系统向redis主机发送请求,主机执行操作。
单点登录界面:

<ul>
                    <li>
                        <a onclick="gotoOtherSys('http://192.168.1.45:8888/system1/login.action');" href="#" class="example">
                            <img src="<%=path %>/images/home-img01.png" />
                            <br />子系统1
                        </a>
                    </li>
                    <li>
                        <a onclick="gotoOtherSys('http://127.0.0.1:8081/system2/login.action');" href="#" class="example">
                            <img src="<%=path %>/images/home-img02.png" />
                            <br />子系统2
                        </a>
                    </li>
 </ul>

 <form  name ='formToOther'method="post" action="" target="_blank">
      <input name='ticket' id='ticket'  type="hidden" value="" />
 </form>

js方法:

    function gotoOtherSys(sysURL){
            
              $.ajax({                             //跳转多tab页
                    url: "<%=path%>/gotoOtherSys.action",
                    data: { },
                    dataType:"text",
                    type:"POST",
                    cache: false,
                    success: function (ticket) {
                        // alert(ticket);
                         $("#ticket").val(ticket);
                         
                         document.formToOther.action=sysURL;
                         document.formToOther.submit();
                        // window.open(url);
                    
                    },
                    error: function (jqXHR, textStatus, errorThrown) {
                        alert("发送失败!");
                    }
                });
             
        };

action:

 /**
     * 向其他系统的跳转
     * 
     * */
    @RequestMapping(value = { "/gotoOtherSys.action" })
    @ResponseBody
    public String gotoOtherSys(HttpServletRequest request, HttpServletResponse response) {
        SystemUser systemUser = getLoginUser(request);
         
        String ticket = ticketService.getTicket(systemUser.getUserid());
         
        return ticket;
    }

service:

   public String getTicket(String userId);

serviceimp:

@Override
    public String getTicket(String userId) {
        // TODO Auto-generated method stub
        String uuid = StringNumberUtil.getUUID();
        RedisModel redis =new RedisModel();
        redis.setKey(uuid);
        redis.setObj(userId);
        redis.setSeconds(60*60*24);
        String redisResult = jedisClientSingleService.set(redis);
        
        if("faile".equals(redisResult.toLowerCase())){
            return "";
        }else{
            return uuid;
        }
        
    }

jedisClientSingleService.set():

/**
     * 往redis缓存中添加数据
     */
    @Override
    public String set(RedisModel redis) {
        Jedis jedis = jedisPool.getResource();
        String string = "faile"; 
        try {
            if (redis != null) {
                String key = redis.getKey();
                Integer seconds = redis.getSeconds();
                string = jedis.set(key.getBytes(), ObjectsTranscoder.getInstance().serialize(redis.getObj()));
                if (seconds != null) {
                    jedis.expire(key.getBytes(), seconds);
                }
            }
        } catch (Exception e) {

        } finally {
            jedis.close();
        }
        return string;
    }

单点登录子系统中:
配置文件aaaconfig加入sso中的请求路径:
SSOToOtherSystem=http://127.0.0.1:8088/sso/toOtherSystem.action
SSOGetUserId=http://127.0.0.1:8088/sso/getUserId.action
建立常亮文件:Common.java
public static final String SYSPEIZHI ="aaaconfig";
然后子系统的登录功能,在sso上进行redis的访问和操作
代码:

//通过凭证登录
        if(ticket != null &&  !"".equals(ticket) ){//2017年4月1日17:35:44添加
            
            try {
                //从配置文件里读取SSO的跳转路径
                Properties aaaconfig= new GetProperty().bornProp(Common.SYSPEIZHI, null);
                
                String reqURL = aaaconfig.getProperty("SSOGetUserId") == null ? "": aaaconfig.getProperty("SSOGetUserId");
                        
                
                
                //向SSO服务器发送请求获取userId
                 
                
                HashMap params = new HashMap();
                params.put("ticket", ticket);
                
                String  userId   =HttpClientUtil.sendPostRequest(reqURL, params, "gb2312",null);
                 
               //2017年4月5日14:46:56 添加
               //判断ticket取出来的userid不为“”或null,则为有效。 
                 
                
                if(userId !=null && !"".equals(userId)    ){
                  //找出用户
                  systemUser = SystemUserService.getByUserId(userId);
                        
                }
                 
                
                 
            } catch (Exception e) {
                e.printStackTrace();
                // 如果连接出错
                validateInputOK = false;
                validateErrorInfo = "系统出错";
            }
            
        }


// 比对密码,执行登录操作
        if (null != systemUser) {
            // 拦截已删除和已锁定用户
            String islocked = systemUser.getIslocked();
            String delflag = systemUser.getDelflag();
            if (null != islocked && islocked.equals("1")) {
                // 已锁定,已调离
                validateInputOK = false;
                validateErrorInfo = "用户已调离";
            } else if (null != delflag && delflag.equals("1")) {
                // 已删除
                validateInputOK = false;
                validateErrorInfo = "用户已删除";
            } else {
                String userPassword = systemUser.getPassword();

                // 对比密码,判断是否登录成功
                loginSuccess = PasswordUtil.passwordCheck(password,
                        userPassword);
                if (!loginSuccess) {
                    // 密码错误
                    validateInputOK = false;
                    validateErrorInfo = "密码错误";
                }
            }
        } else if (validateInputOK) {
            // 用户不存在
            validateInputOK = false;

            if (loginType_USBKEY.equalsIgnoreCase(loginType)) {
                validateErrorInfo = "证书未绑定";
            } else {
                validateErrorInfo = "用户不存在";
            }
        }




// 根据成功与否,执行定向操作
            if (loginSuccess) { 
                // 登陆成功
                view = generateView(request);

                // 要求简单直接, 使会话失效,再新创一个会话即可
                HttpSession session = request.getSession(true); 
                // yuan
                session.invalidate();
                session = request.getSession(true);

                setSessionAttribute(request, "" + SESSION_USER_KEY, systemUser);
            
                // 把用户放入application作用域中
                HashMap<String, HttpSession> mymap = new HashMap<String, HttpSession>();
                mymap.put(userName, request.getSession());

                request.getSession().getServletContext().setAttribute(
                        "sysName", mymap);
                final int aliveTimeSeconds = 100 * 24 * 60 * 60;
                setSessionAliveTime(request, aliveTimeSeconds);
                // 添加到在线用户列表
                addOnlineUser(request, systemUser);
                StringNumberUtil.addCookie("userName", systemUser.getUserid(),
                        60 * 60 * 24 * 365, response);// 保存用户名
                addOnlineLog(systemUser, "登录成功");
            }

            else {
                addOnlineLog(systemUser, validateErrorInfo + ";userName="
                        + userName, getLogtype(), 0);
            }

系统登出代码:

/**
     * 登出
     * 
     * @return
     */
    @RequestMapping(value = { "/logout", "/lackauth" })
    public ModelAndView logout(HttpServletRequest request,
            HttpServletResponse response) {
        //
        // String myname = LogUtil.getMyName();
        SystemUser systemUser = getLoginUser(request);
        //更新用户界面设置
        SystemUser updateUser=new SystemUser();
        String theme = request.getParameter("theme");
        if(StringNumberUtil.notEmpty(theme) && null != systemUser){
            updateUser.setUserid(systemUser.getUserid());
            updateUser.setText1(theme);
            this.SystemUserService.updateByPrimaryKeySelective(updateUser);
        }
        // 移除在线用户列表
        removeOnlineUser(request, systemUser);
        // 执行 注销操作
        // 如果考虑扩展,不能直接操作 session
        setSessionAttribute(request, SESSION_USER_KEY, null);
        // 如果要求简单直接, 使会话失效、再新创一个会话即可
        HttpSession session = request.getSession(true);
        session.invalidate();
        session = request.getSession(true);
        // ...
        addOnlineLog(systemUser, "退出登录");
        //

        request.getSession().getServletContext().setAttribute("sysName", null);
        View view = new InternalResourceView("/login.jsp");
        ModelAndView mav = new ModelAndView(view);
        mav.addObject("tip", "退出登录成功");
        return mav;
    }

子系统间跳转:
子系统加入:

/2017年4月5添加
        @RequestMapping(value = { "/toOtherSystem" })
        public ModelAndView toOtherSystem(HttpServletRequest request,   HttpServletResponse response , ModelMap model) {
            SystemUser systemUser = getLoginUser(request);
            String url  = request.getParameter("url");
            
            //从配置文件里读取SSO的跳转路径
            Properties aaaconfig= new GetProperty().bornProp(Common.SYSPEIZHI, null);
            
            String ssoToOtherSystem = aaaconfig.getProperty("SSOToOtherSystem") == null ? "": aaaconfig.getProperty("SSOToOtherSystem");
                    
            
              
            ModelAndView  mav= new ModelAndView(new RedirectView(ssoToOtherSystem ));
             
            model.put("userId", systemUser.getUserid());
            try {
                mav.addObject("url", URLEncoder.encode(url, "UTF-8"));
            } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                e.printStackTrace();
            }
             
            return mav;
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,803评论 19 139
  • 1 Redis介绍1.1 什么是NoSql为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方...
    克鲁德李阅读 10,803评论 0 36
  • 本文档翻译自 http://redis.io/topics/cluster-tutorial 。 本文档是 Red...
    会跳舞的机器人阅读 67,024评论 2 21
  • 前言 Redis的作者antirez(Salvatore Sanfilippo)曾经发表了一篇名为Redis宣言(...
    OzanShareing阅读 5,342评论 0 20
  • 今天打扫卫生的时候,无意间看到那个年代的碟,很多,放的很整齐,虽然很久没动过,但并没有多少灰尘,尽管平时妈妈一个人...
    夭夭同学阅读 3,982评论 0 1

友情链接更多精彩内容