瑞吉外卖——后台系统登录与退出功能

news2024/10/6 4:06:54

目录

一、登录功能

1.1  思路

1.2 代码

1.3 完善登录功能——过滤器


一、登录功能

1.1  思路

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

1.2 代码

@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {

    @Autowired
    private EmployeeService employeeService;


    @Override
    public R login(HttpServletRequest request, Employee employee) {
        //1. 将页面提交的密码password进行md5加密处理
        String password = employee.getPassword();
        password = DigestUtils.md5DigestAsHex(password.getBytes());

        //2. 根据页面提交的用户名username查询数据库
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Employee::getUsername, employee.getUsername());
        //      为什么用getOne?   因为数据库中已经对用户名做了一个唯一性的约束
        Employee emp = employeeService.getOne(queryWrapper);

        //3. 如果没有查询到则返回登录失败结果
        if (emp == null) {
            return R.error("登录失败,用户不存在");
        }

        //4. 密码比对,如果不一致则返回登录失败结果
        if (!emp.getPassword().equals(password)) {
            //不一致
            return R.error("密码错误");
        }

        //5. 查看员工状态,如果为已禁用状态,则返回员工已禁用结果
        if (emp.getStatus() == 0) {
//           禁用
            return R.error("账号已经被禁用");
        }

        //6、登录成功,将员工id存入Session并返回登录成功结果
        request.getSession().setAttribute("employee", emp.getId());
        return R.success(emp);
    }
}

1.3 完善登录功能——过滤器

步骤:

1.  创建自定义过滤器LoginCheckFilter

2.  在启动类上加入注解@ServletComponentScan

3.  完善过滤器的处理逻辑

过滤器中逻辑:

1. 获取本次请求的URI(  URI: 请求的资源路径)

2. 判断本次请求是否需要处理(因为有些请求并不需要用户登录)

3.如果不需要处理,则直接放行

4.判断登录状态,如果已登录,则直接放行

5.如果未登录则返回未登录结果

package com.reggie_take_out.filter;

import com.alibaba.fastjson.JSON;
import com.reggie_take_out.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;

/**
 * 检查用户是否已经完成登录
 * 过滤器与拦截器的区别:Filter对所有访问进行增强(在Tomcat服务器进行配置),Interceptor仅针对SpringMVC的访问进行增强
 */
@Slf4j
@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")  //urlPatterns指定拦截哪些路径
public class LoginCheckFilter implements Filter {

    //  此对象的作用:路径匹配器,  匹配路径时支持通配符
    public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//      servletRequest向下强制类型转换
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;


        //1. 获取本次请求的URI( URI:请求的资源路径)
        String requestURI = request.getRequestURI();

        log.info("拦截到请求:{}", request.getRequestURI());
        // 定义不用处理的请求路径
        String[] urls = new String[]{
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**"
        };

        //2. 判断本次请求是否需要处理(因为有些请求并不需要用户登录)
        boolean check = check(requestURI, urls);

        //3.如果不需要处理,则直接放行
        if (check) {
            log.info("本次请求{}不需要处理", request.getRequestURI());
            filterChain.doFilter(request, response);
            return;
        }

        //4.判断登录状态,如果已登录,则直接放行.从session中获取用户,如果获取到说明已经登录
        if (request.getSession().getAttribute("employee") != null) {
            log.info("用户已登录,用户id为{}", request.getSession().getAttribute("employee"));
            filterChain.doFilter(request, response);
            return;
        }

        //5.如果未登录则返回未登录结果
        log.info("资源路径路径:{},用户未登录{}",request.getRequestURI(),request.getSession().getAttribute("employee"));
//           通过输出流的方式向客户端响应数据   (为什么要返回这个NOTLOGIN?  因为前端需要这个来进行判定是否登录)
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
//        filterChain.doFilter(request, response);  加上这个就无法实现

    }

    /**
     * 检查本次请求是否需要放行
     *
     * @param requestURI 请求的资源路径
     * @param urls       放过的路径
     * @return true 放行
     */
    public boolean check(String requestURI, String[] urls) {
        for (String url : urls) {
            boolean match = PATH_MATCHER.match(url, requestURI);
            if (match) {
//           放行
                return true;
            }
        }
        return false;
    }
}

