项目一:第十一天 2、运单waybill快速录入 3、权限demo演示-了解 5、权限模块数据模型 6、基于shiro实现用户认证-登录(重点)
1、 easyui DataGrid行编辑功能
2、 运单waybill快速录入
3、 权限demo演示-了解
4、 Apache shiro安全框架概述
5、 权限模块数据模型
6、 基于shiro实现用户认证-登录(重点)
1 jQuery EasyUI datagrid行编辑功能使用方式
datagrid的行编辑功能是以列为单位,通过列属性指定哪列可以编辑,哪列不能编辑。
第一步:通过列属性 editor指定哪列可以编辑 。指定编辑类型(普通,数字,下拉,日期),必填项
第二步:调用数据表格方法
**修改:beginEdit endEdit;当调用结束编辑触发结束编辑事件,在事件中完成操作
**新增:insertRow
**删除:deleteRow
数据表格的列属性:

数据表格的方法:开始编辑数据




在调用结束编辑后,datagrid触发事件。数据表格的结束编辑事件, 删除操作需要单独处理:

<table id="dg"></table>
<script type="text/javascript">
var editIdx = -1; //编辑行记录索引
//创建数据表格
$('#dg').datagrid({
url:'../data/user.json', //数据来源ajax请求, 响应json数据
columns:[[ //展示数据
{field:'id',title:'编号',width:100},
{field:'name',title:'姓名',width:100,editor:{
type:"validatebox", //validatebox普通输入框 numberbox:数字框
options:{required:true} //指定编辑后数据-必填
}},
{field:'age',title:'年龄',width:100,align:'right',editor:{
type:"numberbox",
options:{required:true}
}}
]],
pagination:true,
/* 分页栏, 提交两个参数:page(当前页) rows(每页显示记录数)
响应数据格式:json对象
{
total:100, //总记录数
rows:[{},{}] //当前页记录
}
*/
toolbar: [{ //工具栏
iconCls: 'icon-add',
text:'增加',
handler: function(){
//在数据表格中新增一条记录
//插入新的一行在第一排的位置
$('#dg').datagrid('insertRow',{
index: 0, // index start with 0
row: { //行记录
}
});
$('#dg').datagrid("beginEdit", 0);
editIdx = 0;
}
},{ //工具栏
iconCls: 'icon-edit', //显示图标样式
text:'修改', //显示文本
handler: function(){ //点击事件
var rows = $("#dg").datagrid("getSelections");
//获取编辑行索引
var idx = $("#dg").datagrid("getRowIndex", rows[0]);
//调用开始编辑数据 beginEdit
$("#dg").datagrid("beginEdit", idx);
editIdx = idx;
}
},{
iconCls: 'icon-save', //显示图标样式
text:'保存', //显示文本
handler: function(){ //点击事件
//调用结束编辑数据 beginEdit 触发结束编辑事件,在结束编辑事件中发送请求,请求服务器
$("#dg").datagrid("endEdit", editIdx);
}
},{
iconCls: 'icon-remove',
text:'删除',
handler: function(){
var rows = $("#dg").datagrid("getSelections");
for(var i =0;i<rows.length;i++){
//获取删除行索引
var idx = $("#dg").datagrid("getRowIndex", rows[i]);
$("#dg").datagrid("deleteRow", idx);
}
$.post("userAction_delea.action",{},function(data){
})
}
}] ,
striped:true,
rownumbers:true,
pageSize:2,
pageList:[2,5,6],
//仅仅调用结束编辑方法后自动触发
onAfterEdit:function(rowIndex, rowData, changes){
// rowIndex: 编辑行索引,从0
// rowData: 对应的记录编辑行
// changes: 更改的字段/值对
console.info(rowData);
$.post("userAction_save.action",rowData,function(data){
//
})
}
});
</script>
2 运单快速录入
第一步:修改waybill_quick.html页面中数据表格onAfterEdit事件

查看发送ajax请求信息:

第二步:创建运单相关的Action、Service、Dao实现数据库操作

验证权限:验证用户是否有权限。
1 演示权限demo(了解)
项目使用ssh实现。
1、 导入项目
2、 创建数据库

3、 启动项目完成自动建表

