1.重置数据库的密码并加密
1.1 准备一个工具类
package cn.itsource.utils;
import org.apache.shiro.crypto.hash.SimpleHash;
/**
* 这个工具类用来对密码进行加密 使用静态方法传入password用对应规则对密码进行加密
*/
public class MD5Util {
public static String getPassWord(String password){
/*
algorithmName:算法
source:原密码
salt:盐值
hashIterations:加密次数
*/
SimpleHash simpleHash = new SimpleHash("MD5", password, "cn.itsource", 10);
//使用toString方法打印密码
return simpleHash.toString();
}
}
1.2.在测试类中将数据库所有用户密码重置加密
/**
* 查询出全部用户的密码并对它们进行重置密码并进行加密
*/
@Autowired
private IEmployeeService employeeService;
@Test
public void testResrtPassWord() throws Exception {
//获取所有的用户
List<Employee> list = employeeService.findAll(new EmployeeQuery());
//将所有的用户密码设置为用户名并进行加密
for (Employee employee : list) {
//设置密码 用工具类进行加密 传入的密码是用户名
employee.setPassword(MD5Util.getPassWord(employee.getUsername()));
//保存设置了加密密码后的用户对象
employeeService.save(employee);
}
}
1.3 登录
@Controller
@RequestMapping("/s")
public class LoginController {
/**
* GET方式访问登录页面
*
* @return
*/
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login() {
return "forward:/s/login.jsp";
}
/**
* POST方式提交登录表单
*
* @return
*/
@ResponseBody
@RequestMapping(value = "/login", method = RequestMethod.POST)
public ResultJson login2(String username, String password) {
try {
//获取当前用户【只要访问shiro的程序,就当作一个用户,不论是否已经登录】
Subject subject = SecurityUtils.getSubject();
//判断当前用户是否已经登录
System.out.println("判断当前用户是否已经登录:" + subject.isAuthenticated());
if (!subject.isAuthenticated()) {
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
//登录
subject.login(token);
}
} catch (UnknownAccountException e) {//Unknown未知的 Account账户
//只要用户名错误(通过此用户名去查询数据库,结果没查到数据),就一定会抛出UnknownAccountException异常
e.printStackTrace();
return new ResultJson(500, "用户名不存在!");
} catch (IncorrectCredentialsException e) {//Incorrect不正确的 Credentials令牌/密码
//只要密码错误(登录时传入的密码与数据库中查询出来的密码不匹配),就一定会抛出IncorrectCredentialsException异常
e.printStackTrace();
return new ResultJson(500, "密码错误!");
} catch (AuthenticationException e) {
e.printStackTrace();
return new ResultJson(500, "系统繁忙!");
}
return new ResultJson(200, "登录成功");
}
@RequestMapping("/logout")
public String logout() {
//获取当前用户【只要访问shiro的程序,就当作一个用户,不论是否已经登录】
Subject subject = SecurityUtils.getSubject();
subject.logout();
return "forward:/s/login.jsp";
}
}
1.4 登录前台页面 自己从网上找
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="0">
<title>后台管理</title>
<link rel="icon" href="favicon.ico" type="image/x-icon"/>
<link href="/login/login.css" rel="stylesheet" type="text/css"/>
<script src="/easyui/jquery.min.js"></script>
<script src="/js/common.js"></script>
<script type="text/javascript">
$(function () {
//如果当前窗口不是最顶级窗口,就表示当前窗口被嵌套了
if (window.top!=window){
//将当前窗口位置返回到登录页面
window.top.location.href="/s/login";
}
$("#btn").click(function () {
$.post("/s/login",$("#loginFrom").toJSON(),function (data) {
if(data.status == 500){
$("#errorMsg").text(data.msg);
}else{
//JS代码跳转页面
location.href = "/s/index.jsp";
}
},"json");
});
//回车登录
$(document).keypress(function (event) {
if(event.keyCode==13){//如果按下回车键
//就触发提交按钮的点击事件
$("#btn").click();
}
})
})
</script>
</head>
<body>
<div class="login_box">
<div class="login_l_img"><img src="/login/images/login-img.png"/></div>
<div class="login">
<div class="login_logo"><a href="#"><img src="/login/images/login_logo.png"/></a></div>
<div class="login_name">
<p>后台管理系统</p>
</div>
<form id="loginFrom">
<input type="text" name="username" id="username" placeholder="请输入您的用户名" onfocus="this.placeholder=''"
onblur="this.placeholder='请输入您的用户名'"/>
<input type="password" name="password" id="password" placeholder="请输入您的密码" onfocus="this.placeholder=''"
onblur="this.placeholder='请输入您的密码'"/>
<input value="登录" style="width:100%;" type="button" id="btn">
</form>
<div id="errorMsg" style="text-align: center;color: #ff5d49;height: 25px;"></div>
</div>
</div>
</body>
</html>
1.5 首页页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags"%>
<link rel="icon" href="favicon.ico" type="image/x-icon" />
<html>
<head>
<title>伊利后台管理系统</title>
<%@include file="/WEB-INF/views/common.jsp"%>
<style type="text/css">
#north>div{width: 50%;height: 90px;float: left;overflow:hidden}
#north img{margin-left: 120px;}
#north b{font-size: 24px;}
</style>
<script type="text/javascript">
$(function(){
$("#treemenu").tree({
method:"get",
url:"/tree.json",
onClick: function(node){
if(node.url){// 在用户点击的时候提示
//判断点击的名称对应的选项卡是否已存在【如果存在就选中它并且刷新它,如果不存就添加它】
var exists = $("#tabs").tabs("exists", node.text);
if(exists){
//选中它
$('#tabs').tabs("select", node.text);
//刷新它
var tab = $('#tabs').tabs('getTab', node.text); // 获取选择的面板
//var tab = $('#tabs').tabs('getSelected'); // 获取选择的面板
$('#tabs').tabs('update', {
tab: tab,
options:{
content: '<iframe src="'+node.url+'" frameborder="0" scrolling="auto" height="625px" width="100%"></iframe>'
}
});
}else{
//添加选项卡
$('#tabs').tabs('add',{
title: node.text,
selected: true,
closable: true,
content: '<iframe src="'+node.url+'" frameborder="0" scrolling="auto" height="625px" width="100%"></iframe>'
});
}
}
}
});
});
</script>
</head>
<!--
region 区域写到class="easyui-layout"的容器内部的div上,表示当前div显示到东南西北中的哪一块?
split:true 分割线,可以改变当前区域的大小
layout 布局
-->
<body class="easyui-layout">
<div data-options="region:'north'" id="north" style="height:100px;line-height: 80px;margin-top: 5px">
<div style="background-color: #00bbee">
<p style="text-align: center">
<img src="yili.jpg" style="height: 20px">
<b>欢迎使用伊利集团智能商贸系统</b></p></div>
<div style="background-color: #3c8b3c">
<div style="text-align:right">欢迎您,<b style="color: #b52b27"><shiro:principal property="username"/></b>
<a href="/s/logout" onclick="return confirm('确定要退出吗?')" class="easyui-linkbutton" data-options="iconCls:'icon-undo'">退出</a>
</div>
</div>
</div>
<div data-options="region:'west',title:'系统菜单',iconCls:'icon-list2'" style="width:200px;">
<ul id="treemenu"></ul>
</div>
<div data-options="region:'center'" style="padding-left:5px;background:#eee;">
<div id="tabs" class="easyui-tabs" data-options="fit:true">
<div title="欢迎你" style="padding:10px;">
</div>
</div>
</div>
</body>
</html>
1.6 一些知识点和注意点与项目中的错误
注意在shiro配置文件中对需要用到的文件进行放行 不然会访问不到
<property name="filterChainDefinitions">
<value>
# 所有图片、css、js文件放行
/favicon.ico = anon
/**/*.png = anon
/**/*.jpg = anon
/**/*.gif = anon
/**/*.css = anon
/**/*.js = anon
# 登录页面、提交登录表单、注册页面、提交注册表单、退出系统必须设置成不需要登录即可访问
/s/login = anon
/s/logout = anon
/s/register = anon
# 哪些资源是必须要授权才能访问的?
/s/zy01 = perms[employee:index]
/s/zy02 = perms[department:index]
/s/zy03 = perms[employee:page]
# 除了上面以外的其他所有的资源都必须是登录后才能访问:
/** = authc
</value>
</property>
如何使得combobox下拉框显示滚动条
方法:把属性panelHeight:"auto"注释掉即可。
设置java的web项目ico图标
为每个页面的head头部添加
回车登录
$(document.documentElement).on("keyup", function(event) {
//console.debug(event.keyCode);
var keyCode = event.keyCode;
console.debug(keyCode);
if (keyCode === 13) { // 捕获回车
submitForm(); // 提交表单
}
});
登录过期问题
// 检查自己是否是顶级页面
if (top != window) {// 如果不是顶级
//把子页面的地址,赋值给顶级页面显示
window.top.location.href = window.location.href;
}