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

目录

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://www.rhkb.cn/news/34126.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外卖点餐APP-02(后台--员工管理)

&#xff08;一&#xff09;登录 实现思路&#xff1a; 接收到用户登录输入的用户名和密码&#xff0c;封装到了emp对象中对密码进行MD5加密创建条件构造器添加sql查询判断条件&#xff0c;emp对象中的Username等于Employee数据表中的Username调用MyBatis-Plus的方法查询数据库…

瑞吉外卖-移动端菜品展示功能,购物车添加菜品及修改等功能,用户下单功能及历史订单派送功能

整理记录下学习整个瑞吉外卖项目&#xff0c;详细代码可在我的Gitee仓库瑞吉外卖实战克隆下载学习使用&#xff01; 12.菜品展示 12.1 需求分析 12.2 更改前台页面使其正常显示 由于购物车功能还未进行开发&#xff0c;所以修改main.js中的cartListJson函数中访问固定数据&a…

外卖点餐APP-04(后台--菜品管理)

&#xff08;一&#xff09;新增 controller层思路&#xff1a; 调用service处理响应处理结果 PostMapping public R<String> save(RequestBody DishDto dishDto){dishService.saveWithFlavors(dishDto);return R.success("新增成功&#xff01;"); } servi…

瑞吉外卖:后台系统登录和退出功能

文章目录 需求分析代码开发创建实体类导入返回结果类Rcontroller、service与mapperlogin.html防止非法访问 需求分析 点击登录按钮后&#xff0c;浏览器以POST方式向employee/login提交username和password&#xff0c;服务器经过处理后向浏览器返回某种格式的数据&#xff0c;…

服装销售数据分析

目录&#xff1a; 一、项目背景介绍 二、数据源 三、分析流程 四、分析框架 五、知识点总结 一、项目背景介绍&#xff1a; 某服装经销商经营多个女装品牌&#xff0c;每个品牌设有线下店铺。该公司老板及销售总监需在每日营业结束后查看当日销售数据。以往主要由业务员手动整…

创建报价单或销售凭证,提示无定价确定过程能被确定,消息号V1212

创建报价单&#xff0c;提示无定价确定过程能被确定&#xff0c;消息号V1212。 解决方案&#xff1a; spro 》销售和分销——》基本功能——》定价——》定价控制——》定价并分配定价过程 1&#xff09;将凭证定价程序分配给订单类型 2&#xff09;设置定价程序确定&#xff0…

ChatGPT工作提效之layedit上传多附件的解决方案(layedit赋值、layui.js底层修改、追加模式多附件上传)

ChatGPT工作提效系列文章目录 ChatGPT工作提效之初探路径独孤九剑遇强则强ChatGPT工作提效之在程序开发中的巧劲和指令(创建MySQL语句、PHP语句、Javascript用法、python的交互)ChatGPT工作提效之生成开发需求和报价单并转为Excel格式ChatGPT工作提效之小鹅通二次开发批量API对…

Zia和ChatGPT如何协同工作?

有没有集成ChatGPT的CRM系统推荐&#xff1f;Zoho CRM已经正式与ChatGPT集成。下面我们将从使用场景、使用价值和使用范围等方面切入讲述CRMAI的应用和作用。 Zia和ChatGPT如何协同工作&#xff1f; Zia和ChatGPT是不同的人工智能模型&#xff0c;在CRM中呈现出共生的关系。 …

AIGC持续火爆大模型争相推出,庞大市场造就算力供应模式演变

本图由AI生成 文/王吉伟 近期的AIGC领域仍旧火爆异常。 但火的不只是AIGC应用&#xff0c;还有巨头之间的AI竞赛&#xff0c;以及接连不断上新的AI大模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;。 面对ChatGPT带来的技术冲击&#xff0c;为了研发谷歌多…

ChatGPT实现命名实体识别(NER, named entity recognization)和词性归类

语义分析词格分类 命名实体识别(NER, named entity recognization)和词性归类是 NLP 技术中的关键一环。过去 NLP 领域有不少流行的开源项目专注在这个领域&#xff0c;如 Spacy、NLTK 等等。我们来试试 ChatGPT 在这方面的表现情况如何。我们从"四渡赤水"的百度百科…

