简单实现自动登录(案例)

逻辑实现类

package com.itheima.controller;

import org.apache.catalina.Session;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

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

/**
 * @Auther: wangchao
 * @Date: 2018/9/7 10:52
 * @Description: 逻辑实现类
 */
@Controller
public class UserController {

    @RequestMapping("/login")
    public String login(Model model,Session session , String username, String password,String auto, HttpServletRequest request,HttpServletResponse response) {
        //1.接收参数       接收账号          接收密码       接收是否勾选       接收响应集合                接收模型          接收session

        //2.校验参数
        if ("zhangsan".equals(username) && "123".equals(password)) {
            //如果用户名是zhangsan并且密码是123

            //保存用户登录的状态
            session.setNote("username", username);
            //那么把账号保存到session里名字是username
            if ("on".equals(auto)) {
                //判断用户是否已经勾选了自动登录
                //如果auto是on(代表已经勾选)
                Cookie cookie = new Cookie("autologin", username + "#" + password);
                //那么new一个cookie名字为autologin,值为账号#密码
                cookie.setMaxAge(60 * 60 * 24);
                //这个cookie的存活时间为1星期
                response.addCookie(cookie);
                //把这个cookie添加到响应体里
                return "index";
                //跳转去首页显示
            }
            //如果不匹配走这里面
        }
        model.addAttribute("msg", "用户名密码不匹配");
        //使用model.addAttribute设置一个名字为msg显示的内容为value的键值对用来在网页上面显示
        return "login";    //跳转去登录页面,显示失败的原因
    }

    @RequestMapping("/loginUI")
    public String loginUI(){ // User Interface 用户界面
        //用于中转不然直接没办法显示,方便用户
        return "login.html";
    }

    @RequestMapping("/indexUI")
    public String indexUI(){
        //同样用于中专显示页面,方便用户
        return "index.html";
    }
}

Filter类

package com.itheima.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.print.Pageable;
import java.io.IOException;

/**
 * @Auther: wangchao
 * @Date: 2018/9/7 11:32
 * @Description: 利用filter过滤来达到自动登陆
 */
@WebFilter("/*")  // 将这个filter交由spring去管理
public class AutoLoginFilter implements Filter{
    //继承filter设置过滤器
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        //我们会使用到hsrequest所以只能拿到本来的srequest来强转获取
        HttpServletResponse resp = (HttpServletResponse) response;
        //我们会使用到hsresponse所以只能拿到本来的sresponse来强转获取
        //为了避免重复执行自动登录的逻辑,需要判断session中是否已经有username
        String usernameValue = (String) req.getSession().getAttribute("username");
        //从响应体中使用getsession拿到session再通过getattribute传入名字拿到其valiu再赋值给usernamevalue
        if(usernameValue != null) { //表示已经登录过了
            //如果这个value不等于空代表不是第一次登陆
            chain.doFilter(request, response);
            //那么就放行不截取
            return ;
            //返回
        }

        //如果登录相关的请求,则直接放行
        String path = req.getRequestURI();
        //方法返回的是一个字符串,内容为整个访问的url的path内容
        System.out.println("path:"+path);
        if(path.contains("login")){
            //如果这个path内容包括login
            chain.doFilter(request, response);
            //那么放行
            return ;  // 下面的代码不再执行了
        }

        String cookieValue = null;
        //初始化一个字符串赋值为null
        //1.获取指定名称的cookie  autologin
        Cookie[] cookies = req.getCookies();
        //从响应体中拿到所有的cookie
        if(cookies != null) {
            //如果这个cookie数组不为空
            for (Cookie cookie : cookies) {
                //那么循环遍历
                if ("autologin".equals(cookie.getName())){
                    //如果拿到的cookie的名字为autologin就是前面new的value为账号密码的那个cookie
                    cookieValue = cookie.getValue();
                    //把这个账号密码赋值给上面定义的空字符串
                    break;
                }
            }
        }

        boolean isLogin = false;
        //定义一个布尔默认值为false

        //2.校验cookie中的value  zhangsan#123
        if(cookieValue != null){
            //如果拿到的这个账号密码不为空
            String[] split = cookieValue.split("#");
            //那么使用split分割拿到账号密码
            String username = split[0];
            String password = split[1];

            //校验用户名和密码
            if("zhangsan".equals(username)&&"123".equals(password)){
                //再次校验如果拿到的账号密码为上面的
                //校验成功,保存用户登录的状态
                HttpSession session = req.getSession();
                //那么取到响应体中的session
                session.setAttribute("username",username);
                //并使用setattribute把这个名字为username的账号添加到session里

                //标记自动登陆成功
                isLogin = true;
                //并把布尔改成true
            }
        }

        //判断是否校验成功
        if(isLogin){
            //如果布尔为true代表校验成功
            chain.doFilter(request,response);
            //那么放行
        }else{
            //不放行,跳转去登录页面
            resp.sendRedirect("/loginUI");
        }
    }

    @Override
    public void destroy() {

    }
}

主页


<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>
<h3>欢迎您, <span th:text="${session.username}" >用户名span> , 这里是首页h3>
body>
html>

表单页


<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>登录页面title>
head>
<body>
    <div style="color: red" th:text="${msg}">div>
    <form action="/login" method="post">
        <div>
            <input type="text" name="username"/>
        div>
        <div>
            <input type="password" name="password"/>
        div>

        <div>
            <input type="checkbox" name="auto" />自动登录
        div>
        <div>
            <input type="submit" value="登录"/>
        div>
    form>
body>
html>

你可能感兴趣的:(spring,boot)