JavaWeb 案例——访问权限控制

JavaWeb 案例——访问权限控制

 

一、功能介绍

       每个网站都涉及到访问权限的控制。每个站点资源都需要被管理起来,用户只有具有访问某个资源的特定权限,才能够访问,否则拒绝访问。

二、项目分析

       我们要实现网站的访问权限控制,就应该从 URI 入手,站点的每个资源都用唯一的 URI 描述,我们为想要管理起来的 URI 增加上权限属性,当用户访问资源时我们要先检查用户是否具有权限。这个项目我采用过滤器技术实现权限拦截,下一个项目我将采用注解+动态代理实现权限的拦截。

        我们需要编写一个过滤器,拦截用户的每个访问请求。再依据 URI 判断是否需要权限。这个是比较简单的,关键就是我们如何将这种权限关系描述出来,如果使用过滤器技术,我们就不得不使用数据库来将每个权限、资源等保存起来。一个资源需要一个权限,一个权限对应多个角色,一个角色可以拥有多个权限,一个用户拥有多个角色,一个角色又可以被多个用户引用。所以资源与权限是一对一关系,权限与角色是多对多关系,角色与用户也是多对多关系。因此在数据库我们需要6张表来保存关系。

 

一、对象关系	资源、权限、角色、用户

	资源   	------>		权限		一对多
	权限	    <----->		角色		多对多
	角色   	<----->		用户		多对多
	
	资源:
		String id	编号
		String uri	资源uri
		String description	描述
		Permission permission	该资源需要的权限
		
	权限:
		String id	编号
		String name	权限名
		String description 权限描述
		
	角色:
		String id	编号
		String name	角色名
		String description 角色描述
		Set<Permission> set 该角色具有的权限
		
	用户:
		String id	编号
		String username	用户名
		String password	密码
		Set<Role> set	该用户都具有的角色
		
二、数据库实现

create database if not exists sys_permission;
use sys_permission;

create table if not exists resource(
	id varchar(40) primary key,
	uri varchar(255) unique,
	description varchar(255),
	permission_id varchar(40),
	constraint rPermission_id_FK foreign key(permission_id) references permission(id)
);

create table if not exists permission(
	id varchar(40) primary key,
	name varchar(40) unique,
	description varchar(255)
);

create table if not exists role(
	id varchar(40) primary key,
	name varchar(40) unique,
	description varchar(255)
);

create table if not exists user(
	id varchar(40) primary key,
	username varchar(40) not null unique,
	password varchar(40) not null
);

create table if not exists permission_role(
	permission_id varchar(40) not null,
	role_id varchar(40) not null,
	constraint permission_id_FK foreign key(permission_id) references permission(id),
	constraint role_id_FK foreign key(role_id) references role(id),
	constraint primary key(permission_id,role_id)
);

create table if not exists user_role(
	user_id varchar(40) not null,
	role_id varchar(40) not null,
	constraint user_id_FK foreign key(user_id) references user(id),
	constraint uRole_id_FK foreign key(role_id) references role(id),
	constraint primary key(user_id,role_id)
);


三、项目新技术

       1、采用 sitemesh 框架为每个页面动态增加模版。原理:sitemesh 实际上也是一个过滤器,当用户访问一个页面时,sitemesh 将请求拦截下来,在服务器以后使用 response 写出数据的时候,实际上是写到了代理对象的缓存中,当数据读写完,sitemesh 再对数据进行包装之后再打给浏览器。

         2、采用 windows 命令初始化数据库。我们将数据库的初始化信息写在文件中,当在浏览器访问初始化 Servlet 时,将使用 windows 命令将文件中的数据导入到 mysql 中。

 

package cn.dk.domain;

public class Permission {

	private String id;
	private String name;
	private String description;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final Permission other = (Permission) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

}
package cn.dk.domain;

public class Resource {

	private String id;
	private String uri;
	private String description;
	private Permission permission;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getUri() {
		return uri;
	}

	public void setUri(String uri) {
		this.uri = uri;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public Permission getPermission() {
		return permission;
	}

	public void setPermission(Permission permission) {
		this.permission = permission;
	}
}
package cn.dk.domain;

import java.util.HashSet;
import java.util.Set;

public class Role {

	public Role() {
		super();
		this.permissions = new HashSet<Permission>();
	}

	private String id;
	private String name;
	private String description;
	private Set<Permission> permissions;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public Set<Permission> getPermissions() {
		return permissions;
	}

	public void setPermissions(Set<Permission> permissions) {
		this.permissions = permissions;
	}
}
package cn.dk.domain;

import java.util.HashSet;
import java.util.Set;

public class User {
	
	public User(){
		super();
		this.roles = new HashSet<Role>();
	}

	private String id;
	private String username;
	private String password;
	private Set<Role> roles;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Set<Role> getRoles() {
		return roles;
	}

	public void setRoles(Set<Role> roles) {
		this.roles = roles;
	}
}
package cn.dk.dao;

import java.util.List;

import cn.dk.domain.Permission;

public interface IPermissionDao {

	// 插入新权限
	void insertPermission(Permission permission);

	// 删除权限
	void deletePermission(String id);

	// 根据id查找权限
	Permission findPermissionById(String id);

	// 查找所有权限
	@SuppressWarnings("unchecked")
	List<Permission> findAllPermission();

}
package cn.dk.dao;

import java.util.List;

import cn.dk.domain.Resource;

public interface IResourceDao {

	// 增加资源
	void insertResource(Resource resource);

	// 修改资源
	void updateResource(Resource resource);

	// 查找所有资源
	@SuppressWarnings("unchecked")
	List<Resource> findAllResource();

	// 根据uri查找资源
	Resource findResourceByURI(String uri);

	// 根据id查找资源
	Resource findResourceById(String id);

	// 删除资源
	void deleteResource(String id);

}
package cn.dk.dao;

import java.util.List;
import cn.dk.domain.Role;

public interface IRoleDao {

	// 新增角色
	void insertRole(Role role);

	// 更新角色
	void updateRole(Role role);

	// 删除角色
	void deleteRole(String id);

	// 根据id查找角色
	@SuppressWarnings("unchecked")
	Role findRoleById(String id);

	// 查找所有角色
	@SuppressWarnings("unchecked")
	List<Role> fineAllRole();

}
package cn.dk.dao;

import java.util.List;
import cn.dk.domain.User;

public interface IUserDao {

	// 插入用户
	void insertUser(User user);

	// 更新用户
	void updateUser(User user);

	// 删除用户
	void deleteUser(String id);

	// 根据id查找用户
	@SuppressWarnings("unchecked")
	User findUserById(String id);

