欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Servlet+Session+Cookie登录、校验、退出的逻辑代码

程序员文章站 2022-06-24 10:41:46
登录逻辑的实例代码,逻辑在我加的注释上,阅读代码就能掌握整个完整的 输入用户信息,进行校验,登录成功后的逻辑操作,登录失败后的逻辑操作下面用到的依赖:(maven仓库地址直链):servlet-api 、fastjson登录逻辑import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.*;import java.io.BufferedRe...

登录逻辑的实例代码,逻辑在我加的注释上,阅读代码就能掌握整个完整的 输入用户信息,进行校验,登录成功后的逻辑操作,登录失败后的逻辑操作

下面用到的依赖:

(maven仓库地址直链):servlet-apifastjson

登录逻辑

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    public static final HashMap<String, HttpSession> sessionHashMap = new HashMap<>();// 这个对象可以作为一个全局变量

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        System.out.println("===============>进行登录");
        /**
         * 读取前端传来的数据
         */
        // 读取前端传来的json数据
        BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(), "utf-8"));
        String line = null;
        StringBuilder sb = new StringBuilder();
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }
        //将json字符串转换为json对象
        JSONObject json = JSONObject.parseObject(sb.toString());
        System.out.println(sb.toString());// 打印一下前端传来的json数据
        /**
         * jdbc操作,进行数据校验,校验用户名和密码
         * 
         */

        boolean validate = true; // jdbc得到校验结果
        if (validate) {
            /**
             * 1.校验成功逻辑
             */
            final HttpSession session = request.getSession();// 得到session对象,可以存入HashMap中,作为value,id作为key
            final String sessionId = session.getId();// 得到session的id
            sessionHashMap.put(sessionId, session);// 将登录成功的session保存起来,可以设置session的过期时间等操作
            final Cookie userCookie = new Cookie("sessionId", sessionId); // 创建cookie
            final Cookie userInfo = new Cookie("user", json.toJSONString()); // 将登录成功的用户信息通过cookie存入浏览器的cookie中
            response.addCookie(userCookie);// 添加cookie到响应体中,会存入到浏览器的cookie中,下次请求自动带上
            response.addCookie(userInfo);// 返回给浏览器用于登录成功后显示用户信息
            response.sendRedirect("/index.html");// 重定向到首页
        } else {
            /**
             * 2.校验失败逻辑
             */
            response.sendRedirect("/登录.html");// 重定向到登录页面
        }


        
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

写这篇博客的意义是,总是遇到有人问,最最主要的原因是很多培训机构讲的也就这块内容,为了方便,我将代码粘贴出来,可以借鉴我写的逻辑。

校验登录

前面我们登录成功了,对于后端的请求都应该进行拦截,通过查找上面保存到session对象中的信息来判断请求是否是已经登录的用户、是否已登录。

例如有一个购物车的后端接口/shopcart则在对应的doPost方法中将requestresponse对象传给/validate中的doPost方法中进行校验即可

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;

/**
 * 每一个请求都需要通过这个请求进行校验
 */
@WebServlet("/validate")
public class ValidateServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        final HashMap<String, HttpSession> sessionHashMap = LoginServlet.sessionHashMap;//得到所有登录成功的session
        final Cookie[] cookies = request.getCookies();// 得到所有cookie信息
        // java8流遍历
        Arrays.stream(cookies).forEach(cookie -> {
            // 遍历cookie找到表示用户信息的sessionId这条数据
            if (cookie.getName().equals("sessionId")) {
                // 找到了这条cookie
                final String sessionId = cookie.getValue();// 得到sessionId
                final HttpSession httpSession = sessionHashMap.get(sessionId);// 得到session对象
                if (httpSession != null) {
                    // session存在
                    final Object username = httpSession.getAttribute("username"); // 得到保存在session中的用户名
                    final Object password = httpSession.getAttribute("password"); // 得到保存在session中的用户密码
                    if (username != null && password != null) {
                        String name=(String) username;// 进行强转
                        String pwd=(String) password;
                        /**
                         * jdbc操作校验用户名和密码
                         *
                         */
                        boolean validate=true;// 校验结果赋值给这个boolean变量

                        if (validate){
                            // 校验成功则更新一下session的过期时间
                            httpSession.setMaxInactiveInterval(30 * 60);//设置单位为秒,设置为-1永不过期,这个值是30分钟
                        }else {
                            // 校验失败则跳转到登录页面
                            try {
                                response.sendRedirect("/index.html");
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        });

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

退出登录

通过cookie.setMaxAge(0);// 删除cookie设置过期时间为0,覆盖浏览器的这条记录,让浏览器自动删除这条cookie

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;

@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        final HashMap<String, HttpSession> sessionHashMap = LoginServlet.sessionHashMap;//得到所有登录成功的session
        final Cookie[] cookies = request.getCookies();// 得到所有cookie信息
        // java8流遍历
        Arrays.stream(cookies).forEach(cookie -> {
            // 遍历cookie找到表示用户信息的sessionId这条数据
            if (cookie.getName().equals("sessionId")) {
                // 找到了这条cookie
                final String sessionId = cookie.getValue();// 得到sessionId
                sessionHashMap.remove(sessionId);// 直接移除这条session记录
                cookie.setMaxAge(0);// 删除cookie
                response.addCookie(cookie);// 传给浏览器进行过期自动删除处理
            }
        });
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

本文地址:https://blog.csdn.net/qq_41813208/article/details/112210160