瑞吉外卖项目

简介: 第二天:1.登录操作在EmployeeController类,编写登录代码。完善登录操作。3.debug进行调试。4.编写退出操作代码。

第二天:

1.登录操作

  1. 在EmployeeController类,编写登录代码

image.png

  1. 完善登录操作。
    //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());
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);

3.debug进行调试。

4.编写退出操作代码。

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

2.完善登录功能

问题分析:

用户如果不登录,直接访问系统首页面,照样可以正常访问。这种设计并不合理,我们希望看到的效果应该是,只有登录成功后才可以访问系统中的页面,如果没有登录则跳转到登录页面。

解决办法:

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

实现步骤:

1、创建自定义过滤器LoginCheckFilter,在reggie下创建Filter包,创建LoginCheckFilter类。

//检查用户是否已经完成登录
@Slf4j
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
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);
    }
}

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

@ServletComponentScan

启动项目,测试拦截器是否有用。

Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@415004ff]
2023-03-04 10:02:12.002  INFO 8124 --- [nio-8080-exec-2] c.i.reggie.filter.LoginCheckFilter       : 拦截请求:/backend/js/request.js
2023-03-04 10:02:12.133  INFO 8124 --- [nio-8080-exec-3] c.i.reggie.filter.LoginCheckFilter       : 拦截请求:/backend/plugins/axios/axios.min.map
2023-03-04 10:02:12.282  INFO 8124 --- [nio-8080-exec-4] c.i.reggie.filter.LoginCheckFilter       : 拦截请求:/backend/plugins/axios/axios.min.map
2023-03-04 10:02:12.308  INFO 8124 --- [nio-8080-exec-5] c.i.reggie.filter.LoginCheckFilter       : 拦截请求:/employee/page
2023-03-04 10:02:12.308  WARN 8124 --- [nio-8080-exec-5] o.s.web.servlet.PageNotFound             : No mapping for GET /employee/page
2023-03-04 10:02:21.000  INFO 8124 --- [nio-8080-exec-6] c.i.reggie.filter.LoginCheckFilter       : 拦截请求:/employee/page
2023-03-04 10:02:21.001  WARN 8124 --- [nio-8080-exec-6] o.s.web.servlet.PageNotFound             : No mapping for GET /employee/page


4、完善过滤器的处理逻辑。

代码实现

过滤器具体的处理逻辑如下:

1、获取本次请求的URI

2、判断本次请求是否需要处理

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

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

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

//检查用户是否已经完成登录
@Slf4j
@WebFilter(filterName = "loginCheckFilter",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 {
        HttpServletRequest request=(HttpServletRequest) servletRequest;
        HttpServletResponse response=(HttpServletResponse) servletResponse;
//        过滤器具体的处理逻辑如下:
//        1、获取本次请求的URI
         String  requestURI=request.getRequestURI();
    log.info("拦截到请求:{}",requestURI);
      //定义不需要处理的请求路径
        String[] urls=new String[]{
          "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**"
        };
//        2、判断本次请求是否需要处理
boolean check=check(urls,requestURI);
//        3、如果不需要处理,则直接放行
        if (check){
            log.info("本次请求不需要处理",requestURI);
            filterChain.doFilter(request,response);
            return;
        }
//        4、判断登录状态,如果已登录,则直接放行
     if (request.getSession().getAttribute("employee")!=null){
        log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("employee"));
         filterChain.doFilter(request,response);
         return;
     }
log.info("用户未登录");
//        5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
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;
    }
}

5、在浏览器中进行测试。

   *美好的一天又结束了,下次继续努力!*


相关文章
|
5天前
|
存储 小程序 算法
东郊到家预约系统开发|源码案例|小程序
区块链的最重要特性是去中心化,它不依赖于任何中心机构或第三方信任
|
9月前
|
开发框架 小程序 前端开发
东郊到家丨家政服务丨预约上门丨系统开发稳定版,家政服务丨预约上门丨东郊到家系统开发(开发案例)及源码技术
 随着人们对家政服务的需求不断增加,家政服务行业也变得越来越受欢迎。家政服务小程序和家政服务系统是两种常见的家政服务解决方案,它们可以为人们提供更加便捷和高效的家政服务体验。下面将详细介绍这两种解决方案。
|
5天前
|
安全 Java 数据库连接
首次面试经历(忘指导)当我在简历上写了苍穹外卖,瑞吉外卖时……
首次面试经历(忘指导)当我在简历上写了苍穹外卖,瑞吉外卖时……
351 1
|
8月前
|
负载均衡 Java 数据库连接
瑞吉外卖项目
瑞吉外卖项目
61 0
|
SQL 缓存 JSON
瑞吉外卖笔记
这是一份写给自己的笔记,主要记录瑞吉外卖项目中自己没有了解过的知识点。我将按照功能来分别解析
668 1
|
11月前
|
Java 数据库连接 mybatis
瑞吉外卖项目(超详细)
公共字段自动填充 Mybatis Plus公共字段自动填充,也就是在插入或者更新的时候为指定字段赋予指定的值,使用它的好处就是可以统一对这些字段进行处理,避免了重复代码。 实现步骤: 1、在实体类的属性上加入@TableField注解,指定自动填充的策略 2、按照框架要求编写元数据对象处理器,在此类中统一为公共字段赋值,此类需要实现MetaObjectHandler接口
|
11月前
|
前端开发
瑞吉外卖项目(超详细)
新增套餐 在开发业务功能前,先将需要用到的类和接口基本结构创建好: 实体类SetmealDish
|
11月前
|
SQL 前端开发 Java
学习瑞吉外卖项目
以当前热门的外卖点餐为业务基础,业务真实、实用、广泛。基于流行的Spring Boot、mybatis plus等技术框架进行开发。 第一天: 设计产品原型。 新建数据库,导入sql文件。
|
XML 前端开发 数据格式
点餐项目实现(三)
点餐项目实现(三)
174 0