二、退出功能

    public R<String> logout(HttpServletRequest request) {
//       1.清空Session中的用户id
        request.getSession().removeAttribute("employee");
//       2.返回结果
        return R.success("退出成功");
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/411092.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你真的会用background属性?

引言 在日常前端开发中&#xff0c;经常需要进行背景或背景图的处理。但是大多数前端er并未真正清楚背景的正确使用方式。经过本章的学习&#xff0c;相信你一定可以解决99%的背景处理问题。 一&#xff1a;简单使用 背景颜色和背景图片是可以共同出现的 div {width: 300px…

STM32F407移植LVGL基于RT-Thread和无操作系统版本

文章目录一、无操作系统1.源码获取&#xff1a;2.输出设备配置&#xff08;屏幕配置&#xff09;几个关键函数屏幕初始化函数&#xff1a;显示刷新(画点)函数3.输入配置&#xff08;触摸&#xff09;4.提供时基二、RT-Thread1.新建工程2.添加软件包&#xff0c;屏幕相关文件以及…

3.5 二维随机变量函数的分布

学习目标&#xff1a; 要学习二维随机变量的分布&#xff0c;我可能会遵循以下步骤&#xff1a; 了解基本概念&#xff1a;我会开始学习二维随机变量、联合概率密度函数、边缘概率密度函数、条件概率密度函数、期望值和方差等基本概念&#xff0c;以确保我对这些概念有一个牢固…

elasticsearch 跨索引联合多条件查询

文章目录Elasticsearch需求使用版本联合索引多条件查询示例相关API相关资料Elasticsearch Elasticsearch 是一个免费且开放的分布式搜索和分析引擎。适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 在 Apache Lucene 的基础上开…

十分钟玩转3D绘图:WxGL完全手册

文章目录1 简介2 安装3 快速体验3.1 熟悉的风格3.2 Colorbar3.3 光照效果3.4 让模型动起来3.5 定制着色器3.6 三维曲面重建3.7 生成动画或视频文件4 在其他GUI库中使用WxGL4.1 与wxPython集成4.2 与PyQt集成5 API Reference5.1 常量5.2 函数wxgl.font_listwxgl.color_listwxgl.…

Java--反射

目录 反射 什么是反射&#xff1f; Class类 动态加载 小结 访问字段 获取字段值 设置字段值 练习 小结 调用方法 调用方法 调用静态方法 调用非public方法 多态 练习 小结 调用构造方法 小结 获取继承关系 获取父类的Class 获取interface 继承关系 小…

遗传算法优化深度信念网络DBN的分类预测,GA-DBN分类预测

目录 背影 DBN神经网络的原理 DBN神经网络的定义 受限玻尔兹曼机(RBM) 遗传算法的原理 遗传算法优化深度信念网络DBN的分类识别 基本结构 主要参数 数据 MATALB代码 结果图 展望 背影 DBN是一种深度学习神经网络,拥有提取特征,非监督学习的能力,本文用DBN提取特征,遗传…

如何在DevOps中进行API生命周期管理?

引言 随着DevOps理念在中国企业当中的普及和发展&#xff0c;中国企业DevOps落地成熟度不断提升&#xff0c;根据中国信通院的数据已有近6成企业向全生命周期管理迈进。而在研发全生命周期管理之中&#xff0c;API管理的地位愈发显得重要。随着API数量的大幅增长&#xff0c;也…

Java多线程编程—wait/notify机制

文章目录1. 不使用wait/notify机制通信的缺点2. 什么是wait/notify机制3. wait/notify机制原理4. wait/notify方法的基本用法5. 线程状态的切换6. interrupt()遇到方法wait()7. notify/notifyAll方法8. wait(long)介绍9. 生产者/消费者模式10. 管道机制11. 利用wait/notify实现…

【操作系统】半小时写一个微型操作系统-写一个启动扇区并且导入到软盘镜像中

一.什么是启动扇区 我们使用软盘来启动操作系统时&#xff0c;系统首先就是从软盘的第一个扇区中开始读取数据&#xff0c;也就是第0面&#xff0c;0磁道的第0个扇区&#xff0c;软盘的每个扇区为512个字节的大小&#xff0c;如果最后两个字节为0xaa55&#xff08;当BIOS看到这…

Java多线程基础面试总结(一)

进程、线程和协程 进程、线程和协程 进程 进程是程序的一次执行过程&#xff0c;是系统运行程序的基本单位&#xff0c;因此进程是动态的。系统运行一个程序即是一个进程从创建、运行到消亡的过程。 在Java中&#xff0c;当我们启动main函数其实就是启动了一个JVM进程&…

【Linux】全新服务器Centos7环境搭建和安装

1、简介 最近服务器重装后,环境啥的则需要从头全部搞一遍,于是开始搞起环境的配置和安装 2、环境配置安装 前期准备 给目录文件加文件传输权限(发现无法上传文件,于是增加权限 $ chmod 766 /home/lj/ 配置DNS服务 #配置DNS服务,如果没有8.8.8.8需要添加 cat /etc/re…

WRF模式与Python融合技术在多领域中的应用及精美绘图教程

当今从事气象及其周边相关领域的人员&#xff0c;常会涉及气象数值模式及其数据处理&#xff0c;无论是作为业务预报的手段、还是作为科研工具&#xff0c;掌握气象数值模式与高效前后处理语言是一件非常重要的技能。WRF作为中尺度气象数值模式的佼佼者&#xff0c;模式功能齐全…

QML控件--Dialog

文章目录一、控件基本信息二、控件使用三、属性成员四、成员函数五、信号一、控件基本信息 Import Statement&#xff1a;import QtQuick.Controls 2.14 Since&#xff1a;Qt 5.8 Inherits&#xff1a;Popup 二、控件使用 Dialog&#xff1a; 是一个弹出窗口&#xff0c;继承…

项目打包发布流程

---》》》项目打包发布 1.编译并构建项目 2.部署 npm i npm run build scp2&#xff1a;需要写代码 ---》》》 后续有空更新&#xff1a;赋几个链接&#xff1a; Jenkins官网 nullhttps://www.jenkins.io/zh/一文详解Jenkins的安装与配置Jenkins是一个基于Java开发的开源…

【SpringMVC】10—其他概念

⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; 如果文章对你有所帮助&#xff0c;可以点赞&#x1f44d;…

2023年Web3的五大趋势

Web3 这个词有时被称为 "去中心化的互联网"&#xff0c;涵盖了一些重要的互联网发展趋势。Web3 的愿景是创造一个不受大公司控制的互联网&#xff0c;如Alibaba、baidu、Google和Facebook&#xff0c;这些公司制定了互联网的大部分规则&#xff0c;掌控着我们今天可以…

HyperWorks2021软件安装教程

下载软件 https://www.xsoftnet.com/share/a0004MWyQAg9r.html产品介绍&#xff1a; HyperWorks一款功能强大的开放式架构仿真软件。拥有先进的技术以及高性能、高效和创新的产品&#xff0c;为用户提供了设计、仿真和制造等服务。支持电磁分析设计、材料建模制造、多物理场分…

学校的地下网站(学校的地下网站1080P高清)

这个问题本身就提得有问题&#xff0c;为什么这么说&#xff0c;这是因为YouTube本身就不是一个视频网站或者说YouTube不是一个传统的视频网站&#xff01;&#xff01;&#xff01; YouTube能够一家独大&#xff0c;可不仅仅是因为有了Google 这个亲爹&#xff0c;还有一点&am…

Flutter Web 开发实践与优化

一,Flutter Web架构 目前,除了可以支持Android、iOS移动跨平台开发之外,Flutter还支持macOS、Windows、Linux和Web等多个跨平台的开发。可以说,作为一款先进的跨平台开发框架,Flutter已经真正意义上实现了“一次编写,处处运行”的美好愿景。 众所周知,Dart 语言存在之…