主要内容:
假如我们在csdn上登陆账号,登陆之后,关闭浏览器。隔一段时间我们再次打开csdn时,我们会发现我们的账号已经被登陆了。那么这个是怎么实现的呢?接下来我们来实现一下。
思路及代码分析:
- 首先我们需要先登陆账号,登陆账号之后我们的用户信息用session存储起来。(用session存储的目的是为了之后你进行写blog或者收藏blog时,确定你是已经登陆了账号了)。
HttpSession session = request.getSession();
User user = userService.loginUser(username, password);
session.setAttribute("user",user);
- 我们用cookie将用户的session信息储存起来,这样关闭浏览器后再次访问session的时候,此时的session和关闭前的session内容一样,就可以获取原来的session信息了。(我们知道,session是存储到服务器的,cookie是存储到浏览器的。session是依赖cookie的,当我们创建一个session之后,此时浏览器会生成一个键名为JSESSIONID的cookie来存放这一整次会话的session信息,但是当我们关闭浏览器后JSESSIONID的值就会重新赋予,就不能获取关闭浏览器前的session信息了)。
//session.getId();此处的session就是对应上方的session
//获取登录账户的session
//session是服务器储存,但是当浏览器关闭,服务器不关闭时重新打开浏览器。两次的session不是同一个。所以需要通过cookie保留原来的session数据
Cookie userCookie = new Cookie("JSESSIONID",session.getId());
userCookie.setMaxAge(60*60);//我这里设置的存活时间为一个小时
response.addCookie(userCookie);
//获取用户名
Cookie usernameCookie= new Cookie("username",user.getUsername());
//获取密码
Cookie passwordCookie = new Cookie("password",user.getPassword());
//设置cookie存活一小时
usernameCookie.setMaxAge(60*60);
passwordCookie.setMaxAge(60*60);
//将cookie响应回去
response.addCookie(usernameCookie);
response.addCookie(passwordCookie);
我们这时候已经登陆了(第一次登录)。
我们把账号和密码也存到cookie里面,用于之后每次打开浏览器后的用户判断,判断浏览器是否存在我们的信息,从而决定我们是否需要重新登录账号
- 此时,当我们关闭浏览器后再打开浏览器,两次获取的session的值就一样了,并且我们已经把之前用户的账户信息存到了cookie里面。接下来我们就可以进行登陆判断了。(以我的项目的代码为例)
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//存放cookie信息的map集合
Map<String,String> cookieMap = new HashMap<>();
//获取之前存放的cookies的信息
Cookie[] cookies = request.getCookies();
//获取cookie
//1.先判断是否有cookie
if (cookies!=null&&cookies.length!=0){
System.out.println("有cookie信息,判断该用户");
for (Cookie cookie:cookies){
//2.往集合中存入用于用户名和密码判断的cookie值
if (cookie.getName().contains("username")||cookie.getName().contains("password")){
cookieMap.put(cookie.getName(),cookie.getValue());
}
}
//3.分别获取cookie存放的用户名和密码,用于验证(万一我要是修改了用户名密码,浏览器保存的是之前的,所以要先验证)
String username = cookieMap.get("username");
String password = cookieMap.get("password");
//进行数据库访问
User user =userService.loginUser(username, password);
//判断是否存在
if (user!=null){
//验证成功,直接登陆查看blog
System.out.println("用户信息已经存在,可以直接登陆了");
//既然数据库中有信息,说明验证成功,我就可以直接跳转到我的blog的页面了。
response.sendRedirect("/aishangboke/pageSearchServlet");
}
if (user==null){
//验证失败,重新登陆查看blog
//既然数据库中没有,说明验证失败,我就直接跳转到登陆页面重新登陆了。response.sendRedirect("/aishangboke/view/login.jsp");
}
} else{
//如果cookie的长度为0,说明浏览器中没有存放cookie或者存放的cookie信息已经过期,跳转到重新登陆页面
System.out.println("没有cookie信息,进行登陆");
response.sendRedirect("/aishangboke/view/login.jsp");
}
}
小结
核心登陆案例的代码转换就是上方这些。
服务器运行时,你可以先写一个接口,进行cookie的判断:1、如果cookie不存在,说明你还没有登陆过,你可以跳转到登陆页面,进行账号登陆。2、如果cookie存在,你就可以直接跳转到登陆者信息的我的blog页面(以csdnblog为例),直接进行blog的查看。
后续的代码与cookie无关了,cookie等于说在这里发挥了两个功能:1、存放之前登陆者的session信息。2、进行账号登陆的判断。
问题:
我们是直接将登陆者的用户密码存到了cookie里面,这样是不安全的,用户的账号和密码很容易被窃取,所以我们还要进行响应的加密操作。加密操作日后更新。