、要求不同的用户登录以后可以看到不同的菜单。(后台可以实现对用户菜单的管理。)
第一步:分析数据结构
1:用户表
2:角色表
3:菜单表
2:角色表
3:菜单表
其中他们的关系是 用户与角色多对多 角色与菜单多多对多 借助外键构造关系表
create database auth character set UTF8;
/*用户表*/
create table users(
id varchar(32) primary key,
name varchar(30),
pwd varchar(32)
);
/*创建角色表*/
create table roles(
id varchar(32) primary key,
name varchar(30),
des varchar(100)
);
/*通过一个中间表映射多对多的关系,多对多就是多个一对多
联合主键的特点是:两个列不能同时重复
*/
create table roleuser(
uid varchar(32),
rid varchar(32),
constraint ru_pk primary key(uid,rid),
constraint ru_fk1 foreign key(uid) references users(id),
constraint ru_fk2 foreign key(rid) references roles(id)
);
/*创建菜单表*/
create table menus(
id varchar(32) primary key,
name varchar(50),
url varchar(100)
);
/*关联角色到菜单*/
create table rolemenu(
mid varchar(32),
rid varchar(32),
constraint rm_pk primary key(mid,rid),
constraint rm_fk1 foreign key(mid) references menus(id),
constraint rm_fk2 foreign key(rid) references roles(id)
)
E-R图 (Entry-Relationship 实体关系图)
第二步:先写入表中几行数据进行基本分析
insert into users values('U001','Jack','1234');
insert into users values('U002','张三','4321');
insert into users values('U003','Tom','1111');
insert into roles values('R001','管理员','');
insert into roles values('R002','教师','');
insert into roleuser values('U001','R001');
insert into roleuser values('U002','R002');
insert into menus values('M001','系统管理','/sys.jsp');
insert into menus values('M002','用户管理','/user.jsp');
insert into menus values('M003','角色管理','/role.jsp');
insert into rolemenu values('M001','R001');
insert into rolemenu values('M002','R001');
insert into rolemenu values('M003','R001');
insert into rolemenu values('M003','R002');
/*查询某个拥有某个角色*/
select u.name,r.name
from users u inner join roleuser ru on u.id=ru.uid
inner join roles r on ru.rid=r.id;
/*某角色拥有某菜单*/
select r.name,m.name
from roles r inner join rolemenu rm on r.id=rm.rid
inner join menus m on rm.mid=m.id;
/*查询某人拥有某个菜单*/
select u.name,m.name
from users u inner join roleuser ru on u.id=ru.uid
inner join roles r on ru.rid=r.id
inner join rolemenu rm on r.id=rm.rid
inner join menus m on rm.mid=m.id;
第三步:创建JavaBean(领域模型)和工具类
public class User {
private String name;
private String id;
private String pwd;
}
设计界面
第四步:实现用户登录
分包:提供用户的登录,退出修改
Cn.itcast.user.
userServlet
service
userService
dao
userDao
菜单
Cn.itcast.menu
MenuServlet
MenuService
MenuDao
角色
对主页面来只有Servvlet没有service,调用别的service实现。
Cn.itcast.main
MainServlet
(没有Service)
Cn.itcast.user.
userServlet
service
userService
dao
userDao
菜单
Cn.itcast.menu
MenuServlet
MenuService
MenuDao
角色
对主页面来只有Servvlet没有service,调用别的service实现。
Cn.itcast.main
MainServlet
(没有Service)
第五步:开发登录页面
<form name="name" action="<c:url value='/UserServlet?cmd=login'/>" method="post">
Name:<input type="text" name="name"/><br/>
pwd:<input type="text" name="pwd"/><br/>
<input type="submit"/>
</form>
第六步:开发整个的usre包
Cn.itcast.user.
userServlet
service
userService
dao
userDao
userServlet
service
userService
dao
userDao
第七步:实菜单的查询功能
菜单是菜单的功能包。
主功能,有自己的servvlet- MainServvlet
菜单是菜单的功能包。
主功能,有自己的servvlet- MainServvlet
第八步:使用过虑器验证/jsp/*
这只是第一步,只是验证用户有没有访问的凭证
。认证.
第九步:验证
public class AuthFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//获取uri
HttpServletRequest req = (HttpServletRequest) request;
String uri = req.getRequestURI();//Http://localhost:8080/day20/jsps/role.jsp->day20/jsps/role.jsp
uri = uri.replace(req.getContextPath(), "");
//组成sql
String sql = "SELECT COUNT(1)"+
" FROM menus m INNER JOIN rolemenu rm ON m.id=rm.mid"+
" INNER JOIN roles r ON r.id=rm.rid"+
" INNER JOIN roleuser ru ON r.id=ru.rid"+
" WHERE ru.uid=? AND url=?";
//取到用户的id
User user = (User) req.getSession().getAttribute("user");
try{
QueryRunner run = new QueryRunner(DataSourceUtils.getDatasSource());
Object o = run.query(sql,new ScalarHandler(),user.getId(),uri);
int size = Integer.parseInt(o.toString());
if(size==0){
System.err.println("你没有权限....");
}else{
chain.doFilter(req, response);
}
}catch(Exception e){
}
}
public void destroy() {
// TODO Auto-generated method stub
}
}