突发!两所知名大学,曝合并!校方紧急回应:校长将亲自说明!

点击上方“3D视觉工坊”&#xff0c;选择“星标” 干货第一时间送达 来源丨联合新闻网 编辑丨3D视觉工坊 点击进入—>3D视觉工坊学习交流群 我国台湾又有“国立”大学传出合并的消息&#xff0c;台湾中山大学与台湾高雄大学传将重启合并协商&#xff0c;有网友曝光中山大学发…

从 Uber 数据泄露事件我们可以学到什么?

Uber 数据泄露始于一名黑客从暗网市场购买属于一名 Uber 员工的被盗凭证。最初尝试使用这些凭据连接到 Uber 的网络失败&#xff0c;因为该帐户受 MFA 保护。为了克服这一安全障碍&#xff0c;黑客通过 What’s App 联系了 Uber 员工&#xff0c;并假装是 Uber 的安全人员&…

点击率预估

点击率预估是广告技术的核心算法之一&#xff0c;它是很多广告算法工程师喜爱的战场。一直想介绍一下点击率预估&#xff0c;但是涉及公式和模型理论太多&#xff0c;怕说不清楚&#xff0c;读者也不明白。所以&#xff0c;这段时间花了一些时间整理点击率预估的知识&#xff0…

老鸟教你如何精确评估开发时间

一个程序员能否精确评估开发时间&#xff0c;是一件非常重要的事情。如果你掌握了这项技能&#xff0c;你在别人的眼里就会是这样&#xff1a; 靠谱经验十足对需求很了解延期风险小合格的软件工程师正规军&#xff0c;不是野路子 评估开发时间的重要性 首先&#xff0c;在一…

从FM推演各深度CTR预估模型(附代码)

作者&#xff1a; 龙心尘 && 寒小阳 时间&#xff1a;2018年7月 出处&#xff1a;https://blog.csdn.net/longxinchen_ml/article/details/81031736 https://blog.csdn.net/han_xiaoyang/article/details/81031961 声明&#xff1a;版权所有&#xff0c;转载请联系作者…

[项目管理] 如何评估工作量

1.1. 工作量估算的定义 工作量估算 即对开发软件产品所需的人力和时间的估算——人力成本是一个项目的主要成本。 我们可以根据预估的工作量决定具体由几个人、哪几个人参与该项目。 工作量通常以 人/天、人/月、人/年 的形式来衡量。 1.2. 为什么要进行工作量估算 做好工…

机器学习实战 | 综合项目-电商销量预估

作者&#xff1a;韩信子ShowMeAI 教程地址&#xff1a;https://www.showmeai.tech/tutorials/41 本文地址&#xff1a;https://www.showmeai.tech/article-detail/206 声明&#xff1a;版权所有&#xff0c;转载请联系平台与作者并注明出处 收藏ShowMeAI查看更多精彩内容 1.案例…

Python:实现进度条和时间预估

一、前言 在python当中可以用进度条来显示工作的进度&#xff0c;比如for循环的进度或者一些模型训练的进度。 在这里可以使用progressbar包以及tqdm包来实现。 使用pip install progressbar 安装progressbar包。 使用pip install tqdm安装tqdm包。 二、代码 1. progress…

如何科学预估开发时间

0. 我是前言 一个开发人员能否精确评估开发时间&#xff0c;是一件非常重要的事情。如果你掌握了这项技能&#xff0c;你在别人的眼里就会是这样&#xff1a; 1. 评估开发时间的重要性 首先&#xff0c;在一个项目中&#xff0c;所有的环节都是承上启下的&#xff0c;不管你是…

编译原理之代码生成

前面提到了经过了词法分析->语法分析->语义分析->中间代码优化&#xff0c;最后的阶段便是在目标机器上运行的目标代码的生成了。目标代码生成阶段的任务是&#xff1a;将此前的中间代码转换成特定机器上的机器语言或汇编语言&#xff0c;这种转换程序便被称为代码生成…