文章目录
1 Shiro登录
登录流程:
- 准备一个登录界面login.jsp
- 点击登录的时候,向后台传递用户名和密码
Controller层 - 接受参数
- 完成登录认证
//post进入该方法
@RequestMapping(value = "/login",method = RequestMethod.POST)
@ResponseBody
public JsonResult login(String username, String password){
//主体
Subject subject = SecurityUtils.getSubject();
//判断该主体是否已经认证过
if (!subject.isAuthenticated()) {
try {
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
subject.login(token);
}catch (UnknownAccountException uae) {
return new JsonResult(false, "账号错误");
} catch (IncorrectCredentialsException ice) {
return new JsonResult(false, "密码错误");
} catch (LockedAccountException lae) {
return new JsonResult(false, "这个账号已经被锁定");
}catch (AuthenticationException ae) {
return new JsonResult(false, "其他认证错误");
}
}
return new JsonResult();
}
2 完成登录认证时提交form表单
//登录方法
function submitForm() {
//提交表单
$("#loginForm").form("submit",{
url:"/login",
success:function (data) {
//返回字符串
var jsonObj = $.parseJSON(data);
if (jsonObj.success){
//进入页面
location.href="/main";
}else {
$.messager.alert("温馨提示:","登录失败:" + jsonObj.msg,"error");
}
}
});
}
3 增加方法—按回车键提交到后台
//按回车登录 绑定键盘事件
$(document.documentElement).on("keyup", function(event) {
//event 键盘事件的对象
if(event.keyCode == 13){
submitForm();
}
});
4 重置表单里面的内容
function resetForm() {
$("#loginForm").form("clear");
}
5 注销用户功能
前台显示
<div style="float:right;margin-right: 20px; ">
欢迎[<shiro:principal />]登录,
<a href="${pageContext.request.contextPath}/logout">退出</a>
</div>
后台方法跳转
//注销
@RequestMapping("/logout")
public String logout(){
Subject subject = SecurityUtils.getSubject();
subject.logout();
return "forward:/WEB-INF/views/login.jsp";
}
6 解决登录过期
//判断当前窗口是否是顶层窗口
if(top != window){
window.top.location.href = window.location.href;
}
7 权限
7.1 角色用户显示所有权限
function formatperms(arr) {
var persStr = "";
for (var i = 0; i < arr.length; i++) {
var obj = arr[i];
if (i != arr.length - 1) {
persStr += obj.name + ",";
} else {
persStr += obj.name;
}
}
return persStr;
}
7.2 初始化表格数据
//初始化表格
//我们在这里创建两个Grid
//创建当前角色的权限Grid
userPermissionGrid.datagrid({
fit:true,
fixed:true,
fitColumns:true,
rownumbers:true ,
//双击后移除权限
onDblClickRow:itsource["removePermission"]
})
//获取所有权限的Grid
allPermissionGrid.datagrid({
fit:true,
fixed:true,
fitColumns:true,
singleSelect:true,
url:"/permission/page",
rownumbers:true ,
pagination:true,
//双击后添加权限
onDblClickRow:itsource["addPermissions"]
})
addPermissions:function (index,row) {
//双击添加权限
//把选中的数据 添加到左边的表格中去
//重复的数据不要添加
var allrows = userPermissionGrid.datagrid("getRows");
for (var i = 0; i <allrows.length ; i++) {
var rowData = allrows[i];
if (rowData.id == row.id){
//重复
$.messager.show({
title:'提示',
msg:'该权限已经添加!',
timeout:2000,
showType:'slide'
});
return;
}
}
userPermissionGrid.datagrid('appendRow',row);
},
removePermission:function (rowIndex, row) {
//移除数据
userPermissionGrid.datagrid("deleteRow",rowIndex);
}
7.3 修改回显表格数据
edit:function(){
//选择一条数据进行修改
var row = roleGrid.datagrid('getSelected');
if(row){
//弹出对话框
roleDialog.dialog('center').dialog('open');
//清空表格数据
userPermissionGrid.datagrid("loadData",[]);
//修改 -- 回显示数据
roleForm.form('load',row);
//回显表格里面的数据
var tempPermissions = [];
$.extend(tempPermissions,row.permissions);
//夹杂到表格里面
userPermissionGrid.datagrid("loadData",tempPermissions);
}else{
//提示用户
$.messager.alert('温馨提示:','请选中一条数据进行修改','info');
return;
}
注意:
每次经过RequestMapping这些请求的时候,都要执行改方法
如果在修改保存的时候,先在改方法里面查询出数据库Role对象
查询出来 (headImage) 和 当前save(Role role)会进行比对
会把接收数据 去覆盖查询出来数据 。–提交我最终之后的数据
脏数据:一个持久化状态的数据修改非主键的值,在提交的时候会自动更新
如果修改主键值,就会报n-to-n 解决 在修改的时候的时候,关联对象设置null
@ModelAttribute("editRole")
public Role beforeEdit(Long id,String cmd){
Role role = null;
if("update".equals(cmd) && id != null && !"".equals(id) ){
role = roleService.findOne(id);
//就住这就话:在修改的时候的时候,关联对象设置null,保永生
role.setPermissions(null);
}
return role;
}