基于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 {
}
}