Java-使用Cookie实现登陆会话保持与注销功能

版权声明:本文为博主原创文章,未经博主允许不得转载! https://blog.csdn.net/MaNongXf/article/details/83589354

首先先简单的解释一下为什么用Cookie不用Session(当然Session也是可以使用的)
举个简单的例子:我卢老爷今天输入用户名密码登录了某网站,在网站中随意切换网站内部的页面都没问题,结果一不小心把浏览器关了(或者长时间没有操作),当想再次进行访问那个网站的时候提示我要重新登陆,这就是Session的机制。
又比如:我开哥今天输入账号密码又登陆了某网站,逛了半天不想逛了,关掉浏览器第二天再打开的时候就直接打开了,这个时候用到的机制就是Cookie。

接下来说说会话保持,会话保持这东西其实很容易理解,举个栗子:你在某宝上登陆了你的账号,当你逛的正开心的时候不小心点了右上角,结果你再次进入那个页面的时候又提示你登陆,这就很是脑阔疼,虽然问题是小问题,但是总这样就有点头皮发麻了,毕竟时间很宝贵,登陆一次不要个一分钟也要个十几二十秒,一次二十秒,那十次呢?一百次呢?(咳咳…) 一天就在登陆中结束了,想想都可怕,这时候就需要”会话保持“来拯救你了~
重点

大概了解了会话保持只会再说说注销(其实我觉得没必要,毕竟大家不是傻子),注销就是退出登录,当我们用Cookie实现了会话保持功能以后,注销的时候要把Cookie一起消除掉~ 不然你的注销根本没啥意义(除非你的注销按钮只是想看看登录页面是啥样的?)

在前面的博客里已经实现了登陆功能,今天我们就来利用Cookie实现一个简单的会话保持与注销功能!
首先看看普通的登录方法(真的是普通的不能再普通…)


@RequestMapping("login")
public String login(User user, Model model, HttpSession session, HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
    String loginname = user.getLoginname();
    String password = user.getPassword();
    if (loginname!=null||password!=null){
        Map<String, Object> map = loginService.login(loginname, password);
    if (map.get("status").equals("200")) {
        return "system/index.jsp";
    } else {
        model.addAttribute("error", map.get("msg"));
        return "login.jsp";
    }
    }else {
        model.addAttribute("error","请输入账号密码");
        return "login.jsp";
    }

}

这是一个最简单的登陆方法,也不用细说。实现会话保持的关键就是你要在登陆成功后把你的用户信息(也可以叫Token)存进Cookie,因为Cookie和Session不一样,Session是把你的信息存进服务器,当你关闭了浏览器后它就没了,而且貌似session的保持时间只有三十分钟就会过期,而Cookie是存进浏览器,当你设置了所以这里我选择Cookie,既然不用实现什么复杂的功能,比如购物车什么的,只是一个简简单单的会话保持,所以也用不上Redis什么的也不用存进数据库。
只需要像我这样在登陆成功的时候创建一个Cookie并且在这个Cookie中存入对应的信息,然后添加Cookie响应回去就OK啦~

  @RequestMapping("login")
    public String login(User user, Model model, HttpSession session, HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
        String loginname = user.getLoginname();
        String password = user.getPassword();
        Cookie cookie1 = new Cookie("loginname",loginname);
//        Cookie cookie1 = new Cookie("name", URLEncoder.encode("哈哈", "UTF-8"));//存中文信息的时候需要这样设置编码
        if (loginname!=null||password!=null){
            Map<String, Object> map = loginService.login(loginname, password);
        if (map.get("status").equals("200")) {
            cookie1.setMaxAge(60*60);//这里设置设置有效时间,单位的秒,我这里是一小时
            cookie1.setPath("/");//这里是之根目录下所有的目录都可以共享Cookie
            response.addCookie(cookie1);//添加Cookie
            return "system/index.jsp";
        } else {
            model.addAttribute("error", map.get("msg"));
            return "login.jsp";
        }
        }else {
            model.addAttribute("error","请输入账号密码");
            return "login.jsp";
        }

然后在你的拦截器里做一些判断就行~

package com.sixmai.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {
    //之前执行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
      Cookie[] cookies = request.getCookies();//这里是取出Cookie
        if ((cookies!=null)){//判断Cookie是否为空
            for (Cookie cookie : cookies){//遍历Cookie判断有没有对应的name
                if (cookie.getName().equals("loginname")){//有就直接return true
                      return true;
                }
            }
        }
        request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }
}

到这里,会话保持基本完成了,接下来就是注销,很简单,当你点击注销的时候清除Cookie并跳转到登陆页面就行拉~

   @RequestMapping("logout")
    public String logout(HttpSession session,HttpServletRequest request,HttpServletResponse response){
//        session.removeAttribute("loginname"); 消耗session

        Cookie[] cookies = request.getCookies();
        for (Cookie cookie :cookies){//遍历所有Cookie
            if(cookie.getName().equals("loginname")){//找到对应的cookie
                cookie.setMaxAge(0);//Cookie并不能根本意义上删除,只需要这样设置为0即可
                cookie.setPath("/");//很关键,设置成跟写入cookies一样的,全路径共享Cookie
                response.addCookie(cookie);//重新响应
                return "login.jsp";
            }
        }
        return "login.jsp";
    }

这样写了以后当你点击注销就可以直接“清除”Cookie并且跳转到登陆页面啦!

The end!!!

猜你喜欢

转载自blog.csdn.net/MaNongXf/article/details/83589354
今日推荐