基于cookie实现单点登录并连接redis

本文介绍了如何利用SSM框架结合Redis实现单点登录功能,详细讲解了添加jedis依赖、登录时存储cookie到redis、设置过滤器验证cookie以及通过nginx和Tomcat集群进行测试的过程。作者指出,可以进一步优化登录流程,通过预存数据到redis来提升查询效率。
摘要由CSDN通过智能技术生成

 

基于cookie实现单点登录并连接redis

 

1.基于ssm框架 并引入jedis依赖

<!--    1、 Jedis-->
<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>2.9.0</version>
</dependency>

2.登录时添加cookie并存入redis

@Service
public class UserRedisServiceImpl implements UserRedisService {
    @Override
    public int saveLoginInfo(String key, String userInfo, HttpServletResponse response) {
        Jedis jedis = JedisUtil.getJedisResource();
        jedis.select(3);
        key = key + UUID.randomUUID();
        //存贮到redis
        String result = jedis.setex(key, UserConstant.SESSION_TIME, userInfo);
        jedis.close();
        if ("OK".equalsIgnoreCase(result)){
            Cookie cookie = new Cookie("openPro", key);
            cookie.setPath("/");
            cookie.setMaxAge(UserConstant.SESSION_TIME);
            response.addCookie(cookie);
            return 1;
        }else {
            return 0;
        }
    }
}

3.设置过滤器对cookie进行判断,验证是否登录

 

@WebFilter(filterName = "LoginFilter", value = "/*")
public class LoginFilter implements Filter {
    private static String[] exUrl = {
            "/user/login",
            "login.jsp"
    };

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        boolean isPass = false;
        String requestURI = request.getRequestURI();
        for (String url : exUrl) {
            if (requestURI.indexOf(url) > -1) {
                isPass = true;
                break;
            }
        }
        if (isPass) {
            chain.doFilter(req, resp);
        } else {
            boolean pass = false;
            String value = "";
            Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    //判断是否含有存入的cookie
                    if ("openPro".equals(cookie.getName())) {
                        pass = true;
                        value = cookie.getValue();
                        //重新设置cookie的存活时间
                        //确保每次其他服务器访问时都可以获取到cookie
                        cookie.setMaxAge(UserConstant.SESSION_TIME);
                    }
                }
                if (pass) {
                    //将redis中存储的key 重新设置存活时间
                    //确保每次登陆时都可以获取到
                    Jedis jedis = JedisUtil.getJedisResource();
                    jedis.select(3);
                    jedis.expire(value, UserConstant.SESSION_TIME);
                    User user = JSON.parseObject(jedis.get(value), User.class);
                    // System.out.println(user);
                    HttpSession session = request.getSession();
                    session.setAttribute("userInfo", user);
                    chain.doFilter(req, resp);
                } else {
                    request.getRequestDispatcher("login.jsp").forward(request, response);
                }
            } else {
                request.getRequestDispatcher("login.jsp").forward(request, response);
            }
        }
    }

    public void init(FilterConfig config) throws ServletException {

    }
}

4.使用nginx以及搭建Tomcat集群验证

总结:可以优化登录,我登录时是从mysql中查询数据登录,可以先将数据存入redis中,登录时从redis中查询提高效率。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值