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-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
方法中将request
和response
对象传给/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