4、 手动向用户表中添加一条用户记录
INSERT INTO itcast_user(id,loginName,PASSWORD) VALUES(1,'admin',MD5('admin'));
5、 执行资料中权限数据脚本:
INSERT INTO `itcast_privilege` VALUES ('1', '系统管理', null, null);
INSERT INTO `itcast_privilege` VALUES ('2', '角色管理', '/roleAction_list', '1');
INSERT INTO `itcast_privilege` VALUES ('3', '部门管理', '/departmentAction_list', '1');
INSERT INTO `itcast_privilege` VALUES ('4', '用户管理', '/userAction_list', '1');
INSERT INTO `itcast_privilege` VALUES ('5', '角色列表', '/roleAction_list', '2');
INSERT INTO `itcast_privilege` VALUES ('6', '角色删除', '/roleAction_delete', '2');
INSERT INTO `itcast_privilege` VALUES ('7', '角色添加', '/roleAction_save', '2');
INSERT INTO `itcast_privilege` VALUES ('8', '角色修改', '/roleAction_update', '2');
INSERT INTO `itcast_privilege` VALUES ('9', '部门列表', '/departmentAction_list', '3');
INSERT INTO `itcast_privilege` VALUES ('10', '部门删除', '/departmentAction_delete', '3');
INSERT INTO `itcast_privilege` VALUES ('11', '部门添加', '/departmentAction_save', '3');
INSERT INTO `itcast_privilege` VALUES ('12', '部门修改', '/departmentAction_update', '3');
INSERT INTO `itcast_privilege` VALUES ('13', '用户列表', '/userAction_list', '4');
INSERT INTO `itcast_privilege` VALUES ('14', '用户删除', '/userAction_delete', '4');
INSERT INTO `itcast_privilege` VALUES ('15', '用户添加', '/userAction_save', '4');
INSERT INTO `itcast_privilege` VALUES ('16', '用户修改', '/userAction_update', '4');
INSERT INTO `itcast_privilege` VALUES ('17', '用户初始化密码', '/userAction_reSetPassword', '4');
INSERT INTO `itcast_privilege` VALUES ('21', '设置权限', '/roleAction_setPrivilege', '2');
6、 重新启动项目-系统会将权限的数据加载
2 权限概述
认证:系统提供给用户识别身份功能 ,登陆功能就是认证 ----知道你是谁?
授权:系统提供用户分配权限功能—让系统知道你能干什么?
验权:验证用户是否有权限
Shiro 4大核心功能
认证
授权
加密
会话管理


shiro认证流程执行图:

Application Code:应用代码,比如(登陆页面,服务器端登陆方法)-程序员自己编写
Subject: shiro框架提供接口;代表当前“用户”有认证状态,包含权限信息-通过工具类获取
Security Manage: shiro框架提供接口;shiro框架核心;管理所有登陆用户(Subject)
Realm: shiro框架有提供,一般自己编写。访问安全数据(调用service或者dao)查询数据库中用户密码,用户权限,角色。
1 权限模块数据模型
权限demo中数据模型:

Demo中权限表中:有权限数据,有菜单数据,混合到一起。

2 基于Apache shiro实现认证(登陆)
手动增加一条用户记录:密码进行加密 admin-------21232f297a57a5a743894a0e4a801fc3
2.1 登陆页面处理(应用代码)
页面:login.jsp
1、 给input增加相关的name
2、 提交表单,发送登陆请求

服务端新建三层对象。。。。
3、 服务端创建三层对象,完成注入

2.2 搭建shiro环境
1、 在web.xml中配置代理spring提供过滤器。注意:一定放在struts2核心过滤器之前
<!-- spring提供过滤器 -->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2、 问题:找不到bean对象

3、 解决:在spring配置文件中配置对象,对象名称跟上面过滤器名称一致

基于shiro实现认证(登陆)

完善userAction中登陆:applicationCode --->Subject----->securityManager------->自定义realm
创建realm完善realm中认证方法:

