一、admin登录页面

本质就是发送一个请求,跳转到damin-login.jsp中,可以不用写controller 直接在pringmvc的配置文件中配置一个
当用户发/admin/to/login/page.html 这个请求时会到 admin-login.jsp 这个页面
当然了 这个jsp会被视图解析器拼串 所以就是/WEB-INF/admin-login.jsp

  1. <mvc:view-controller path="/admin/to/login/page.html" view-name="admin-login"/>

1. 使用layyer弹层组件

加入layer的库文件和样式文件
在页面上引入layer

二、登录

1. 目标:

识别操作系统的人的身份,控制他的行为。

2. 思路

未命名图片.png

  • 现在比较时髦的登录写法:先通过账号在数据库中查,把对应的Admin查出来封装到实体类中,在从service层进行账号密码的处理。
  • 因为 账号密码登录也属于业务,所以最好在service层完成
  • 如果通过账号查询出来的admin对象为null,那么直接就抛出异常 LoginFialedException 【自定义的登录异常】
  • 如果查到对象之后,再用密码进行比对【密码需要使用md5加密】成功就把admin对象返回controller层存到session里面再跳转到后台主页面,失败就抛异常

3. 代码

1) 创建登录失败的异常

  1. package com.yixuexi.crowd.exception;
  2. /**
  3. * @date: 2021/1/12 13:14
  4. * @author: 易学习
  5. * 自定义异常:登录失败后抛出的异常。
  6. */
  7. public class LoginFailedException extends RuntimeException{
  8. private static final long serialVersionUID = 1L;
  9. public LoginFailedException() {
  10. super();
  11. }
  12. public LoginFailedException(String message) {
  13. super(message);
  14. }
  15. }

2) Service层的方法 验证登录【当下潮流】

在抛出异常参数我这里用的是常量类中的常量

public static final StringMESSAGE_ACCT_IS_NULL == “账号不存在!”

  1. @Override
  2. public Admin getAdminByLoginAcct(String loginAcct, String userPswd) {
  3. // 1.根据登录账号查询Admin对象
  4. AdminExample adminExample = new AdminExample();
  5. AdminExample.Criteria criteria = adminExample.createCriteria();
  6. criteria.andLoginAcctEqualTo(loginAcct);
  7. List<Admin> admins = adminMapper.selectByExample(adminExample);
  8. // 2.判断Admin对象是否为null
  9. // ①如果是集合是null,或者集合中元素等于0个 那说明没有查到
  10. if (admins == null || admins.size() == 0){
  11. throw new AdminErrorException(CrowdConstant.MESSAGE_ACCT_IS_NULL);
  12. }
  13. // ②一般是不会出现这个问题的,不可能有两个loginAcct相同
  14. if (admins.size() > 1){
  15. throw new RuntimeException(CrowdConstant.MESSAGE_SYSTEM_ERROR_LOGIN_ACCT_NOT_UNIQUE);
  16. }
  17. Admin admin = admins.get(0);
  18. if (admin == null){
  19. // 3.如果为null则抛出异常 【账号不存在!】
  20. throw new AdminErrorException(CrowdConstant.MESSAGE_ACCT_IS_NULL);
  21. }
  22. // 4.如果存在,将密码从数据库中取出来
  23. String passwordDB = "";
  24. passwordDB = admin.getUserPswd();
  25. // 5.将表单提交的明文密码进行加密
  26. String md5Str = CrowdUtil.md5(userPswd);
  27. // 6.对密码进行比较,不一致抛异常,一致返回Admin对象
  28. // ①这里使用Objects工具类提供的工具方法
  29. if (Objects.equals(md5Str,passwordDB)){
  30. return admin;
  31. }
  32. // 抛出异常 【账号或密码不正确】
  33. throw new LoginFailedException(CrowdConstant.MESSAGE_LOGIN_FAILED);
  34. }

3) controller 层

前往后台主页面的方式调整:
  • return “admin-main” 这样是转发的形式到页面,每次用户F5刷新时,就又会提交一次,进行查询数据库,验证…
  • 使用重定向,因为admin-main.jsp是在/WEB-INF/ 所以就需要用view-controller 专门来配一个请求路径

    1. /**
    2. * @date: 2021/1/12 13:32
    3. * @author: 易学习
    4. */
    5. @Controller
    6. public class AdminHandler {
    7. @Autowired
    8. private AdminService adminService;
    9. @RequestMapping("/admin/do/login.html")
    10. public String doLogin(@RequestParam("loginAcct") String loginAcct,
    11. @RequestParam("userPswd") String userPswd,
    12. HttpSession session
    13. ){
    14. // 这个方法如果返回一个admin对象则说明账号密码正确
    15. // 如果密码不正确,则上一级就已经抛出异常了
    16. Admin adminByLoginAcct = adminService.getAdminByLoginAcct(loginAcct, userPswd);
    17. // 将对象【用户信息】存到session作用域中
    18. session.setAttribute(CrowdConstant.ATTR_NAME_LOGIN_ADMIN, adminByLoginAcct);
    19. // return "admin-main" 这样是转发的形式到页面,每次用户F5刷新时,就又会提交一次,进行查询数据库,验证...
    20. // 使用重定向,因为admin-main.jsp是在/WEB-INF/ 所以就需要用view-controller 专门来配一个请求路径
    21. return "redirect:/admin/to/main/page.html";
    22. }
    23. }

    4) spring-web-mvc.xml配置view-controller

    1. <mvc:view-controller path="/admin/to/main/page.html" view-name="admin-main"/>

    三、 用户退出逻辑

    1. /**
    2. * 用户退出登录
    3. * @param session
    4. * @return
    5. */
    6. @RequestMapping("/admin/do/logout.html")
    7. public String logout(HttpSession session){
    8. // 强制session失效
    9. session.invalidate();
    10. // 重定向发请求,被view-controller解析
    11. return "redirect:/admin/to/login/page.html";
    12. }

    四、JSP页面抽取

  • 将想要的片段复制下来保存到一个新的jsp文件中

  • 在需要页面的地方这样写 <%@include file=”/WEB-INF/include-head.jsp”%>
  • 像一般的nav 或者 head都可以抽取出来
  • 起名:include-nav.jsp include.head.jsp