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

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

下面用到的依赖:

(maven仓库地址直链):servlet-api 、fastjson

登录逻辑

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);
    }
}

你可能感兴趣的:(#,Java面试题系列,java)