瑞吉外卖 —— 2、后台登录和登出

article/2025/8/20 16:39:44

目录

1、后台登录功能

1.1、接口分析

1.1.2、登录校验逻辑

1.2、代码

1.2.1、统一的返回结果实体类

1.2.2、controller 方法

1.3、测试

2、后台退出功能

2.1、分析

2.2、代码

3、未登录访问首页跳转到登录页面

3.1、分析

3.2、代码


1、后台登录功能

1.1、接口分析

通过浏览器调试工具 F12 可以发现,在登录页面点击登录后,发送 POST 请求 http://localhost:8080/employee/login ,并将输入的账号和密码信息以 JSON 格式发送给后台

前端校验代码如下:

1.1.2、登录校验逻辑

1、将页面提交的密码password进行md5加密处理
2、根据页面提交的用户名username查询数据库
3、如果没有查询到则返回登录失败结果
4、密码比对,如果不一致则返回登录失败结果
5、查看员工状态,如果为已禁用状态,则返回员工已禁用结果
6、登录成功,将员工id存入Session并返回登录成功结果 

1.2、代码

首先导入资料中的 Employee 实体类,然后创建对应的 mapper、service、controller

@Mapper
public interface EmployeeMapper extends BaseMapper<Employee> {
}
public interface EmployeeService extends IService<Employee> {
}
@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {
}

1.2.1、统一的返回结果实体类