/**
* @Description: 基于shiro框架实现登陆
*/
@Action("userAction_login")
public String login() throws Exception {
if(StringUtils.isNotBlank(checkcode)){
String realChecode = (String) ServletActionContext.getRequest().getSession().getAttribute("key");
if(checkcode.equals(realChecode)){
//获取当前登陆用户
Subject subject = SecurityUtils.getSubject();
//判断当前用户登陆状态
if(subject.isAuthenticated()){
return "index";
}else{
//开始认证 认证状态:未认证
//创建认证令牌-用户名密码令牌
AuthenticationToken token = new UsernamePasswordToken(model.getUsername(), Md5Util.encode(model.getPassword()));
try {
subject.login(token);
//用户认证通过 subject对象变为 认证通过
//将用户登陆信息存在session
User user = (User) subject.getPrincipal();
ServletActionContext.getRequest().getSession().setAttribute("loginUser", user);
return "index";
} catch (Exception e) {
if(e instanceof UnknownAccountException){
this.addActionError("用户名输入错误"); //login.jsp中 通过struts2标签展示错误信息 <s:actionerror>
}
if(e instanceof IncorrectCredentialsException){
}
//用户名密码有误
e.printStackTrace();
}
}
}
}
return "login";
}
注意:在spring配置文件中将realm对象注入安全管理器:
<!-- 配置realm对象 -->
<bean id="bosRealm" class="com.itheima.bos.realm.BosRealm"></bean>
<!-- 配置安全管理器对象:shiro框架核心 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!-- 注入realm -->
<property name="realm" ref="bosRealm"></property>
</bean>
项目一:第十一天 2、运单waybill快速录入 3、权限demo演示-了解 5、权限模块数据模型 6、基于shiro实现用户认证-登录(重点)的更多相关文章
- 运单waybill快速录入
运单waybill快速录入 前台页面: 1修改页面onAfterEdit事件, 后台代码:ajax响应回请求1 为成功,0 为失败
- JAVAEE——BOS物流项目10:权限概述、常见的权限控制方式、apache shiro框架简介、基于shiro框架进行认证操作
1 学习计划 1.演示权限demo 2.权限概述 n 认证 n 授权 3.常见的权限控制方式 n url拦截权限控制 n 方法注解权限控制 4.创建权限数据模型 n 权限表 n 角色表 n 用户表 n ...
- 基于MongodbDB的用户认证-运维笔记
MongoDB默认是不认证的,默认没有账号,只要能连接上服务就可以对数据库进行各种操作,MongoDB认为安全最好的方法就是在一个可信的环境中运行它,保证之后可信的机器才能访问它,可能这些对一些要求高 ...
- 项目一:第十二天 1、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示
1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 ...
- ABAP 内表的行列转换-发货通知单-打印到Excel里-NEW-(以运单号为单位显示ALV然后保存输出)
*********************************************************************** * Title : ZSDF003 ...
- 基于MVC4+EasyUI的Web开发框架经验总结(16)--使用云打印控件C-Lodop打印页面或套打报关运单信息
在最新的MVC4+EasyUI的Web开发框架里面,我整合了关于网购运单处理的一个模块,其中整合了客户导单.运单合并.到货扫描.扣仓.出仓.查询等各个模块的操作,里面涉及到一些运单套打的操作,不过由于 ...
- 项目实战10.1—企业级自动化运维工具应用实战-ansible
实战环境: 公司计划在年底做一次大型市场促销活动,全面冲刺下交易额,为明年的上市做准备.公司要求各业务组对年底大促做准备,运维部要求所有业务容量进行三倍的扩容,并搭建出多套环境可以共开发和测试人员做测 ...
- JAVAEE——BOS物流项目09:业务受理需求分析、创建表、实现自动分单、数据表格编辑功能使用方法和工作单快速录入
1 学习计划 1.业务受理需求分析 n 业务通知单 n 工单 n 工作单 2.创建业务受理环节的数据表 n 业务通知单 n 工单 n 工作单 3.实现业务受理自动分单 n 在CRM服务端扩展方法根据手 ...
- c# 淘宝运单查询
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
随机推荐
- cassandra集群环境搭建——注意seeds节点,DHT p2p集群管理难道初始化都应如此吗?
解压cassandra的安装包后可以查看主要的配置文件,都在conf/目录下,conf/cassandra.yaml比较重要,其中需要着重注意的有以下一些配置项: cluster_name: 'TC0 ...
- (转)Java发送http请求(get 与post方法请求)
本文转载于:http://bijian1013.iteye.com/blog/2166855 package com.bijian.study; import java.io.BufferedRead ...
- 31 python下实现并发编程
一 背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所 ...
- datatable绑定comboBox,在下拉菜单中显示对应数据
实现功能: datatable绑定comboBox,在下拉菜单中显示对应数据 实现方法: .生成datatable,并为combox绑定数据源: comboBox1.DataSource = dt1; ...
- c++ 修改stl set中的元素
set的迭代器it有const修饰符,那么对它元素的修改就必然不能成功了.但是有时候遇到要修改stl set元素的问题,这个问题一般的解决方法是先erase这个元素,然后再insert,这样效率很低, ...
- 总结:实体类和(XML或二进制)之间相互转(序列化和反序列化)
XML和实体类之间相互转换(序列化和反序列化) C# XML反序列化与序列化举例:XmlSerializer XML文件与实体类的互相转换 通过我前面的几篇收藏的文章,今天来自己做个对实体类对象序 ...
- 学习动态性能表(21)v$lincense
学习动态性能表 第20篇--v$lincense 2007.6.15 本节主要参数: SESSION_MAX:实例允许的并发最大session数量 SESSION_WARNING:当前实例警告的并发 ...
- PHP判断键值数组是否存在,使用empty或isset或array_key_exists(转)
一个例子 猜猜看,下面的例子会输出什么? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?php $a = array('a'=>1, 'b'=>0, 'c'= ...
- nginx与二级域名的绑定 nginx安装
nginx中文文档 http://www.nginx.cn/doc/ nginx 查看配置文件地址 http://blog.csdn.net/ljfrocky/article/details/5052 ...
- 第 十六 课 Map
Map 是一种无序的键值对的集合 var mymap map[string]string //先声明一个字典(map)名字叫做mymap,其key所对应的数据类型是string[字符串],value所 ...