	// 查找所有用户
	@SuppressWarnings("unchecked")
	List<User> findAllUser();
	
	User login(String username, String password);
}
package cn.dk.dao.impl;

import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import cn.dk.dao.IPermissionDao;
import cn.dk.domain.Permission;
import cn.dk.utils.DBUtils;

public class PermissionDaoImpl implements IPermissionDao {

	// 插入新权限
	public void insertPermission(Permission permission) {
		QueryRunner runner = new QueryRunner(DBUtils.getDataSource());
		String sql = "insert into permission (id,name,description) values(?,?,?)";
		Object[] params = { permission.getId(), permission.getName(),
				permission.getDescription() };
		try {
			runner.update(sql, params);
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	// 删除权限
	public void deletePermission(String id) {
		QueryRunner runer = new QueryRunner(DBUtils.getDataSource());
		String sql = "update resource set permission_id=null where permission_id=?";
		try {
			runer.update(sql, id);
			sql = "delete from permission where id=?";
			runer.update(sql, id);
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	// 根据id查找权限
	public Permission findPermissionById(String id) {
		QueryRunner runer = new QueryRunner(DBUtils.getDataSource());
		String sql = "select id,name,description from permission where id=?";
		Object[] params = { id };
		try {
			return (Permission) runer.query(sql, new BeanHandler(
					Permission.class), params);
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	// 查找所有权限
	@SuppressWarnings("unchecked")
	public List<Permission> findAllPermission() {
		List<Permission> list = null;
		QueryRunner runer = new QueryRunner(DBUtils.getDataSource());
		String sql = "select id,name,description from permission";
		try {
			list = (List<Permission>) runer.query(sql, new BeanListHandler(
					Permission.class));
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
		return list;
	}
}
package cn.dk.dao.impl;

import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import cn.dk.dao.IResourceDao;
import cn.dk.domain.Permission;
import cn.dk.domain.Resource;
import cn.dk.utils.DBUtils;

public class ResourceDaoImpl implements IResourceDao {

	// 增加资源
	public void insertResource(Resource resource) {
		QueryRunner runner = new QueryRunner(DBUtils.getDataSource());
		String sql = "insert into resource (id,uri,description,permission_id) values(?,?,?,?)";
		Object[] params = { resource.getId(), resource.getUri(),
				resource.getDescription(), resource.getPermission().getId() };
		try {
			runner.update(sql, params);
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	// 修改资源
	public void updateResource(Resource resource) {
		QueryRunner runner = new QueryRunner(DBUtils.getDataSource());
		String sql = "update resource set uri=?,description=?,permission_id=? where id=?";
		Object[] params = { resource.getUri(), resource.getDescription(),
				resource.getPermission().getId(), resource.getId() };
		try {
			runner.update(sql, params);
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	// 查找所有资源
	@SuppressWarnings("unchecked")
	public List<Resource> findAllResource() {
		List<Resource> list = null;
		QueryRunner runner = new QueryRunner(DBUtils.getDataSource());
		String sql = "select id,uri,description from resource";
		try {
			list = (List<Resource>) runner.query(sql, new BeanListHandler(
					Resource.class));
			for (Resource resource : list) {
				sql = "select p.id,p.name,p.description from permission p,resource r where r.permission_id=p.id and r.id=?";
				Object[] params = { resource.getId() };
				Permission permission = (Permission) runner.query(sql,
						new BeanHandler(Permission.class), params);
				resource.setPermission(permission);
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
		return list;
	}

	// 根据uri查找资源
	public Resource findResourceByURI(String uri) {
		QueryRunner runner = new QueryRunner(DBUtils.getDataSource());
		String sql = "select id,uri,description from resource where uri=?";
		Object[] params = { uri };
		try {
			Resource resource = (Resource) runner.query(sql, new BeanHandler(
					Resource.class), params);
			if (resource == null)
				return null;
			sql = "select p.id,p.name,p.description from permission p,resource r where r.permission_id=p.id and r.id=?";
			params = new Object[] { resource.getId() };
			Permission permission = (Permission) runner.query(sql,
					new BeanHandler(Permission.class), params);
			resource.setPermission(permission);
			return resource;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	// 根据id查找资源
	public Resource findResourceById(String id) {
		QueryRunner runner = new QueryRunner(DBUtils.getDataSource());
		String sql = "select id,uri,description from resource where id=?";
		Object[] params = { id };
		try {
			Resource resource = (Resource) runner.query(sql, new BeanHandler(
					Resource.class), params);
			sql = "select p.id,p.name,p.description from permission p,resource r where r.permission_id=p.id and r.id=?";
			params = new Object[] { resource.getId() };
			Permission permission = (Permission) runner.query(sql,
					new BeanHandler(Permission.class), params);
			resource.setPermission(permission);
			return resource;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	// 删除资源
	public void deleteResource(String id) {
		QueryRunner runner = new QueryRunner(DBUtils.getDataSource());
		String sql = "delete from resource where id=?";
		Object[] params = { id };
		try {
			runner.update(sql, params);
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}
package cn.dk.dao.impl;

import java.sql.SQLException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import cn.dk.dao.IRoleDao;
import cn.dk.domain.Permission;
import cn.dk.domain.Role;
import cn.dk.utils.DBUtils;

public class RoleDaoImpl implements IRoleDao {

	// 新增角色
	public void insertRole(Role role) {
		QueryRunner runner = new QueryRunner(DBUtils.getDataSource());
		String sql = "insert into role (id,name,description) values(?,?,?)";
		Object[] params = { role.getId(), role.getName(), role.getDescription() };
		try {
			runner.update(sql, params);
			sql = "insert into permission_role (permission_id,role_id) values(?,?)";
			Set<Permission> set = role.getPermissions();
			for (Permission permission : set) {
				params = new Object[] { permission.getId(), role.getId() };
				runner.update(sql, params);
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	// 更新角色
	public void updateRole(Role role) {
		QueryRunner runner = new QueryRunner(DBUtils.getDataSource());
		Set<Permission> set = role.getPermissions();
		String sql = "delete from permission_role where role_id=?";
		try {
			runner.update(sql, role.getId());
			sql = "update role set name=?,description=? where id=?";
			Object[] params = { role.getName(), role.getDescription(),
					role.getId() };
			runner.update(sql, params);
			sql = "insert into permission_role (permission_id,role_id) values(?,?)";
			for (Permission permission : set) {
				params = new Object[] { permission.getId(), role.getId() };
				runner.update(sql, params);
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	// 删除角色
	public void deleteRole(String id) {
		QueryRunner runner = new QueryRunner(DBUtils.getDataSource());
		String sql = "delete from permission_role where role_id=?";
		try {
			runner.update(sql, id);
			sql = "delete from role where id=?";
			runner.update(sql, id);
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	// 根据id查找角色
	@SuppressWarnings("unchecked")
	public Role findRoleById(String id) {
		QueryRunner runner = new QueryRunner(DBUtils.getDataSource());
		String sql = "select id,name,description from role where id=?";
		Object[] params = { id };
		try {
			Role role = (Role) runner.query(sql, new BeanHandler(Role.class),
					params);
			sql = "select p.id,p.name,p.description from permission p,permission_role pr where p.id=pr.permission_id and pr.role_id=?";
			params = new Object[] { id };
			Set<Permission> set = new HashSet<Permission>();
			set.addAll((List<Permission>) runner.query(sql,
					new BeanListHandler(Permission.class), params));
			role.setPermissions(set);
			return role;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	// 查找所有角色
	@SuppressWarnings("unchecked")
	public List<Role> fineAllRole() {
		List<Role> list = null;
		QueryRunner runner = new QueryRunner(DBUtils.getDataSource());
		String sql = "select id,name,description from role";
		try {
			list = (List<Role>) runner.query(sql, new BeanListHandler(
					Role.class));
			sql = "select p.id,p.name,p.description from permission p,permission_role pr where p.id=pr.permission_id and pr.role_id=?";
			for (Role role : list) {
				Object[] params = new Object[] { role.getId() };
				Set<Permission> set = new HashSet<Permission>();
				set.addAll((List<Permission>) runner.query(sql,
						new BeanListHandler(Permission.class), params));
				role.setPermissions(set);
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
		return list;
	}
}
package cn.dk.dao.impl;

import java.sql.SQLException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import cn.dk.dao.IUserDao;
import cn.dk.domain.Role;
import cn.dk.domain.User;
import cn.dk.utils.DBUtils;

public class UserDaoImpl implements IUserDao {

	// 插入用户
	public void insertUser(User user) {
		QueryRunner runner = new QueryRunner(DBUtils.getDataSource());
		String sql = "insert into user (id,username,password) values(?,?,?)";
		Object[] params = { user.getId(), user.getUsername(),
				user.getPassword() };
		try {
			runner.update(sql, params);
			Set<Role> roles = user.getRoles();
			sql = "insert into user_role (user_id,role_id) values(?,?)";
			for (Role role : roles) {
				params = new Object[] { user.getId(), role.getId() };
				runner.update(sql, params);
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	// 更新用户
	public void updateUser(User user) {
		QueryRunner runner = new QueryRunner(DBUtils.getDataSource());
		String sql = "delete from user_role where user_id=?";
		try {
			runner.update(sql, user.getId());
			sql = "update user set username=?,password=? where id=?";
			Object[] params = { user.getUsername(), user.getPassword(),
					user.getId() };
			runner.update(sql, params);
			sql = "insert into user_role (user_id,role_id) values(?,?)";
			Set<Role> roles = user.getRoles();
			for (Role role : roles) {
				params = new Object[] { user.getId(), role.getId() };
				runner.update(sql, params);
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	// 删除用户
	public void deleteUser(String id) {
		QueryRunner runner = new QueryRunner(DBUtils.getDataSource());
		String sql = "delete from user_role where user_id=?";
		try {
			runner.update(sql, id);
			sql = "delete from user where id=?";
			runner.update(sql, id);
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	// 根据id查找用户
	@SuppressWarnings("unchecked")
	public User findUserById(String id) {
		QueryRunner runner = new QueryRunner(DBUtils.getDataSource());
		String sql = "select id,username,password from user where id=?";
		Object[] params = { id };
		try {
			User user = (User) runner.query(sql, new BeanHandler(User.class),
					params);
			sql = "select r.id,r.name,r.description from role r,user_role ur where r.id=ur.role_id and ur.user_id=?";
			params = new Object[] { id };
			List<Role> list = (List<Role>) runner.query(sql,
					new BeanListHandler(Role.class), params);
			Set<Role> set = new HashSet<Role>();
			set.addAll(list);
			user.setRoles(set);
			return user;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	// 查找所有用户
	@SuppressWarnings("unchecked")
	public List<User> findAllUser() {
		List<User> list = null;
		QueryRunner runner = new QueryRunner(DBUtils.getDataSource());
		String sql = "select id,username,password from user";
		try {
			list = (List<User>) runner.query(sql, new BeanListHandler(
					User.class));
			sql = "select r.id,r.name,r.description from role r,user_role ur where r.id=ur.role_id and ur.user_id=?";
			for (User user : list) {
				Object[] params = new Object[] { user.getId() };
				Set<Role> set = new HashSet<Role>();
				set.addAll((List<Role>) runner.query(sql, new BeanListHandler(
						Role.class), params));
				user.setRoles(set);
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
		return list;
	}

	// 用户登录
	@SuppressWarnings("unchecked")
	public User login(String username, String password) {
		User user = null;
		QueryRunner runner = new QueryRunner(DBUtils.getDataSource());
		String sql = "select id,username,password from user where username=? and password=?";
		Object[] params = { username, password };
		try {
			user = (User) runner
					.query(sql, new BeanHandler(User.class), params);
			if (user != null) {
				sql = "select r.id,r.name,r.description from role r, user_role ur where r.id=ur.role_id and ur.user_id=?";
				params = new Object[] { user.getId() };
				Set<Role> set = new HashSet<Role>();
				set.addAll((List<Role>) runner.query(sql, new BeanListHandler(
						Role.class), params));
				user.setRoles(set);
			}
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
		return user;
	}
}
package cn.dk.factory;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class DaoFactory {

	private static DaoFactory factory = new DaoFactory();
	private static Properties properties;

	private DaoFactory() {
		InputStream inputStream = DaoFactory.class.getClassLoader()
				.getResourceAsStream("daoFactory.properties");
		try {
			properties = new Properties();
			properties.load(inputStream);
		} catch (IOException e) {
			throw new ExceptionInInitializerError(e);
		}
	}

	public static DaoFactory newInstance() {
		return factory;
	}

	@SuppressWarnings("unchecked")
	public <T> T getDao(Class<T> clazz) {
		String simpleName = clazz.getSimpleName();
		String className = properties.getProperty(simpleName);
		try {
			return (T) Class.forName(className).newInstance();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}
package cn.dk.service;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class InitialService {

	// 系统初始化
	public String initial() throws Exception {
		String filePath = InitialService.class.getClassLoader().getResource(
				"init.sql").getPath();
		filePath = filePath.substring(1);
		String command = "cmd /c mysql -uroot -proot<" + filePath;
		Process process = Runtime.getRuntime().exec(command);
		InputStream errorStream = process.getErrorStream();
		BufferedReader br = new BufferedReader(new InputStreamReader(
				errorStream));
		char[] chars = new char[1024];
		int len = 0;
		StringBuffer sb = new StringBuffer();
		while ((len = br.read(chars)) != -1) {
			sb.append(chars, 0, len);
		}
		if (sb.length() > 0)
			return sb.insert(0, "初始化失败,原因:").toString();
		else
			return "初始化成功";
	}
}
package cn.dk.service;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import cn.dk.dao.IPermissionDao;
import cn.dk.dao.IResourceDao;
import cn.dk.dao.IRoleDao;
import cn.dk.dao.IUserDao;
import cn.dk.domain.Permission;
import cn.dk.domain.Resource;
import cn.dk.domain.Role;
import cn.dk.domain.User;
import cn.dk.factory.DaoFactory;

public class Service {

	private DaoFactory factory = DaoFactory.newInstance();
	private IPermissionDao permissionDao = factory.getDao(IPermissionDao.class);
	private IResourceDao resourceDao = factory.getDao(IResourceDao.class);
	private IRoleDao roleDao = factory.getDao(IRoleDao.class);
	private IUserDao userDao = factory.getDao(IUserDao.class);

	// 权限
	public void insertPermission(Permission permission) {
		permission.setId(UUID.randomUUID().toString());
		permissionDao.insertPermission(permission);
	}

	public void deletePermission(String id) {
		permissionDao.deletePermission(id);
	}

	public Permission findPermissionById(String id) {
		return permissionDao.findPermissionById(id);
	}

	public List<Permission> findAllPermission() {
		return permissionDao.findAllPermission();
	}

	// 资源
	public void insertResource(Resource resource, String permissionId) {
		Permission permission = findPermissionById(permissionId);
		resource.setPermission(permission);
		resource.setId(UUID.randomUUID().toString());
		resourceDao.insertResource(resource);
	}

	public void updateResource(Resource resource, String permissionId) {
		Permission permission = findPermissionById(permissionId);
		resource.setPermission(permission);
		resourceDao.updateResource(resource);
	}

	public List<Resource> findAllResource() {
		return resourceDao.findAllResource();
	}

	public Resource findResourceByURI(String uri) {
		return resourceDao.findResourceByURI(uri);
	}

	public Resource findResourceById(String id) {
		return resourceDao.findResourceById(id);
	}

	public void deleteResource(String id) {
		resourceDao.deleteResource(id);
	}

	// 角色
	public void insertRole(Role role, String[] permissionId) {
		Set<Permission> permissions = new HashSet<Permission>();
		for (int i = 0; permissionId != null && i < permissionId.length; i++) {
			Permission permission = findPermissionById(permissionId[i]);
			permissions.add(permission);
		}
		role.setPermissions(permissions);
		role.setId(UUID.randomUUID().toString());
		roleDao.insertRole(role);
	}

	public void updateRole(Role role, String[] permissionId) {
		Set<Permission> permissions = new HashSet<Permission>();
		for (int i = 0; permissionId != null && i < permissionId.length; i++) {
			Permission permission = findPermissionById(permissionId[i]);
			permissions.add(permission);
		}
		role.setPermissions(permissions);
		roleDao.updateRole(role);
	}

	public void deleteRole(String id) {
		roleDao.deleteRole(id);
	}

	public Role findRoleById(String id) {
		return roleDao.findRoleById(id);
	}

	public List<Role> fineAllRole() {
		return roleDao.fineAllRole();
	}

	// 用户
	public void insertUser(User user, String[] roleId) {
		Set<Role> roles = new HashSet<Role>();
		for (int i = 0; roleId != null && i < roleId.length; i++) {
			Role role = roleDao.findRoleById(roleId[i]);
			roles.add(role);
		}
		user.setRoles(roles);
		user.setId(UUID.randomUUID().toString());
		userDao.insertUser(user);
	}

	public void updateUser(User user, String[] roleId) {
		user.setUsername(findUserById(user.getId()).getUsername());
		user.setPassword(findUserById(user.getId()).getPassword());
		Set<Role> roles = new HashSet<Role>();
		for (int i = 0; roleId != null && i < roleId.length; i++) {
			Role role = roleDao.findRoleById(roleId[i]);
			roles.add(role);
		}
		user.setRoles(roles);
		userDao.updateUser(user);
	}

	public void deleteUser(String id) {
		userDao.deleteUser(id);
	}

	public User findUserById(String id) {
		return userDao.findUserById(id);
	}

	public List<User> findAllUser() {
		return userDao.findAllUser();
	}

	public User login(String username, String password) {
		return userDao.login(username, password);
	}

	public List<Permission> getUserPermission(User user) {
		List<Permission> list = new ArrayList<Permission>();
		Set<Role> roles = user.getRoles();
		for (Role role : roles) {
			list.addAll(findRoleById(role.getId()).getPermissions());
		}
		return list;
	}
}
package cn.dk.utils;

import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;

public class CopyBean {

	public static void Copy(Object bean, Map<String, String> properties){
		try {
			BeanUtils.populate(bean, properties);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}
package cn.dk.utils;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DBUtils {

	private static ComboPooledDataSource source;

	static {
		source = new ComboPooledDataSource("mysql");
	}

	public static ComboPooledDataSource getDataSource() {
		return source;
	}
}
package cn.dk.web.manager;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class ManagerServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.getRequestDispatcher("/WEB-INF/manager/manager.jsp").forward(
				request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}
package cn.dk.web.manager;

import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.dk.domain.Permission;
import cn.dk.service.Service;
import cn.dk.utils.CopyBean;

@SuppressWarnings("serial")
public class PermissionServlet extends HttpServlet {

	private Service service = new Service();

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String method = request.getParameter("method");
		if (method.equals("showAllpermissoin"))
			showAllpermissoin(request, response);
		else if (method.equals("showInsertPermission"))
			showInsertPermission(request, response);
		else if (method.equals("insertPsermission"))
			insertPsermission(request, response);
		else if (method.equals("deletePermission"))
			deletePermission(request, response);
	}

	private void deletePermission(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String permissionId = request.getParameter("id");
		try {
			service.deletePermission(permissionId);
			request.setAttribute("message", "删除权限成功");
		} catch (RuntimeException e) {
			request.setAttribute("message", "删除权限失败");
		}
		request.getRequestDispatcher("/WEB-INF/message/message.jsp").forward(
				request, response);
	}

	@SuppressWarnings("unchecked")
	private void insertPsermission(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		Permission permission = new Permission();
		try {
			CopyBean.Copy(permission, request.getParameterMap());
			service.insertPermission(permission);
			request.setAttribute("message", "添加权限成功");
		} catch (RuntimeException e) {
			request.setAttribute("message", "添加权限失败");
		}
		request.getRequestDispatcher("/WEB-INF/message/message.jsp").forward(
				request, response);
	}

	private void showInsertPermission(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher("/WEB-INF/manager/addPermission.jsp")
				.forward(request, response);
	}

	private void showAllpermissoin(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		List<Permission> permission = service.findAllPermission();
		request.setAttribute("permission", permission);
		request.getRequestDispatcher("/WEB-INF/manager/permissionlist.jsp")
				.forward(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
package cn.dk.web.manager;

import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.dk.domain.Permission;
import cn.dk.domain.Resource;
import cn.dk.service.Service;
import cn.dk.utils.CopyBean;

@SuppressWarnings("serial")
public class ResourceServlet extends HttpServlet {

	private Service service = new Service();

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String method = request.getParameter("method");
		if (method.equals("showAllresource"))
			showAllresource(request, response);
		else if (method.equals("showInsertResource"))
			showInsertResource(request, response);
		else if (method.equals("insertResource"))
			insertResource(request, response);
		else if (method.equals("showUpdateResource"))
			showUpdateResource(request, response);
		else if (method.equals("updateResource"))
			updateResource(request, response);
		else if (method.equals("deleteResource"))
			deleteResource(request, response);
	}

	private void deleteResource(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String id = request.getParameter("id");
		try {
			service.deleteResource(id);
			request.setAttribute("message", "删除资源成功");
		} catch (RuntimeException e) {
			request.setAttribute("message", "删除资源失败");
		}
		request.getRequestDispatcher("/WEB-INF/message/message.jsp").forward(
				request, response);
	}

	@SuppressWarnings("unchecked")
	private void updateResource(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		Resource resource = new Resource();
		try {
			CopyBean.Copy(resource, request.getParameterMap());
			String permissionId = request.getParameter("pid");
			service.updateResource(resource, permissionId);
			request.setAttribute("message", "修改资源成功");
		} catch (RuntimeException e) {
			request.setAttribute("message", "修改资源失败,原因:" + e.getMessage());
		}
		request.getRequestDispatcher("/WEB-INF/message/message.jsp").forward(
				request, response);
	}

	private void showUpdateResource(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		List<Permission> permission = service.findAllPermission();
		String resourceId = request.getParameter("id");
		Resource resource = service.findResourceById(resourceId);
		request.setAttribute("permission", permission);
		request.setAttribute("resource", resource);
		request.getRequestDispatcher("/WEB-INF/manager/updateResource.jsp")
				.forward(request, response);
	}

	@SuppressWarnings("unchecked")
	private void insertResource(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		try {
			Resource resource = new Resource();
			CopyBean.Copy(resource, request.getParameterMap());
			String permissionId = request.getParameter("pid");
			service.insertResource(resource, permissionId);
			request.setAttribute("message", "添加资源成功");
		} catch (RuntimeException e) {
			request.setAttribute("message", "添加资源失败");
		}
		request.getRequestDispatcher("/WEB-INF/message/message.jsp").forward(
				request, response);
	}

	private void showInsertResource(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		List<Permission> permission = service.findAllPermission();
		request.setAttribute("permission", permission);
		request.getRequestDispatcher("/WEB-INF/manager/addResource.jsp")
				.forward(request, response);
	}

	private void showAllresource(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		List<Resource> resources = service.findAllResource();
		request.setAttribute("resources", resources);
		request.getRequestDispatcher("/WEB-INF/manager/resourcelist.jsp")
				.forward(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
package cn.dk.web.manager;

import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.dk.domain.Permission;
import cn.dk.domain.Role;
import cn.dk.service.Service;
import cn.dk.utils.CopyBean;

@SuppressWarnings("serial")
public class RoleServlet extends HttpServlet {

	private Service service = new Service();

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String method = request.getParameter("method");
		if (method.equals("showAllRole"))
			showAllRole(request, response);
		else if (method.equals("showInsertRole"))
			showInsertRole(request, response);
		else if (method.equals("insertRole"))
			insertRole(request, response);
		else if (method.equals("showUpdateRole"))
			showUpdateRole(request, response);
		else if (method.equals("updateRole"))
			updateRole(request, response);
		else if (method.equals("deleteRole"))
			deleteRole(request, response);
	}

	private void deleteRole(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String roleId = request.getParameter("id");
		try {
			service.deleteRole(roleId);
			request.setAttribute("message", "删除角色成功");
		} catch (RuntimeException e) {
			request.setAttribute("message", "删除角色失败,原因:" + e.getMessage());
		}
		request.getRequestDispatcher("/WEB-INF/message/message.jsp").forward(
				request, response);
	}

	@SuppressWarnings("unchecked")
	private void updateRole(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		Role role = new Role();
		try {
			CopyBean.Copy(role, request.getParameterMap());
			String[] permissionId = request.getParameterValues("pid");
			service.updateRole(role, permissionId);
			request.setAttribute("message", "修改角色成功");
		} catch (RuntimeException e) {
			request.setAttribute("message", "修改角色失败,原因:" + e.getMessage());
		}
		request.getRequestDispatcher("/WEB-INF/message/message.jsp").forward(
				request, response);
	}

	private void showUpdateRole(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String roleId = request.getParameter("id");
		Role role = service.findRoleById(roleId);
		List<Permission> permission = service.findAllPermission();
		request.setAttribute("role", role);
		request.setAttribute("permission", permission);
		request.getRequestDispatcher("/WEB-INF/manager/updateRole.jsp")
				.forward(request, response);
	}

	@SuppressWarnings("unchecked")
	private void insertRole(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		Role role = new Role();
		try {
			CopyBean.Copy(role, request.getParameterMap());
			service.insertRole(role, null);
			request.setAttribute("message", "添加角色成功");
		} catch (RuntimeException e) {
			request.setAttribute("message", "添加角色失败,原因:" + e.getMessage());
		}
		request.getRequestDispatcher("/WEB-INF/message/message.jsp").forward(
				request, response);
	}

	private void showInsertRole(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher("/WEB-INF/manager/addRole.jsp").forward(
				request, response);
	}

	private void showAllRole(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		List<Role> role = service.fineAllRole();
		request.setAttribute("role", role);
		request.getRequestDispatcher("/WEB-INF/manager/rolelist.jsp").forward(
				request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}
package cn.dk.web.manager;

import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.dk.domain.Role;
import cn.dk.domain.User;
import cn.dk.service.Service;
import cn.dk.utils.CopyBean;

@SuppressWarnings("serial")
public class UserServlet extends HttpServlet {

	private Service service = new Service();

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String method = request.getParameter("method");
		if (method.equals("showAllUser"))
			showAllUser(request, response);
		else if (method.equals("showInsertUser"))
			showInsertUser(request, response);
		else if (method.equals("addUser"))
			addUser(request, response);
		else if (method.equals("showUpdateUser"))
			showUpdateUser(request, response);
		else if (method.equals("updateUser"))
			updateUser(request, response);
		else if (method.equals("deleteUser"))
			deleteUser(request, response);
	}

	private void deleteUser(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String userId = request.getParameter("id");
		try {
			service.deleteUser(userId);
			request.setAttribute("message", "删除用户成功");
		} catch (RuntimeException e) {
			request.setAttribute("message", "删除用户失败");
		}
		request.getRequestDispatcher("/WEB-INF/message/message.jsp").forward(
				request, response);
	}

	@SuppressWarnings("unchecked")
	private void updateUser(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		User user = new User();
		try {
			CopyBean.Copy(user, request.getParameterMap());
			String[] roleId = request.getParameterValues("rid");
			service.updateUser(user, roleId);
			request.setAttribute("message", "修改用户成功");
		} catch (RuntimeException e) {
			request.setAttribute("message", "修改用户失败,原因:" + e.getMessage());
		}
		request.getRequestDispatcher("/WEB-INF/message/message.jsp").forward(
				request, response);
	}

	private void showUpdateUser(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String userId = request.getParameter("id");
		User user = service.findUserById(userId);
		List<Role> role = service.fineAllRole();
		request.setAttribute("user", user);
		request.setAttribute("role", role);
		request.getRequestDispatcher("/WEB-INF/manager/updateUser.jsp")
				.forward(request, response);
	}

	@SuppressWarnings("unchecked")
	private void addUser(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		User user = new User();
		try {
			CopyBean.Copy(user, request.getParameterMap());
			service.insertUser(user, null);
			request.setAttribute("message", "添加用户成功");
		} catch (RuntimeException e) {
			request.setAttribute("message", "添加用户失败,原因:" + e.getMessage());
		}
		request.getRequestDispatcher("/WEB-INF/message/message.jsp").forward(
				request, response);
	}

	private void showInsertUser(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher("/WEB-INF/manager/addUser.jsp").forward(
				request, response);
	}

	private void showAllUser(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		List<User> user = service.findAllUser();
		request.setAttribute("user", user);
		request.getRequestDispatcher("/WEB-INF/manager/userlist.jsp").forward(
				request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
package cn.dk.web;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.dk.service.InitialService;

@SuppressWarnings("serial")
public class InitialServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		InitialService iniService = new InitialService();
		String message = null;
		try {
			message = iniService.initial();
			request.setAttribute("message", message);
		} catch (Exception e) {
			request.setAttribute("message", message);
		}
		request.getRequestDispatcher("/WEB-INF/message/message.jsp").forward(
				request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}
package cn.dk.web;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.dk.domain.User;
import cn.dk.service.Service;

@SuppressWarnings("serial")
public class Welcome extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.getRequestDispatcher("/login/login.jsp").forward(request,
				response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Service service = new Service();
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		User user = service.login(username, password);
		if (user != null) {
			request.getSession().setAttribute("user", user);
			response.sendRedirect(request.getContextPath() + "/index.jsp");
		} else {
			request.setAttribute("message", "用户名密码错误");
			request.getRequestDispatcher("/WEB-INF/message/message.jsp")
					.forward(request, response);
		}
	}
}
<%@ page language="java" pageEncoding="UTF-8"%>
<%@taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="sitemesh-decorator"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title><sitemesh-decorator:title /></title>
		
		<style type="text/css">
	   		body{
	   			margin: 0px;
	   			padding: 0px;
	   			text-align: center;
	   		}
	   		#container{
	   				width: 980px;
	   				border: 1px solid gray;
	   		}
	   		#top{
	   			border-bottom: 1px solid gray;
	   		}
	   		#left{
	   			float: left;
	   			width: 150px;
	   			border-right: 1px solid gray;
	   		}
	   		#main{
	   			float: left;
	   			padding: 40px 0px 0px 40px;
	   		}
  		 </style>
	</head>

	<body>
		<br/><br/><br/>
		<div id="container">
	    	<div id="top">
	    		<h2>中浩集团网站后台管理系统</h2>
	    	</div>
	    	<div id="left">
	    		<br/><br/><br/>
	    		<a href="${pageContext.request.contextPath }/servlet/manager/ResourceServlet?method=showAllresource">资源管理</a><br/><br/><br/>
	    		<a href="${pageContext.request.contextPath }/servlet/manager/PermissionServlet?method=showAllpermissoin">权限管理</a><br/><br/><br/>
	    		<a href="${pageContext.request.contextPath }/servlet/manager/RoleServlet?method=showAllRole">角色管理</a><br/><br/><br/>
	    		<a href="${pageContext.request.contextPath }/servlet/manager/UserServlet?method=showAllUser">用户管理</a><br/><br/><br/>
	    	</div>
	    	<div id="main">
	    		<sitemesh-decorator:body></sitemesh-decorator:body>
	    	</div>
    	</div>
	</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>登录页面</title>
  </head>
  
  <body>
    <form action="${pageContext.request.contextPath }/Welcome" method="post">
    	用户名:<input type="text" name="username"><br>
    	密码:<input type="password" name="password"><br>
    	<input type="submit" value="登录">
    </form>
  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>添加权限</title>
  </head>
  
  <body>
    <form action="${pageContext.request.contextPath }/servlet/manager/PermissionServlet?method=insertPsermission" method="post">
    <table>
    	<tr>
    		<td>权限名称</td>
    		<td>
    			<input type="text" name="name">
    		</td>
    	</tr>
    	
    	<tr>
    		<td>权限描述</td>
    		<td>
    			<textarea rows="3" cols="50" name="description"></textarea>
    		</td>
    	</tr>
    	
    	<tr>
    		<td></td>
    		<td>
    			<input type="submit" value="添加权限">
    		</td>
    	</tr>
    </table>
    </form>
  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>添加资额</title>
  </head>
  
  <body>
    <form action="${pageContext.request.contextPath }/servlet/manager/ResourceServlet?method=insertResource" method="post">
    <table>
    	<tr>
    		<td>资源uri</td>
    		<td>
    			<input type="text" name="uri">
    		</td>
    	</tr>
    	<tr>
    		<td>资源描述</td>
    		<td>
    			<textarea rows="3" cols="50" name="description"></textarea>
    		</td>
    	</tr>
    	<tr>
    		<td>资源控制权限</td>
    		<td>
    			<c:forEach var="p" items="${requestScope.permission}">
					<input type="radio" name="pid" value="${p.id }">${p.name }  
    			</c:forEach>
    		</td>
    	</tr>
    	<tr>
    		<td></td>
    		<td>
    			<input type="submit" value="添加资源">
    		</td>
    	</tr>
    </table>
    </form>
  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>添加角色</title>
  </head>
  
  <body>
    <form action="${pageContext.request.contextPath }/servlet/manager/RoleServlet?method=insertRole" method="post">
    <table>
    	<tr>
    		<td>角色名称</td>
    		<td>
    			<input type="text" name="name">
    		</td>
    	</tr>
    	<tr>
    		<td>角色描述</td>
    		<td>
    			<textarea rows="3" cols="50" name="description"></textarea>
    		</td>
    	</tr>
    	<tr>
    		<td></td>
    		<td>
    			<input type="submit" value="添加角色">
    		</td>
    	</tr>
    </table>
    </form>
  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>添加用户</title>
  </head>
  
  <body>
     <form action="${pageContext.request.contextPath }/servlet/manager/UserServlet?method=addUser" method="post">
    <table>
    	<tr>
    		<td>用户名称</td>
    		<td>
    			<input type="text" name="username">
    		</td>
    	</tr>
    	<tr>
    		<td>用户密码</td>
    		<td>
    			<input type="password" name="password">
    		</td>
    	</tr>
    	<tr>
    		<td></td>
    		<td>
    			<input type="submit" value="添加用户">
    		</td>
    	</tr>
    </table>
    </form>
  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>权限列表</title>
  </head>
  
  <body>
     <table width="90%">
    	<tr>
    		<td align="right">
    			<a href="${pageContext.request.contextPath }/servlet/manager/PermissionServlet?method=showInsertPermission">添加权限</a>
    		</td>
    	</tr>
    </table>
    
    <table frame="border" width="90%">
    	<tr>
    		<td>权限名称</td>
    		<td>权限描述</td>
    		<td>操作</td>
    	</tr>
    	
    	<c:forEach var="p" items="${requestScope.permission}">
    		<tr>
	    		<td>${p.name }</td>
	    		<td>${p.description }</td>
	    		<td>
	    			<a href="${pageContext.request.contextPath }/servlet/manager/PermissionServlet?method=deletePermission&id=${p.id }">删除</a>
	    		</td>
    		</tr>
    	</c:forEach>
    
    </table>
  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>资源管理</title>
  </head>
  
  <body>
     <table width="90%">
    	<tr>
    		<td align="right">
    			<a href="${pageContext.request.contextPath }/servlet/manager/ResourceServlet?method=showInsertResource">添加资源</a>
    		</td>
    	</tr>
    </table>
    <table frame="border" width="90%">
    	<tr>
    		<td>资源URI</td>
    		<td>资源描述</td>
    		<td>管理资源的权限</td>
    		<td>操作</td>
    	</tr>
    	<c:forEach var="resource" items="${requestScope.resources}">
    		<tr>
	    		<td>${resource.uri }</td>
	    		<td>${resource.description }</td>
	    		<td>${resource.permission.name }</td>
	    		<td>
	    			<a href="${pageContext.request.contextPath }/servlet/manager/ResourceServlet?method=showUpdateResource&id=${resource.id }">分配权限</a>
	    			<a href="${pageContext.request.contextPath }/servlet/manager/ResourceServlet?method=deleteResource&id=${resource.id }">删除</a>
	    		</td>
    		</tr>
    	</c:forEach>
    </table>
  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'rolelist.jsp' starting page</title>
  </head>
  
  <body>
      <table width="90%">
    	<tr>
    		<td align="right">
    			<a href="${pageContext.request.contextPath }/servlet/manager/RoleServlet?method=showInsertRole">添加角色</a>
    		</td>
    	</tr>
    </table>
    
    <table frame="border" width="90%">
    	<tr>
    		<td>角色名称</td>
    		<td>角色描述</td>
    		<td>角色拥有的权限</td>
    		<td>操作</td>
    	</tr>
    	<c:forEach var="r" items="${role}">
    		<tr>
	    		<td>${r.name }</td>
	    		<td>${r.description }</td>
	    		<td>
	    			<c:forEach var="p" items="${r.permissions}">
	    				${p.name }
	    			</c:forEach>
	    		</td>
	    		<td>
	    			<a href="${pageContext.request.contextPath }/servlet/manager/RoleServlet?method=showUpdateRole&id=${r.id }">分配权限</a>
	    			<a href="${pageContext.request.contextPath }/servlet/manager/RoleServlet?method=deleteRole&id=${r.id }">删除</a>
	    		</td>
    		</tr>
    	</c:forEach>
    
    </table>
  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>分配权限</title>
  </head>
  
  <body>
    <form action="${pageContext.request.contextPath }/servlet/manager/ResourceServlet?method=updateResource" method="post">
    <table>
    	<tr>
    		<td>资源uri</td>
    		<td>
    			<input type="text" name="uri" value="${requestScope.resource.uri }">
    		</td>
    	</tr>
    	<tr>
    		<td>资源描述</td>
    		<td>
    			<textarea rows="3" cols="50" name="description">${requestScope.resource.description }</textarea>
    		</td>
    	</tr>
    	<tr>
    		<td>资源控制权限</td>
    		<td>
    			<c:forEach var="p" items="${requestScope.permission}">
					<input type="radio" name="pid" value="${p.id }" ${p.id==requestScope.resource.permission.id?'checked':'' }>${p.name } 
    			</c:forEach>
    		</td>
    	</tr>
    	<tr>
    		<td><input type="hidden" value="${requestScope.resource.id }" name="id"></td>
    		<td>
    			<input type="submit" value="添加资源">
    		</td>
    	</tr>
    </table>
    </form>
  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>分配权限</title>
  </head>
  
  <body>
     <form action="${pageContext.request.contextPath }/servlet/manager/RoleServlet?method=updateRole" method="post">
    <input type="hidden" name="id" value="${requestScope.role.id }">
    <input type="hidden" name="name" value="${requestScope.role.name }">
    <input type="hidden" name="description" value="${requestScope.role.description }">
    <table frame="border" width="80%">
    	<tr>
    		<td>角色名称</td>
    		<td>${requestScope.role.name }</td>
    	</tr>
    	
    	<tr>
    		<td>角色描述</td>
    		<td>${requestScope.role.description }</td>
    	</tr>
    	
    	<tr>
    		<td>拥有的权限</td>
    		<td>
    			<c:forEach var="p" items="${requestScope.permission}">
    				<c:forEach var="rp" items="${requestScope.role.permissions}">
    					<c:if test="${p.id==rp.id}"><c:set var="choice" value="true" /></c:if>
    				</c:forEach>
    				<input type="checkbox" value="${p.id }" name="pid" ${choice=='true'?'checked':'' } />${p.name }
    				<c:remove var="choice" />
    			</c:forEach>
    		</td>
    	</tr>
    	<tr>
    		<td></td>
    		<td><input type="submit" value="更新角色"></td>
    	</tr>
    </table>
    </form>
  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>分配角色</title>
	</head>

	<body>
		<form action="${pageContext.request.contextPath }/servlet/manager/UserServlet?method=updateUser" method="post">
			<input type="hidden" name="id" value="${requestScope.user.id }" >
			<table frame="border" width="80%">
				<tr>
					<td>用户名称</td>
					<td>${requestScope.user.username }</td>
				</tr>
				<tr>
					<td>角色信息</td>
					<td>
						<c:forEach var="r" items="${requestScope.role}">
							<c:forEach var="ur" items="${requestScope.user.roles}">
								<c:if test="${r.id==ur.id}"><c:set var="choice" value="true" /></c:if>
							</c:forEach>
							<input type="checkbox" value="${r.id }" name="rid" ${choice=='true'?'checked':'' } />${r.name }
							<c:remove var="choice" />
						</c:forEach>
					</td>
				</tr>
				<tr>
					<td></td>
					<td><input type="submit" value="更新用户"></td>
				</tr>
			</table>
		</form>
	</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>用户列表</title>
  </head>
  
  <body>
     <table width="90%">
    	<tr>
    		<td align="right">
    			<a href="${pageContext.request.contextPath }/servlet/manager/UserServlet?method=showInsertUser">添加用户</a>
    		</td>
    	</tr>
    </table>
    
    <table frame="border" width="90%">
    	<tr>
    		<td>用户名称</td>
    		<td>用户拥有的角色</td>
    		<td>操作</td>
    	</tr>
    	<c:forEach var="u" items="${requestScope.user}">
    		<tr>
	    		<td>${u.username }</td>
	    		<td>
	    			<c:forEach var="r" items="${u.roles}">
	    				${r.name }
	    			</c:forEach>
	    		</td>
	    		<td>
	    			<a href="${pageContext.request.contextPath }/servlet/manager/UserServlet?method=showUpdateUser&id=${u.id }">分配角色</a>
	    			<a href="${pageContext.request.contextPath }/servlet/manager/UserServlet?method=deleteUser&id=${u.id }">删除</a>
	    		</td>
    		</tr>
    	</c:forEach>
    </table>
  </body>
</html>
package cn.dk.filter;

import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CharacterFilter implements Filter {

	public void destroy() {
	}

	public void doFilter(ServletRequest r, ServletResponse re, FilterChain chain)
			throws IOException, ServletException {
		final HttpServletRequest request = (HttpServletRequest) r;
		HttpServletResponse response = (HttpServletResponse) re;
		response.setCharacterEncoding("utf-8");
		chain.doFilter((ServletRequest) Proxy.newProxyInstance(
				CharacterFilter.class.getClassLoader(), request.getClass()
						.getInterfaces(), new InvocationHandler() {
					@SuppressWarnings("unchecked")
					public Object invoke(Object proxy, Method method,
							Object[] args) throws Throwable {
						if (method.getName().equals("getParameter")) {
							String value = (String) method
									.invoke(request, args);
							String newValue = new String(value
									.getBytes("iso8859-1"), "utf-8");
							return newValue;
						} else if (method.getName().equals("getParameterMap")) {
							Map<String, String[]> values = (Map<String, String[]>) method
									.invoke(request, args);
							Map<String, String[]> newValues = new HashMap<String, String[]>();
							for (Map.Entry<String, String[]> entry : values
									.entrySet()) {
								String[] value = entry.getValue();
								String[] newValue = new String[value.length];
								for (int i = 0; i < value.length; i++) {
									newValue[i] = new String(value[i]
											.getBytes("iso8859-1"), "utf-8");
								}
								newValues.put(entry.getKey(), newValue);
							}
							return newValues;
						} else if (method.getName()
								.equals("getParameterValues")) {
							String[] values = (String[]) method.invoke(request,
									args);
							if (values == null)
								return null;
							String[] newValues = new String[values.length];
							for (int i = 0; i < values.length; i++) {
								newValues[i] = new String(values[i]
										.getBytes("iso8859-1"), "utf-8");
							}
							return newValues;
						}
						return method.invoke(request, args);
					}
				}), response);
	}

	public void init(FilterConfig filterConfig) throws ServletException {
	}
}
package cn.dk.filter;

import java.io.IOException;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.dk.domain.Permission;
import cn.dk.domain.Resource;
import cn.dk.domain.User;
import cn.dk.service.Service;

public class PermissionFilter implements Filter {

	public void destroy() {
	}

	public void doFilter(ServletRequest r, ServletResponse re, FilterChain chain)
			throws IOException, ServletException {

		HttpServletRequest request = (HttpServletRequest) r;
		HttpServletResponse response = (HttpServletResponse) re;
		Service service = new Service();

		// 判断要访问的资源是否需要权限
		String requestURI = request.getRequestURI();
		requestURI = requestURI.substring(1);
		Resource resource = service.findResourceByURI(requestURI);
		// 如果不需要权限放行
		if (resource == null) {
			chain.doFilter(request, response);
			return;
		}
		Permission permission = resource.getPermission();
		// 如果需要权限验证用户是否登陆
		Object attribute = request.getSession().getAttribute("user");
		// 如果没有登录则跳转登录页面
		if (attribute == null) {
			request.getRequestDispatcher("/login/login.jsp").forward(request,
					response);
			return;
		}
		// 如果已经登录获取用户权限
		User user = (User) attribute;
		List<Permission> userPermission = service.getUserPermission(user);
		// 如果有权访问则放行
		if (userPermission.contains(permission)) {
			chain.doFilter(request, response);
			return;
		}
		// 如果没权访问则跳转消息显示页面
		request.setAttribute("message", "对不起您没有权限");
		request.getRequestDispatcher("/WEB-INF/message/message.jsp").forward(
				request, response);
	}

	public void init(FilterConfig filterConfig) throws ServletException {
	}
}






posted @ 2017-11-26 21:17  keepup~  阅读(677)  评论(0编辑  收藏  举报