瑞吉外卖项目

逃离我推掉我的手 2023-09-24 21:31 123阅读 0赞

第二天:

1.登录操作

  1. 在EmployeeController类,编写登录代码。在这里插入图片描述
  2. 完善登录操作。

    //1、将页面提交的密码password进行md5加密处理
    String password=employee.getPassword();

    1. password=DigestUtils.md5DigestAsHex(password.getBytes());
    2. //2、根据页面提交的用户名username查询数据库

    LambdaQueryWrapper queryWrapper= new LambdaQueryWrapper<>();
    queryWrapper.eq(Employee::getUsername,employee.getUsername());
    Employee emp=employeeService.getOne(queryWrapper);

    //3、如果没有查询到则返回登录失败结果
    if (emp==null){

    1. return R.error("登录失败");

    }
    //4、密码比对,如果不一致则返回登录失败结果
    if (!emp.getPassword().equals(password)){

    1. return R.error("登录失败!");

    }
    //5、查看员工状态,如果为已禁用状态,则返回员工已禁用结果
    if (emp.getStatus()==0){

    1. return R.error("账号已禁用!");

    }

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

3.debug进行调试。

4.编写退出操作代码。

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

2.完善登录功能

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

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

实现步骤:
1、创建自定义过滤器LoginCheckFilter,在reggie下创建Filter包,创建LoginCheckFilter类。

  1. //检查用户是否已经完成登录
  2. @Slf4j
  3. @WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
  4. public class LoginCheckFilter implements Filter {
  5. @Override
  6. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  7. HttpServletRequest request=(HttpServletRequest) servletRequest;
  8. HttpServletResponse response=(HttpServletResponse) servletResponse;
  9. log.info("拦截请求:{}",request.getRequestURI());
  10. filterChain.doFilter(request,response);
  11. }
  12. }

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

  1. @ServletComponentScan

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

  1. Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@415004ff]
  2. 2023-03-04 10:02:12.002 INFO 8124 --- [nio-8080-exec-2] c.i.reggie.filter.LoginCheckFilter : 拦截请求:/backend/js/request.js
  3. 2023-03-04 10:02:12.133 INFO 8124 --- [nio-8080-exec-3] c.i.reggie.filter.LoginCheckFilter : 拦截请求:/backend/plugins/axios/axios.min.map
  4. 2023-03-04 10:02:12.282 INFO 8124 --- [nio-8080-exec-4] c.i.reggie.filter.LoginCheckFilter : 拦截请求:/backend/plugins/axios/axios.min.map
  5. 2023-03-04 10:02:12.308 INFO 8124 --- [nio-8080-exec-5] c.i.reggie.filter.LoginCheckFilter : 拦截请求:/employee/page
  6. 2023-03-04 10:02:12.308 WARN 8124 --- [nio-8080-exec-5] o.s.web.servlet.PageNotFound : No mapping for GET /employee/page
  7. 2023-03-04 10:02:21.000 INFO 8124 --- [nio-8080-exec-6] c.i.reggie.filter.LoginCheckFilter : 拦截请求:/employee/page
  8. 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、如果未登录则返回未登录结果

  1. //检查用户是否已经完成登录
  2. @Slf4j
  3. @WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
  4. public class LoginCheckFilter implements Filter {
  5. //用来路径比较,路径匹配器,支持通配符
  6. public static final AntPathMatcher PATH_MATCHER=new AntPathMatcher();
  7. @Override
  8. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  9. HttpServletRequest request=(HttpServletRequest) servletRequest;
  10. HttpServletResponse response=(HttpServletResponse) servletResponse;
  11. // 过滤器具体的处理逻辑如下:
  12. // 1、获取本次请求的URI
  13. String requestURI=request.getRequestURI();
  14. log.info("拦截到请求:{}",requestURI);
  15. //定义不需要处理的请求路径
  16. String[] urls=new String[]{
  17. "/employee/login",
  18. "/employee/logout",
  19. "/backend/**",
  20. "/front/**"
  21. };
  22. // 2、判断本次请求是否需要处理
  23. boolean check=check(urls,requestURI);
  24. // 3、如果不需要处理,则直接放行
  25. if (check){
  26. log.info("本次请求不需要处理",requestURI);
  27. filterChain.doFilter(request,response);
  28. return;
  29. }
  30. // 4、判断登录状态,如果已登录,则直接放行
  31. if (request.getSession().getAttribute("employee")!=null){
  32. log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("employee"));
  33. filterChain.doFilter(request,response);
  34. return;
  35. }
  36. log.info("用户未登录");
  37. // 5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
  38. response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
  39. return;
  40. }
  41. //路径匹配,检查本次请求是否需要放行
  42. public boolean check(String[] urls, String requestURI){
  43. for (String url : urls) {
  44. boolean match= PATH_MATCHER.match(url,requestURI);
  45. if (match){
  46. return true;
  47. }
  48. }
  49. return false;
  50. }
  51. }

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

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

发表评论

表情:
评论列表 (有 0 条评论,123人围观)

还没有评论,来说两句吧...

相关阅读

    相关 项目

    黑马-瑞吉外卖项目完成时间`2023-3-2` 。 1. 学习外卖平台后台管理和用户端的主要业务开发流程,springboot + mybatis plus开发核心 等技术

    相关 项目

    第三天 1. 新增员工需求分析 1、页面发送ajax请求,将新增员工页面中输入的数据以json的形式提交到服务端 2、服务端C

    相关 学习项目

    以当前热门的外卖点餐为业务基础,业务真实、实用、广泛。基于流行的Spring Boot、mybatis plus等技术框架进行开发。 第一天: 1. 设计产品原型