package com.itheima.reggie.common;import lombok.Data;
import java.util.HashMap;
import java.util.Map;// 通用结果返回集
@Data
public class R<T> {private Integer code; //编码:1成功,0和其它数字为失败private String msg; //错误信息private T data; //数据private Map map = new HashMap(); //动态数据public static <T> R<T> success(T object) {R<T> r = new R<T>();r.data = object;r.code = 1;return r;}public static <T> R<T> error(String msg) {R r = new R();r.msg = msg;r.code = 0;return r;}public R<T> add(String key, Object value) {this.map.put(key, value);return this;}}

1.2.2、controller 方法

package com.itheima.reggie.controller;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Employee;
import com.itheima.reggie.service.EmployeeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;/*** @Author zhang* @Date 2022/8/30 - 21:46* @Version 1.0*/
@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {@Autowiredprivate EmployeeService employeeService;/*** 员工登录* @param employee  含有前端提供的账号密码信息* @param request   用于向浏览器的session域储存用户信息* @return*/@PostMapping("/login")public R<Employee> login(@RequestBody Employee employee,HttpServletRequest request){// 将页面提交的密码password进行md5加密处理String password = employee.getPassword();password = DigestUtils.md5DigestAsHex(password.getBytes());// 根据页面提交的用户名 username 查询数据库LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(Employee::getUsername, employee.getUsername());Employee emp = employeeService.getOne(queryWrapper);// 如果没有查询到则返回登录失败结果if(emp == null){return R.error("用户名或密码错误");}// 密码比对,如果不一致则返回登录失败结果if(!emp.getPassword().equals(password)){return R.error("用户名或密码错误");}// 查看员工状态,如果为已禁用状态,则返回员工已禁用结果if(emp.getStatus() == 0){return R.error("该账号已被禁用");}// 登录成功,将员工id存入Session并返回登录成功结果request.getSession().setAttribute("employee", emp.getId());return R.success(emp);}/*** 退出登录* @param request 用于删除session域中的用户信息* @return*/@PostMapping("/logout")public R<String> logout(HttpServletRequest request){// 清理Session域中保存的当前登录员工的idrequest.getSession().removeAttribute("employee");return R.success("退出成功");}}

1.3、测试

测试前,可以先修改请求超时时间,避免调试时间过长导致报错。

修改 js/request.js 下的 timeout 数值

登录成功后,可以在浏览器的 Local Storage 中看到登录的用户信息

前端方法如下

2、后台退出功能

2.1、分析

点击退出登录按钮后,浏览器发送 http://localhost:8080/employee/logout 请求,方式为 POST

后台只需要在 controller 方法中清理 Session 中的用户 id 并返回结果即可。

2.2、代码

    /*** 退出登录* @param request 用于删除session域中的用户信息* @return*/@PostMapping("/logout")public R<String> logout(HttpServletRequest request){// 清理Session域中保存的当前登录员工的idrequest.getSession().removeAttribute("employee");return R.success("退出成功");}

3、未登录访问首页跳转到登录页面

3.1、分析

如果用户没有登录,应该无法访问首页,并跳转到登录页面。

这里可以使用过滤器或拦截器,在过滤器或者拦截器中判断用户是否已经完成登录,如果没有登录则跳转到登录页面。

注意,这里的 /backend/js/request.js 有前端的响应拦截器,只要后端的响应信息符合 if 语句的内容就会跳转到登录页面

3.2、代码

① 首先编写一个过滤器

package com.itheima.reggie.filter;import com.alibaba.fastjson.JSON;
import com.itheima.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @Author zhang* @Date 2022/8/31 - 11:01* @Version 1.0*/
// 检查用户是否完成登录
@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {// 路径匹配器(支持通配符)public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;log.info("拦截到请求:{}", request.getRequestURI());// 获取本次请求的URIString requestURI = request.getRequestURI();// 定义不需要处理的请求路径String[] urls = new String[]{"/employee/login",  // 登录请求"/employee/logout",  // 登出请求"/backend/**",       // 前端资源"/front/**"       // 前端资源};// 判断本次请求是否需要放行boolean check = check(urls, requestURI);// 不需要处理,直接放行if(check){log.info("本次请求{}不需要处理", request.getRequestURI());filterChain.doFilter(request, response);return;}// 需要处理,判断登录状态// 已登陆,放行if(request.getSession().getAttribute("employee") != null){log.info("用户已登录,放行,用户id为{}", request.getSession().getAttribute("employee"));filterChain.doFilter(request, response);return;}// 未登录则返回未登录结果,通过输出流方式向客户端页面响应数据log.info("用户未登录");response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));return;}/*** 路径匹配,检查该路径是否需要放行* @param urls 需要放行的路径数组* @param requestURI 要酦醅的路径* @return*/public boolean check(String[] urls,  String requestURI){for (String url : urls) {boolean match = PATH_MATCHER.match(url, requestURI);if(match){return true;}}return false;}}

② 在启动类加上 @ServletComponentScan 注解,注册过滤器

@Slf4j  // 输出日志
@SpringBootApplication
@ServletComponentScan   // Filter可以直接通过@WebFilter注解自动注册
public class ReggieApplication {public static void main(String[] args) {SpringApplication.run(ReggieApplication.class, args);//log.info("项目启动成功!");}
}


http://chatgpt.dhexx.cn/article/vMMbG09R.shtml

相关文章

oc账号无法登出,oc登出后官网还显示登陆状态?

《C4D的十万个为什么》首发于 公众号&#xff1a;苦七君 免费搜索查看更多问题&#xff1a;kuqijun.com 问题&#xff1a; 在本电脑上&#xff0c;在C4D里面登出oc账号后&#xff0c;官网上还是显示登陆的。。导致账号被限制在此电脑上了&#xff0c;无法用其他电脑登陆。 正…

vue-admin-实现登出功能

实现登出功能 目标&#xff1a;实现用户的登出操作 登出仅仅是跳到登录页吗&#xff1f; 不&#xff0c;当然不是&#xff0c;我们要处理如下 同样的&#xff0c;登出功能&#xff0c;我们在vuex中的用户模块中实现对应的action 登出action src/store/modules/user.js // 登出…

Python + Django4 搭建个人博客(十四):实现用户登录和登出功能

本篇开始我们来实现用户管理模块。 首先我们来实现一下用户的登录和登出。 创建APP 用户和文章属于不同的功能模块&#xff0c;为了方便管理&#xff0c;我们新建一个名为userprofile的App 运行startapp指令创建新的app&#xff1a; python manage.py startapp userprofile…

Springboot+JWT+Redis实现登陆登出功能

1&#xff1a;什么是Token&#xff1f;&#xff1a;三部分组成&#xff1a;头有效负载签名 1.1 JWT创建中的一些方法讲解&#xff1a; public static String createTokenWithClaim(User user){//构建头部信息Map<String,Object> map new HashMap<>();map.put(&qu…

单点登录与单点登出

一、标准流程描述 CAS官网的标准流程&#xff1a; SSO标准流程 流程描述&#xff1a; First Access&#xff1a; 第3步数据走向 第4步数据走向 第一次访问app.example.com&#xff08;service地址&#xff09;&#xff0c;请求参数中session为空&#xff0c;app service没做…

[django项目] 实现用户登录登出功能

用户登录登出功能 I. 功能需求分析 1>功能分析 1.1>流程图 1.2>功能接口 登录页面登录功能退出功能 II. 登陆页面 1>接口设计 1.1>接口说明 类目说明请求方法GETurl定义/users/login/参数格式无参数 1.2>返回结果 登陆页面 2.后端代码 user/views…

后台登录登出

后台登录登出 一&#xff0e;Session简介 在WEB开发中&#xff0c;服务器可以为每个用户浏览器创建一个会话对象&#xff08;session对象&#xff09;&#xff0c;注意&#xff1a;一个浏览器独占一个session对象(默认情况下)。因此&#xff0c;在需要保存用户数据时&#xff…

JWT 的登出问题

Jwt 使用起来不难&#xff0c;而且让我们将“无状态”的概念更贴切的展示出来了&#xff0c;但是实践就真的这么完美吗&#xff1f;不是&#xff0c;因为jwt 的登出问题。 何为登出&#xff1a;就是用户自己点击登出后&#xff0c;或用户的角色/权限改变后&#xff0c;该token…

Shiro入门之实现登录登出

概述 这里使用Shiro来实现用户的登录和登出功能。 前提&#xff1a;已经会Spring集成Shiro。即使没有下面也会提供源码&#xff0c;下面只说明Shiro部分的核心代码&#xff0c;如Mapper、Service类中的代码基本上就是从数据库中读取数据&#xff0c;而且源码有提供&#xff0…

cas5.3.2单点登录-单点登出(十一)

原文地址&#xff0c;转载请注明出处&#xff1a; https://blog.csdn.net/qq_34021712/article/details/81515317 ©王赛超 既然有单点登录,肯定就要有登出,之前的整合都是只针对了登录&#xff0c;对登出并没有关注,今天我们就来讲讲登出。 关于单点登出原理&#…

数说故事车企数字化渠道管理创新方法——精准进行消费者洞察

随着疫情带来的变化&#xff0c;原来在一二线城市的购物中心店&#xff0c;受人流量的不确定性冲击越来越大&#xff0c;但成本的支出也越来越高。因此购物中心店&#xff0c;将有可能从原来的重“集客”功能&#xff0c;变成更多的从品牌、体验出发的形象中心店&#xff0c;“…

权威报告!这五个消费趋势,告诉你如何抓住中国消费者的心和钱包

有人说2023年是消费复苏的一年&#xff0c;市场回暖趋势明显&#xff1b;也有人说之前的亏空太大&#xff0c;想要短时间追上来不太可能&#xff0c;因此2023的消费市场最多是不低迷&#xff0c;达不到火热。 这可把做生意的各位老板整纠结了&#xff0c;究竟今年要不要投个大手…

ChatGPT与数据挖掘:洞察消费者行为,优化营销策略

随着科技的不断进步和数字化时代的到来&#xff0c;企业们越来越意识到数据的重要性。在零售和电子商务行业&#xff0c;了解消费者行为并准确洞察其需求&#xff0c;是成功营销和提升业绩的关键。而现在&#xff0c;借助人工智能技术中的ChatGPT以及数据挖掘技术&#xff0c;企…

市场营销学5——消费者购买行为分析

什么是消费者购买行为 消费者购买行为是指人们为满足需要和欲望而寻找、选择、购买、使用、评价及处置产品、服务时介入的过程活动&#xff0c;包括消费者的主观心理活动和客观物质活动两个方面。 消费者购买行为分析的环节 消费者购买行为研究包括以下几个环节&#xff1a; 购…

【消费战略方法论】认识消费者的恒常原理(三):消费者刺激反馈原理

人类是一种高度智能的生物&#xff0c;而所谓智能的核心在于其理解世界的能力&#xff0c;而理解世界的过程中必然伴随着感知和反应。人的刺激反馈机制就是在这个过程中发挥着重要的作用。 刺激反馈机制是一种生物学的反应现象&#xff0c;它指的是人体对外界刺激的感知与反应…

大数据之kafka消费者

&#x1f352;今天是端午节&#xff0c;先祝大家端午节快乐&#xff01;上一期我们学习了kafka的broker部分主要介绍了kafka中的副本、kafka文件的存储的原理&#xff0c;以及kafka的高效读写的保证&#xff0c;今天我们来介绍kafka中的消费者原理&#xff0c;对往期内容感兴趣…

元年智答|数据洞察功能介绍

什么是数据洞察 随着企业积累数据量增多&#xff0c;数据分析师常常需要处理“长且宽”的数据集。依靠人的经验处理海量数据&#xff0c;从海量数据中发掘出有用的信息无异于大海捞针。虽然人工智能技术的普及和单位算力价格的下降大大降低了数据挖掘的门槛&#xff0c;但是面…

营销创意没灵感?社交媒体和消费者洞察给你答案

创意是营销的核心。 品牌需要优秀的创意营销才能吸引消费者、与受众建立联系、宣传产品与服务。 想要营销内容创作方面表现出色&#xff0c;品牌就需要源源不断的新鲜创意来抓住人们的眼球、占领消费者注意力。 在实际营销过程中&#xff0c;出海品牌常常为创意冥思苦想、绞尽…

经典消费者生产者问题

首先你需要了解多线程的流程以及实现多线程的几种方法&#xff0c;同时你要理解什么是并行、并发&#xff0c;以及线程和进程的区别&#xff0c;这里做简要的区别。 线程&#xff1a;一个进程包括多个线程 并行&#xff1a;多个cpu实例或者多台机器同时执行一段处理逻辑&#x…

【报告分享】德勤:2023中国消费者洞察与市场展望.pdf(附下载链接)

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2022年12月份热门报告盘点 罗振宇2023年跨年演讲PPT原稿吴晓波2022年年终秀演讲PPT原稿2023年&#xff0c;如何科学制定年度规划&#xff1f; 《底层逻辑》高清配图 华为202…