前言
一直想写关于redis的博客,但redis的应用场景实在是太多了!比如秒杀,静态数据的缓存,数据库缓存,计数器,排行榜等等。。。实在是非常纠结,最近想到了可以与redis配合使用的功能----基于spring mvc的免重复登录、下面来看看是如何实现一个免登陆的demo的吧。
过程
首先先导入我们所需要的jar包,如果用maven请自行百度即可。
如果已经部署好spring mvc,那就只需要导入jedis(redis的java封装)与commons-codec(用于密码md5加密)。
先简单地实现一下登录页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String sessionid=session.getId();
%>
<%=sessionid %>
<form action="save">
<input type="text" name="name" >
<br>
<input type="password"name="password">
<br>
<input type="submit" value="login">
</form>
</body>
</html>
实现简单的pojo,user类
public class user {
public String name;
public String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
最后一个简单的登录成功页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="quit">注销</a>
</body>
</html>
只有一个注销连接。。不管了反正只是demo。QAQ
下面是1个controller类 login类的实现
@Controller
public class login
{
@RequestMapping("/login")
public String login(HttpServletRequest request) {
Cookie[] cookies=request.getCookies();
for(Cookie cookie : cookies){
if(cookie.getName().equals("md5")) {
Jedis jedis = new Jedis("localhost");
if(jedis.exists("md5:"+cookie.getValue())) {
jedis.close();
return "success.jsp";
}
}
}
return "redirect:login.jsp";
}
@RequestMapping("/save")
public ModelAndView save(HttpServletRequest request,user user,HttpSession httpSession,HttpServletResponse response)
{ Jedis jedis = new Jedis("localhost");
jedis.set("md5:"+DigestUtils.md5Hex(user.name+"redissalt"+user.password),"1");
Cookie cookie=new Cookie("md5",DigestUtils.md5Hex(user.name+"redissalt"+user.password));
cookie.setMaxAge(5*60);
response.addCookie(cookie);
ModelAndView mov=new ModelAndView();
mov.setViewName("success.jsp");
// mov.addObject("userlist", userlist);
jedis.close();
return mov;
}
@RequestMapping("/quit")
public String quit(HttpServletRequest request,HttpServletResponse response) {
Cookie[] cookies=request.getCookies();
for(Cookie cookie : cookies){
if(cookie.getName().equals("md5")) {
Jedis jedis = new Jedis("localhost");
jedis.del("md5:"+cookie.getValue());
jedis.close();
}
}
Cookie cookie=new Cookie("md5", "null");
cookie.setMaxAge(0);
response.addCookie(cookie);
return "login.jsp";
}}
大概的过程如下,登录访问/login,先检测cookie是否有MD5加密的密码,如果有,将连接redis进行比对,若redis不存在此key,将重定向到登录界面,否则直接进入success界面。
进入登录界面,输入账号密码后post到/save,此方法将上传的账号+盐+密码进行md5加密后缓存到reids以(md5:加密后密码)的key格式缓存下来,再传回cookie给客户端,留作下次免登录的凭证。
进入success界面后,点击注销连接,将清空cookie(把有效时间置为0)并把redis的缓存删除,回到重新登录界面。
cookie带有加密凭证
redis的缓存如下
下次访问/login将直接进入success界面了