聚星Note04 - 管理员登录

  • 1 整合静态资源
    • 1.1 关联登录请求地址和视图
    • 1.2 维护项目所需常量类
    • 1.3 小技巧 - idea 正常显示子包
    • 1.4 修饰 system-error.jsp
  • 2 登录与注销
    • 2.1 登录与重定向到主页面
      • 2.1.1 创建 md5 加密工具方法
      • 2.1.2 创建登录自定义异常
      • 2.1.3 处理登录失败异常
      • 2.1.4 登录逻辑实现
    • 2.2 注销
    • 2.3 抽取后台页面公共部分
  • 3 配置资源拦截器
    • 3.1 创建拦截器
    • 3.2 注册拦截器

1 整合静态资源

将静态资源(bootstrap、css、fonts、img、jquery、script、ztree、layer)加入到 gatherStars-admin-webui/src/main/webapp 目录

1.1 关联登录请求地址和视图

  1. 创建 WEB-INF/admin-login.jsp
  2. spring-web-mvc.xml 配置view-controller
<!-- 关联请求地址和视图,免写handle方法 -->
<mvc:view-controller path="/admin/to/login/page.html" view-name="admin-login" />
  1. 浏览器访问 http://localhost:8080/admin/to/login/page.html

1.2 维护项目所需常量类

创建 gatherStars-admin-util/src/main/java/com.turling.gatherStars.constant.ProjectConstant
为项目所需常量, 提供统一入口

public class ProjectConstant {public static final String MESSAGE_LOGIN_FAILED = "抱歉!账号密码错误!请重新输入!";public static final String MESSAGE_LOGIN_ACCT_ALREADY_IN_USE = "抱歉!该账号已被使用!";public static final String MESSAGE_ACCESS_FORBIDEN = "请登录后访问!";public static final String MESSAGE_STRING_INVALIDATE = "请检测到您没有输入有效数据!";public static final String ATTR_NAME_EXCEPTION = "exception";
}

修改 gatherStars-admin-component/src/main/java/com.turling.gatherStars.mvc.config.GatherStarsExceptionResolver

modelAndView.addObject(ProjectConstant.ATTR_NAME_EXCEPTION, exception);

1.3 小技巧 - idea 正常显示子包

点击项目上方齿轮 – 取消勾选 Hide Empty Middle Packages

