首页 > 其他分享 >[瑞吉外卖]02-登录登出

[瑞吉外卖]02-登录登出

时间:2024-10-09 09:17:53浏览次数:11  
标签:02 return String 登录 private 瑞吉 外卖 employee public

登录功能

需求分析

查看原型

需求分析

代码开发

准备实体类Employee, 和employee表进行映射

package com.itheima.reggie.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * 员工实体类
 */
@Data
public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;

    private String username;

    private String name;

    private String password;

    private String phone;

    private String sex;

    private String idNumber;

    private Integer status;

    private LocalDateTime createTime;

    private LocalDateTime updateTime;

    @TableField(fill = FieldFill.INSERT)
    private Long createUser;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;

}

创建Controller, Service, Mapper

@Mapper
public interface EmployeeMapper extends BaseMapper<Employee> {
}
public interface EmployeeService extends IService<Employee> {
}
@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {
}
@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

}

返回结果类: 服务端相应的所有结果最终都会包装成该类型返回给前端页面

/**
 * 通用返回结果封装类
 * @param <T>
 */

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

}

在controller层创建登录方法, 梳理登录逻辑

@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

     /**
     * 员工登录
     * @param request
     * @param employee
     * @return
     */
    @PostMapping("/login")
    public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee) {
        log.info("员工登录:" + employee);
        //1.密码进行md5加密
        String password = employee.getPassword();
        password = DigestUtils.md5DigestAsHex(password.getBytes());
        //2.根据用户名查询数据库(用户名唯一)
        LambdaQueryWrapper<Employee> queryChainWrapper = new LambdaQueryWrapper<>();
        queryChainWrapper.eq(Employee::getUsername, employee.getUsername());
        Employee emp = employeeService.getOne(queryChainWrapper);
        //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. 访问地址: http://localhost:8080/backend/page/login/login.html

登出功能

需求分析: 用户点击退出按钮, 发送退出请求, 后端清理Session中的用户id

代码实现

@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    /**
     * 退出登录
     * @param request
     * @return
     */
    @PostMapping("/logout")
    public R<String> logout(HttpServletRequest request) {
        //清理Seeson中保存的当前登录的id
        request.getSession().removeAttribute("employee");
        return R.success("退出成功");
    }
}

登录校验

前面已经完成了员工登录退出的功能, 由于没有登录校验, 当用户直接访问系统首页, 即便没有登录也可以访问,

我们的需求是用户未登录的情况下让用户去往登录页

自定义过滤器

/**
 * 过滤器: 检测用户是否登录
 * 拦截的路径: urlPatterns = "/*"
 */
@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request =  (HttpServletRequest) servletRequest;
        HttpServletResponse response =  (HttpServletResponse) servletResponse;
        log.info("拦截到请求:{}", request.getRequestURI());
        filterChain.doFilter(request, response);
    }
}
  1. 创建自定义过滤器LoginCheckFilter
  2. 在启动类上添加@ServletComponentScan注解, 注册过滤器

编写拦截逻辑

/**
 * 过滤器: 检测用户是否登录
 * 拦截的路径: urlPatterns = "/*"
 */
@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")
@Slf4j
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 {

        HttpServletRequest request =  (HttpServletRequest) servletRequest;
        HttpServletResponse response =  (HttpServletResponse) servletResponse;

        //1.获取本次请求的UIL
        String requestURI = request.getRequestURI();

        //定义不需要处理的请求路径
        String[] urls = new String[]{
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**"
        };

        //2.判断本次请求是否需要处理
        boolean check = check(urls, requestURI);

        //3.不需要处理则放行
        if(check) {
            filterChain.doFilter(request, response);
            return;
        }

        //4.判断登录状态, 已登录放行
        if(request.getSession().getAttribute("employee") != null) {
            filterChain.doFilter(request, response);
            return;
        }

        //5.未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
        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;
    }
}

前端和后端都可以通过日志或者断点的形式进行调试

标签:02,return,String,登录,private,瑞吉,外卖,employee,public
From: https://blog.csdn.net/CSDN20221005/article/details/142777652

相关文章

  • 20222417 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.实验内容(1).掌握反汇编与十六进制编程器(2).能正确修改机器指令改变程序执行流程(3).能正确构造payload进行bof攻击2.实验过程(1).直接修改程序机器指令,改变程序执行流程将pwn1文件放入共享文件夹,后续在kali中使用,再将文件复制到实验文件夹share路径下找到本次实验所用的三个代码片......
  • 2024/10/8
    色给定一张图,每个点有一个颜色。每次操作求改一个颜色,然后询问所有不同颜色点对的最短距离。给出一种\(O(n\sqrt{n})\)的做法。先按照边权从小到大排序,然后将边分块。对于每一个块,我们只需要快速判断块内是否存在一条边的两点颜色不同即可。对于一个块可以算出\(\sum(co......
  • 代码随想录算法训练营第四天|24. 两两交换链表中的节点、19.删除链表的倒数第N个节点
    24.两两交换链表中的节点力扣题目链接(opensnewwindow)给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]......
  • 20241008_Day 04
    helloworld!1.安装NOTEPAD++2.新建代码文件夹3.新建JAVA文件1.可以新建text文件,修改后缀为.java2.打开方式修改为notepad+++4.编写代码具体为:javapublicclassHello{publicstaticvoidmain(String[]args){System.out.print("Hello,world!");}}5.......
  • 02 Vue默认项目说明
    1.node_modulespnpm安装的第三方依赖2.public公共资源,存放网页图标等3.src开发代码存放位置3.1项目入口文件main.tsimport{createApp}from'vue'//引入vueimport'./style.css'//引入默认样式importAppfrom'./App.vue'//引入页面App.VuecreateApp(......
  • 【电商搜索】现代工业级电商搜索技术-EMNLP2024-无监督的用户偏好学习
    【电商搜索】现代工业级电商搜索技术-EMNLP2024-无监督的用户偏好学习0.论文信息Title:UnsupervisedHumanPreferenceLearningAuthors:SumukShashidhar,AbhinavChinta,VaibhavSahai,DilekHakkaniTurComments:EMNLP2024MainConferencehttps://arxiv.or......
  • 2018_11_02_04
    vue-cli案例constpath=require('path');functionresolve(dir){returnpath.join(__dirname,dir);}consttargetUrl='[地址]';module.exports={//Projectdeploymentbase//Bydefaultweassumeyourappwillbedeployedatthe......
  • 2018_11_02_03
    plugin插件注册importPickerComponentfrom'./picker.vue';let$vm;exportdefault{install(Vue,options){if(!$vm){constpickerPlugin=Vue.extend(PickerComponent);$vm=newpickerPlugin({el:document.createElement......
  • 2018_11_02_02
    jsxJSX这部分内容是在参考文章:在vue中使用jsx语法中提炼出来的,就是跟着敲代码跑了一遍.基本就明白了什么是JSX?JSX就是Javascript和XML结合的一种格式。React发明了JSX,利用HTML语法来创建虚拟DOM。当遇到<,JSX就当HTML解析,遇到{就当JavaScript解析.使用......
  • 2018_11_02_01
    ES5&ES6写法对照表(react)来源:ReactonES6+React/ReactNative的ES5ES6写法对照表class定义语法值得注意的是,我们已经删除了两个括号和一个后缀分号,而对于每个声明的方法,我们都省略了一个冒号,一个function关键字和一个逗号。classPhotoextendsReact.Component......