美文网首页
单机版redis实现集群效果

单机版redis实现集群效果

作者: 野柳 | 来源:发表于2017-05-27 11:35 被阅读34次

很简单,就是需要操作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;
        }

相关文章

  • Spring 整合Redis

    接口 单机版实现类 集群版实现类 redis.properties applicationContext-redi...

  • 单机版redis实现集群效果

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

  • redis集群搭建

    redis集群搭建 在开始redis集群搭建之前,我们先简单回顾一下redis单机版的搭建过程 下载redis压缩...

  • Redis高可用搭建

    我们都知道单机版的redis,无法保证CAP。所以我们搭建redis集群,实现高可用。 看本篇文章之前,最好看如下...

  • Redis单机版安装步骤

    Redis 支持单机版和集群,下面的步骤是单机版安装步骤 [root@localhost ~]# yum inst...

  • Redis 4.0.2 集群安装

    Redis 4.0.2 集群安装 01 安装单机版 单机版详见 02 创建集群的配置文件 创建一个安装配置文件的目...

  • Redis(9)——史上最强【集群】入门实践教程

    一、Redis 集群概述 Redis 主从复制 到 目前 为止,我们所学习的 Redis 都是 单机版 的,这也就...

  • 用Codis实现Redis分布式集群

    一、Redis集群概述 Redis官方近期推出的Redis Cluster,Redis集群有三种实现机制,分别介绍...

  • Redis中Key中为什么要使用{}

    一、Redis集群介绍 Redis集群是一个提供在多个Redis间节点间共享数据的程序集,Redis集群能够实现k...

  • redis 集群搭建

    Redis集群 使用redis做缓存工具 实现系统高可用,redis需要做主备。使用redis做分片集群。 向业务...

网友评论

      本文标题:单机版redis实现集群效果

      本文链接:https://www.haomeiwen.com/subject/jlxqfxtx.html