1.4 修饰 system-error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="description" content=""><meta name="keys" content=""><meta name="author" content=""><base href="http://${pageContext.request.serverName }:${pageContext.request.serverPort }${pageContext.request.contextPath }/" /><link rel="stylesheet" href="bootstrap/css/bootstrap.min.css"><link rel="stylesheet" href="css/font-awesome.min.css"><link rel="stylesheet" href="css/login.css"><script type="text/javascript" src="jquery/jquery-2.1.1.min.js"></script><script type="text/javascript" src="bootstrap/js/bootstrap.min.js"></script><script type="text/javascript">$(function(){$("button").click(function(){// 相当于浏览器的后退按钮window.history.back();});});</script></head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation"><div class="container"><div class="navbar-header"><div><a class="navbar-brand" href="index.html" style="font-size: 32px;">聚星-创意产品众筹平台</a></div></div></div>
</nav><div class="container"><h2 class="form-signin-heading" style="text-align: center;"><i class="glyphicon glyphicon-log-in"></i> 哎呀!系统出错了!</h2><!-- requestScope.exception.message相当于exception.getMessage() --><h3 style="text-align: center;">${requestScope.exception.message }</h3><button style="width: 150px;margin: 50px auto 0px auto;" class="btn btn-lg btn-success btn-block">点我返回上一步</button>
</div>
</body>
</html>

2 登录与注销

2.1 登录与重定向到主页面

2.1.1 创建 md5 加密工具方法

com.turling.gatherStars.util.GatherStarsUtil 中添加

public static String md5 (String source) {// 1. 判断 source 是否有效if (source == null || source.length() == 0) {// 触发异常处理机制throw new RuntimeException(ProjectConstant.MESSAGE_STRING_INVALIDATE);}try {// 2. 获取 MessageDigest 对象String algorithm = "md5";MessageDigest messageDigest = MessageDigest.getInstance(algorithm);// 3. 获取明文字符串对应的字节数组byte[] input = source.getBytes();// 4. 执行加密byte[] output = messageDigest.digest(input);// 5. 创建 BigInteger 对象int signum = 1;  // 1 表示为整数BigInteger bigInteger = new BigInteger(signum, output);// 6. 按照16进制将 bigInteger 转化为字符int radix = 16;String encode = bigInteger.toString(radix).toUpperCase();return encode;} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return null;
}

2.1.2 创建登录自定义异常

创建 com.turling.gatherStars.exception.LoginFailedException

public class LoginFailedException extends RuntimeException{private static final long serialVersionUID = 1L;public LoginFailedException() {super();}public LoginFailedException(String message) {super(message);}
}

2.1.3 处理登录失败异常

  1. com.turling.gatherStars.mvc.config.GatherStarsExceptionResolver 添加异常处理
@ExceptionHandler(value = LoginFailedException.class)
public ModelAndView resolveLoginFailedException(LoginFailedException exception, HttpServletRequest request,HttpServletResponse response) throws IOException{String viewName = "admin-login";return commonResolve(viewName, exception, request, response);
}
  1. admin-login.jsp 添加错误信息反馈
// <h2 ... ></i> 管理员登录</h2> 标签后添加
<p>${ requestScope.exception.message }</p>

2.1.4 登录逻辑实现

  1. spring-web-mvc.xml 配置view-controller
<mvc:view-controller path="/admin/to/main/page.html" view-name="admin-main" />
  1. 新建 com.turling.gatherStars.mvc.handler.AdminHandler
@Controller
public class AdminHandler {@Autowiredprivate AdminService adminService;@RequestMapping("/admin/do/login.html")public String doLogin(@RequestParam("loginAcct") String loginAcct,@RequestParam("userPswd") String userPswd,HttpSession session) {// 返回 admin 对象说明登录成功,否则抛出异常Admin admin = adminService.getAdminByLoginAcct(loginAcct, userPswd);// 将登录成功返回的 admin 对象存入 Session 域session.setAttribute(ProjectConstant.ATTR_NAME_LOGIN_ADMIN, admin);return "redirect:/admin/to/main/page.html";}
}
  1. com.turling.gatherStars.service.api.AdminService 添加
Admin getAdminByLoginAcct(String loginAcct, String userPswd);
  1. com.turling.gatherStars.service.impl.AdminServiceImpl 添加
public Admin getAdminByLoginAcct(String loginAcct, String userPswd) {// 1. 根据账号密码查询 Admin 对象AdminExample adminExample = new AdminExample();AdminExample.Criteria criteria = adminExample.createCriteria();// 封装查询条件criteria.andLoginAcctEqualTo(loginAcct);// 调用查询方法List<Admin> adminList = adminMapper.selectByExample(adminExample);// 2. 判断 adminList 对象是否为空if (adminList == null || adminList.size() == 0) {// 抛出异常throw new LoginFailedException(ProjectConstant.MESSAGE_LOGIN_FAILED);}Admin admin = adminList.get(0);if (adminList.get(0) == null) {throw new LoginFailedException(ProjectConstant.MESSAGE_LOGIN_FAILED);}// 3. 取出 admin 对象中的密码String userPswdByExample = admin.getUserPswd();// 4. 将表单提交的明文密码进行加密String passwordByForm = GatherStarsUtil.md5(userPswd);// 5. 与数据库密码进行比较if (userPswdByExample != null && userPswdByExample.equals(passwordByForm)) {return admin;} else {throw new LoginFailedException(ProjectConstant.MESSAGE_LOGIN_FAILED);}
}

2.2 注销

  1. com.turling.gatherStars.mvc.handler.AdminHandler 添加
@RequestMapping("/admin/do/logout.html")
public String doLogout(HttpSession session) {// 强制 session 失效session.invalidate();return "redirect:/admin/to/login/page.html";
}
  1. 修改 admin-main.jsp 中的注销超链接
<li><a href="/admin/do/logout.html"><i class="glyphicon glyphicon-off"></i> 退出系统</a></li>

2.3 抽取后台页面公共部分

  1. 新建 WEB-INF/include-head.jsp
<%@ page contentType="text/html; charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="description" content=""><meta name="author" content=""><title>聚星</title><base href="http://${pageContext.request.serverName }:${pageContext.request.serverPort }${pageContext.request.contextPath }/"/><link rel="stylesheet" href="bootstrap/css/bootstrap.min.css"><link rel="stylesheet" href="css/font-awesome.min.css"><link rel="stylesheet" href="css/main.css"><style>.tree li {list-style-type: none;cursor:pointer;}.tree-closed {height : 40px;}.tree-expanded {height : auto;}</style><script src="jquery/jquery-2.1.1.min.js"></script><script src="bootstrap/js/bootstrap.min.js"></script><script src="script/docs.min.js"></script><script type="text/javascript" src="layer/layer.js"></script><script type="text/javascript">$(function () {$(".list-group-item").click(function(){if ( $(this).find("ul") ) {$(this).toggleClass("tree-closed");if ( $(this).hasClass("tree-closed") ) {$("ul", this).hide("fast");} else {$("ul", this).show("fast");}}});});</script>
</head>
  1. 新建 WEB-INF/include-nav.jsp
<%@ page contentType="text/html; charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation"><div class="container-fluid"><div class="navbar-header"><div><a class="navbar-brand" style="font-size:32px;" href="#">众筹平台 - 控制面板</a></div></div><div id="navbar" class="navbar-collapse collapse"><ul class="nav navbar-nav navbar-right"><li style="padding-top:8px;"><div class="btn-group"><button type="button" class="btn btn-default btn-success dropdown-toggle" data-toggle="dropdown"><i class="glyphicon glyphicon-user"></i> ${ sessionScope.loginAdmin.userName} <span class="caret"></span></button><ul class="dropdown-menu" role="menu"><li><a href="#"><i class="glyphicon glyphicon-cog"></i> 个人设置</a></li><li><a href="#"><i class="glyphicon glyphicon-comment"></i> 消息</a></li><li class="divider"></li><li><a href="/admin/do/logout.html"><i class="glyphicon glyphicon-off"></i> 退出系统</a></li></ul></div></li><li style="margin-left:10px;padding-top:8px;"><button type="button" class="btn btn-default btn-danger"><span class="glyphicon glyphicon-question-sign"></span> 帮助</button></li></ul><form class="navbar-form navbar-right"><input type="text" class="form-control" placeholder="查询"></form></div></div>
</nav>
  1. 新建 WEB-INF/include-sidebar.jsp
<%@ page contentType="text/html; charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<div class="col-sm-3 col-md-2 sidebar"><div class="tree"><ul style="padding-left:0px;" class="list-group"><li class="list-group-item tree-closed" ><a href="main.html"><i class="glyphicon glyphicon-dashboard"></i> 控制面板</a></li><li class="list-group-item tree-closed"><span><i class="glyphicon glyphicon glyphicon-tasks"></i> 权限管理 <span class="badge" style="float:right">3</span></span><ul style="margin-top:10px;display:none;"><li style="height:30px;"><a href="user.html"><i class="glyphicon glyphicon-user"></i> 用户维护</a></li><li style="height:30px;"><a href="role.html"><i class="glyphicon glyphicon-king"></i> 角色维护</a></li><li style="height:30px;"><a href="permission.html"><i class="glyphicon glyphicon-lock"></i> 菜单维护</a></li></ul></li><li class="list-group-item tree-closed"><span><i class="glyphicon glyphicon-ok"></i> 业务审核 <span class="badge" style="float:right">3</span></span><ul style="margin-top:10px;display:none;"><li style="height:30px;"><a href="auth_cert.html"><i class="glyphicon glyphicon-check"></i> 实名认证审核</a></li><li style="height:30px;"><a href="auth_adv.html"><i class="glyphicon glyphicon-check"></i> 广告审核</a></li><li style="height:30px;"><a href="auth_project.html"><i class="glyphicon glyphicon-check"></i> 项目审核</a></li></ul></li><li class="list-group-item tree-closed"><span><i class="glyphicon glyphicon-th-large"></i> 业务管理 <span class="badge" style="float:right">7</span></span><ul style="margin-top:10px;display:none;"><li style="height:30px;"><a href="cert.html"><i class="glyphicon glyphicon-picture"></i> 资质维护</a></li><li style="height:30px;"><a href="type.html"><i class="glyphicon glyphicon-equalizer"></i> 分类管理</a></li><li style="height:30px;"><a href="process.html"><i class="glyphicon glyphicon-random"></i> 流程管理</a></li><li style="height:30px;"><a href="advertisement.html"><i class="glyphicon glyphicon-hdd"></i> 广告管理</a></li><li style="height:30px;"><a href="message.html"><i class="glyphicon glyphicon-comment"></i> 消息模板</a></li><li style="height:30px;"><a href="project_type.html"><i class="glyphicon glyphicon-list"></i> 项目分类</a></li><li style="height:30px;"><a href="tag.html"><i class="glyphicon glyphicon-tags"></i> 项目标签</a></li></ul></li><li class="list-group-item tree-closed" ><a href="param.html"><i class="glyphicon glyphicon-list-alt"></i> 参数管理</a></li></ul></div>
</div>
  1. 修改后的 admin-main.jsp 为
<%@ page contentType="text/html; charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="zh-CN">
<%@include file="include-head.jsp" %>
<body><%@include file="include-nav.jsp"%><div class="container-fluid"><div class="row"><%@include file="include-sidebar.jsp"%><div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main"><h1 class="page-header">控制面板</h1><div class="row placeholders"><div class="col-xs-6 col-sm-3 placeholder"><img data-src="holder.js/200x200/auto/sky" class="img-responsive" alt="Generic placeholder thumbnail"><h4>Label</h4><span class="text-muted">Something else</span></div><div class="col-xs-6 col-sm-3 placeholder"><img data-src="holder.js/200x200/auto/vine" class="img-responsive" alt="Generic placeholder thumbnail"><h4>Label</h4><span class="text-muted">Something else</span></div><div class="col-xs-6 col-sm-3 placeholder"><img data-src="holder.js/200x200/auto/sky" class="img-responsive" alt="Generic placeholder thumbnail"><h4>Label</h4><span class="text-muted">Something else</span></div><div class="col-xs-6 col-sm-3 placeholder"><img data-src="holder.js/200x200/auto/vine" class="img-responsive" alt="Generic placeholder thumbnail"><h4>Label</h4><span class="text-muted">Something else</span></div></div></div></div>
</div></body>
</html>

3 配置资源拦截器

3.1 创建拦截器

  1. gatherStars-admin-component 工程下创建拦截器
    com.turling.gatherStars.mvc.interceptor.LoginInterceptor
public class LoginInterceptor extends HandlerInterceptorAdapter {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {// 1. 通过 request 对象获取 Session 对象HttpSession session = request.getSession();// 2. 尝试从 Session 域中获取 Admin 对象Admin admin = (Admin) session.getAttribute(ProjectConstant.ATTR_NAME_LOGIN_ADMIN);// 3. 判断 admin 对象是否为空if(admin == null) {throw new AccessForbiddenException(ProjectConstant.MESSAGE_ACCESS_FORBIDEN);}return true;}
}
  1. gatherStars-admin-util 工程下创建登录异常
    com.turling.gatherStars.exception.AccessForbiddenException
public class AccessForbiddenException extends RuntimeException{public AccessForbiddenException() {super();}public AccessForbiddenException(String message) {super(message);}
}

3.2 注册拦截器

spring-web-mvc.xml 中添加

<mvc:interceptors><mvc:interceptor><!-- 配置拦截受保护的资源 --><!-- /* 一层路径; /** 对应多层路径; --><mvc:mapping path="/**"/><!-- 配置公共资源 --><mvc:exclude-mapping path="/admin/to/login/page.html"/><mvc:exclude-mapping path="/admin/do/login.html"/><!-- 配置拦截器类 --><bean class="com.turling.gatherStars.mvc.interceptor.LoginInterceptor"/></mvc:interceptor>
</mvc:interceptors>

聚星Note04 - 管理员登录相关推荐

  1. Oracle 数据库设置最大进程数参数方法,oracle最大进程数满了处理方法,sysdba管理员登录报“maximum number of processes (150) exceeded“问题解决

    oracle 数据库使用 sysdba 管理员登录报: ORA-00020: maximum number of processes (150) exceeded 译:超过了最大进程数(150) 方法 ...

  2. BCrypt管理员登录密码验证

    一.简单入门测试 BCrypt不支持反运算,只支持密码校验 package com.william.test;import org.springframework.security.crypto.bc ...

  3. java管理员登录_idea实现管理员登录javaweb

    mysql创建db_0106数据库, 创建表 添加一条数据,id int自增,密码:为MD5加密 insert into tb_sys values(null,admin,MD5(123)," ...

  4. 管理员用户不同身份登录页面代码PHP,wordpress管理员登录和普通用户登录后跳转到不同页面-♚付涛纪实阁♚...

    这篇文章将向您展示WordPress用户登录后如何重定向到指定页面或者文章的技巧. 一.重定向到网站管理面板. 将以下代码添加到您的当前主题的 functions.php 文件中 二.重定向到指定页面 ...

  5. day02【后台】管理员登录

    day02[后台]管理员登录 1.创建常量类 创建常量类,用于管理整个系统中所用到的常量 public class CrowdConstant {public static final String ...

  6. 后台userlist.php,后台用户管理(管理员登录后管理会员)

    [预备知识] 一.PHP访问MySQL数据库 1.连接到MySQL数据库 $conn=mysql_connect("localhost","root",&quo ...

  7. java linux root权限管理_Linux--开启root用户并允许管理员登录

    用惯windows的朋友都会觉得执行每一个操作都很简单,但装完linux的话可不是如此,可能你会以为你刚装完linux后用事先设置好的用户名和密码登录,你就是管理员的身份了,但其实你跟普通用户一样,执 ...

  8. Spring+SpringMVC+MyBatis明日方舟版人员信息管理系统前端页面代码前后端交互+SSM框架 管理员登录 游客登录 普通用户登录 人员的增删改查 信息更新 图片上传 分页查询)

    Spring+SpringMVC+MyBatis明日方舟版人员信息管理系统前端页面代码(前后端交互+SSM框架 管理员登录 游客登录 普通用户登录 人员的增删改查 信息更新 图片上传 分页查询 修改密 ...

  9. Java学生信息管理系统——管理员登录模块(简单易上手)

    前言 这一篇是用来记录我编写学生信息管理系统时实现登录操作的过程,这是学生信息管理系统的第一个模块,之后我还会陆续将其它模块分享出来. 其它章节 ------------------------> ...

最新文章

  1. 四连通,和八连通的详解(MATLAB)
  2. 做互联网平台前要想清楚的5件事
  3. 爬虫数据executemany插入_金融数据的获取——一个爬虫的简单例子
  4. ctr 平滑_CTR预估中的贝叶斯平滑方法及其代码实现
  5. [LeetCode]小工具,统计数量,隐藏上锁的题目
  6. 压电式加速计matlab,低频压电加速度传感器的噪声特性及信号处理方法研究
  7. python3解析库pyquery
  8. java内部类简单解析
  9. 随机打乱数据的几种方式
  10. 执念于当下的平淡为美好
  11. RK3128-android5.1-wifi兼容
  12. MySQL高可用之主备同步:电脑安装java步骤
  13. 如何在计算机桌面上添加小工具,怎么在电脑的桌面小工具里添加便签
  14. python读写磁盘扇区数据有什么用_18-55.在Windows中,能够自动修复文件系统错误、扫描并尝试恢复坏扇区的操作是( )_学小易找答案...
  15. Mina State machine状态机讲解
  16. 女王大学 计算机专业,伦敦玛丽女王大学计算机科学专业
  17. 数据库—查询语句中asc、desc表示什么意思?
  18. 字符串中的表达式计算
  19. solidworks安装教程2021
  20. spatialreg | 空间滞后模型、空间误差模型和空间杜宾模型简单形式的R语言实现...

热门文章

  1. 微速摄影教学之系列视频+摄影技术
  2. php网页表格制作,如何制作html表格的边框?HTML table表格制作及实例
  3. 使用BlockingQueue实现包饺子( 生产者做面皮,消费者拿面皮包饺子)简单使用
  4. linux 升级pip3命令,linux如何升级pip
  5. [HASH]MOD运算用户哈希函数
  6. chia如何给别人P盘
  7. iphone6s计算机驱动,iphone6s连接电脑出现驱动问题怎么办
  8. 【树模型与集成学习】(task8)阶段性总结(更新ing)
  9. 机械键盘键帽1u尺寸
  10. XXL-JOB注册执行流程