亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

【JavaWeb】權(quán)限管理系統(tǒng)

Simon_Zhou / 3242人閱讀

摘要:現(xiàn)在我們來(lái)做一個(gè)權(quán)限管理系統(tǒng),體驗(yàn)一下多表的業(yè)務(wù)邏輯,順便鞏固一下過(guò)濾器的知識(shí)。目的現(xiàn)在我有一個(gè)管理商品訂單的頁(yè)面。這里我們是這樣子做的作為,權(quán)限作為,構(gòu)成一個(gè)集合。

前言
前面我們做的小項(xiàng)目都是一個(gè)表的,業(yè)務(wù)代碼也相對(duì)簡(jiǎn)單?,F(xiàn)在我們來(lái)做一個(gè)權(quán)限管理系統(tǒng),體驗(yàn)一下多表的業(yè)務(wù)邏輯,順便鞏固一下過(guò)濾器的知識(shí)。!
目的

現(xiàn)在我有一個(gè)管理商品、訂單的頁(yè)面。當(dāng)用戶點(diǎn)擊某個(gè)超鏈接時(shí),過(guò)濾器會(huì)檢測(cè)該用戶是否有權(quán)限!

需求分析

按照面向?qū)ο蟮乃枷?,我?strong>至少應(yīng)該有權(quán)限(Privilege)和用戶(User)實(shí)體。兩個(gè)實(shí)體足夠了嗎?細(xì)想一下,如果我們有多個(gè)用戶,多個(gè)用戶也有多個(gè)權(quán)限,當(dāng)要為用戶授權(quán)的時(shí)候,這樣子就會(huì)非常麻煩!所以我們應(yīng)該引入角色(Role)這個(gè)實(shí)體!

引入角色(Role)這個(gè)實(shí)體方便在哪呢??把權(quán)限賦給角色(比如:把刪除、修改的權(quán)限給管理員這個(gè)角色),管理員這個(gè)角色再賦給用戶,那么該用戶就有了修改、刪除的權(quán)限了!

權(quán)限和角色是多對(duì)多的關(guān)系,角色和用戶也是多對(duì)多的關(guān)系!

開(kāi)發(fā)實(shí)體 用戶實(shí)體
public class User {

    private String id;
    private String username;
    private String password;

    //記住角色
    private Set roles = new HashSet<>();

    //各種getter和setter.....


}
角色實(shí)體
public class Role {
    private String id;
    private String name;
    private String description;

    //記住所有的用戶
    private Set users = new HashSet<>();

    //記住所有的權(quán)限
    private Set privileges = new HashSet<>();

    //各種getter和setter.....
}
權(quán)限實(shí)體
public class Privilege {

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

    //記住所有的角色
    private Set roles = new HashSet<>();

    //各種getter和setter.....

}
改良

用戶和角色、角色和權(quán)限都是多對(duì)多的關(guān)系,這是毋庸置疑的!我們也按照面向?qū)ο蟮姆椒▉?lái)設(shè)計(jì),用集合來(lái)記住另一方的數(shù)據(jù)!

但是呢,我們想想:

在權(quán)限的Dao中,在查看權(quán)限的時(shí)候,有必要列出相對(duì)應(yīng)的角色嗎??

在角色的Dao中,在查看角色的時(shí)候,有必要列出相對(duì)應(yīng)的用戶嗎??

答案是沒(méi)有的,一般我們都不會(huì)顯示出來(lái)。所以,權(quán)限的實(shí)體沒(méi)必要使用Set集合來(lái)記住角色,角色實(shí)體沒(méi)必要使用Set集合來(lái)記住用戶!

改良后的權(quán)限實(shí)體

public class Privilege {

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

    //各種setter和getter方法
    
}
改良后的角色實(shí)體

public class Role {
    private String id;
    private String name;
    private String description;
    
    //記住所有的權(quán)限
    private Set privileges = new HashSet<>();

    //各種setter和getter方法


}

在數(shù)據(jù)庫(kù)中建表 user表

    CREATE TABLE user (
      id       VARCHAR(20) PRIMARY KEY,
      username VARCHAR(20) NOT NULL,
      password VARCHAR(20) NOT NULL
    
    
    );


role表

    CREATE TABLE role (
      id          VARCHAR(20) PRIMARY KEY,
      name        VARCHAR(20) NOT NULL,
      description VARCHAR(255)
    
    );

privilege表
    CREATE TABLE privilege (
    
      id          VARCHAR(20) PRIMARY KEY,
      name        VARCHAR(20) NOT NULL,
      description VARCHAR(255)
    
    
    );
user和role的關(guān)系表
    CREATE TABLE user_role (
    
      user_id VARCHAR(20),
      role_id VARCHAR(20),
      PRIMARY KEY (user_id, role_id),
      CONSTRAINT user_id_FK FOREIGN KEY (user_id) REFERENCES user (id),
      CONSTRAINT role_id_FK FOREIGN KEY (role_id) REFERENCES role (id)
    );
role和privilege的關(guān)系表
    CREATE TABLE role_privilege (
    
      role_id      VARCHAR(20),
      privilege_id VARCHAR(20),
      PRIMARY KEY (role_id, privilege_id),
    
      CONSTRAINT role_id_FK1 FOREIGN KEY (role_id) REFERENCES role (id),
      CONSTRAINT privilege_id_FK FOREIGN KEY (privilege_id) REFERENCES privilege (id)
    
    );

注意:user和role的關(guān)系表、role和privilege的關(guān)系都有role_id作為外鍵,外鍵的名稱是不能一樣的!

開(kāi)發(fā)DAO PrivilegeDao
/**
* 權(quán)限的管理應(yīng)該有以下的功能:
* 1.添加權(quán)限
* 2.查看所有權(quán)限
* 3.查找某個(gè)權(quán)限
*
* */
public class PrivilegeDao {

    /*添加權(quán)限*/
    public void addPrivilege(Privilege privilege) {
        try {

            QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource());
            String sql = "INSERT INTO privilege (id, name, description) VALUE (?, ?, ?)";
            queryRunner.update(sql, new Object[]{privilege.getId(), privilege.getName(), privilege.getDescription()});


        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("添加權(quán)限失敗了!");
        }
    }

    /*查找權(quán)限*/
    public Privilege findPrivilege(String id) {

        try {

            QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource());
            String sql = "SELECT *FROM privilege WHERE id = ?";
            Privilege privilege = (Privilege) queryRunner.query(sql, new BeanHandler(Privilege.class), new Object[]{id});

            return privilege;
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("查找權(quán)限失敗了!");
        }
    }

    /*獲取所有的權(quán)限*/
    public List getAllPrivileges() {

        try {

            QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource());
            String sql = "SELECT * FROM privilege ";

            List privileges = (List) queryRunner.query(sql, new BeanListHandler(Privilege.class));
            
            return privileges;

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("查找權(quán)限失敗了!");
        }
    }
}
測(cè)試PrivilegeDao的功能

為了測(cè)試方便,添加有參構(gòu)造函數(shù)到Privilege對(duì)象中

    public class PrivilegeDaoTest {
    
        PrivilegeDao privilegeDao = new PrivilegeDao();
    
        @Test
        public void add() {
    
            Privilege privilege = new Privilege("2", "修改", "修改功能");
    
            privilegeDao.addPrivilege(privilege);
    
        }
    
        @Test
        public void getAll() {
            List list = privilegeDao.getAllPrivileges();
    
            for (Privilege privilege : list) {
    
                System.out.println(privilege.getId());
            }
        }
    
        @Test
        public void find() {
            String id = "2";
    
            Privilege privilege = privilegeDao.findPrivilege(id);
    
            System.out.println(privilege.getName());
    
        }
}


UserDao

public class UserDao {

    public void addUser(User user) {

        try {

            QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource());
            String sql = "INSERT INTO user (id,username,password) VALUES(?,?,?)";

            queryRunner.update(sql, new Object[]{user.getId(), user.getUsername(), user.getPassword()});


        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("添加權(quán)限失敗了!");
        }

    }

    public User find(String id) {
        try {

            QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource());

            String sql = "SELECT * FROM user WHERE id=?";
            User user = (User) queryRunner.query(sql, new BeanHandler(User.class), new Object[]{id});

            return user;

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("添加權(quán)限失敗了!");
        }

    }

    public List getAll() {
        try {

            QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource());

            String sql = "SELECT * FORM user";
            List users = (List) queryRunner.query(sql, new BeanListHandler(User.class));

            return users;
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("添加權(quán)限失敗了!");
        }
    }
}
測(cè)試UserDao


public class UserDaoTest {

    UserDao userDao = new UserDao();

    @Test
    public void add() {

        User user = new User();
        user.setId("2");
        user.setUsername("qqq");
        user.setPassword("123");
        userDao.addUser(user);


    }

    @Test
    public void find() {

        String id = "1";
        User user = userDao.find(id);

        System.out.println(user.getUsername());
    }

    @Test
    public void findALL() {

        List userList = userDao.getAll();

        for (User user : userList) {

            System.out.println(user.getUsername());
        }

    }

}

RoleDao
    public void add(Role role){

        try{
            QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
            String sql = "insert into role(id,name,description) values(?,?,?)";
            Object params[] = {role.getId(),role.getName(),role.getDescription()};
            runner.update(sql, params);
        }catch (Exception e) {
            throw new RuntimeException(e);
        }

    }

    public Role find(String id){

        try{
            QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
            String sql = "select * from role where id=?";
            return (Role) runner.query(sql, id, new BeanHandler(Role.class));
        }catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    //得到所有角色
    public List getAll(){
        try{

            QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
            String sql = "select * from role";
            return (List) runner.query(sql, new BeanListHandler(Role.class));
        }catch (Exception e) {
            throw new RuntimeException(e);
        }

    }

測(cè)試RoleDao
    RoleDao roleDao = new RoleDao();

    @Test
    public void add() {

        Role role = new Role();
        role.setId("1");
        role.setName("manager");
        role.setDescription("this is a manager");

        roleDao.add(role);
    }
    @Test
    public void find( ) {

        String id = "1";
        Role role = roleDao.find(id);

        System.out.println(role.getName());

    }

    @Test
    public void getAdd() {

        List roleList = roleDao.getAll();

        for (Role role : roleList) {

            System.out.println(role.getName());
        }
    }


補(bǔ)充

上面的僅僅是單表的Dao功能,User和Role表是多對(duì)多的關(guān)系,Role和Privilege表也是多對(duì)多的關(guān)系。

前面已經(jīng)分析了

在User對(duì)象中,需要一個(gè)Set集合來(lái)記住Role的關(guān)系?!撅@示用戶的時(shí)候,應(yīng)該把所有角色顯示出來(lái)】

在Role對(duì)象中,需要一個(gè)Set集合來(lái)記住Privilege的關(guān)系【顯示角色的時(shí)候,應(yīng)該把所有權(quán)限顯示很出來(lái)】。

所以應(yīng)該在UserDao有獲取某用戶所有的角色的方法

    /*得到用戶的所有角色*/
    public List getRoles(String user_id) {

        try {

            QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource());

            //根據(jù)用戶id查詢所有角色,重點(diǎn)就在角色上,所以要有role表。然后查詢user_role表,就可以鎖定用戶id對(duì)應(yīng)的角色了!
            String sql = "SELECT r.* FROM role r, user_role ur WHERE ur.user_id = ? AND r.id = ur.role_id ";

            List roles = (List) queryRunner.query(sql, new BeanListHandler(Role.class), new Object[]{user_id});

            return roles;
        } catch (Exception e) {

            e.printStackTrace();
            throw new RuntimeException("得到用戶所有的角色失敗了!");
        }

    }

在RoleDao有獲取所有權(quán)限的方法



    //得到某角色的所有權(quán)限【權(quán)限表、權(quán)限和角色關(guān)系表】
    public List getPrivileges(String role_id) {
        try{

            QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());

            String sql = "SELECT p.* FROM privilege p, role_privilege rp WHERE rp.role_id = ? AND p.id = rp.role_id";

            List privileges = (List) runner.query(sql, new BeanListHandler(Privilege.class), new Object[]{role_id});

            return privileges;


        }catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

我們既然能獲取得到用戶所有的角色了,獲取得到角色所有的權(quán)限了。那自然我們就應(yīng)該有修改用戶的角色功能,修改角色的權(quán)限的功能啦!

我們先來(lái)分析一下它怎么寫(xiě):要修改用戶所擁有的角色,應(yīng)該知道修改用戶是哪一個(gè),所以需要用戶的id或者User對(duì)象!修改的角色是什么,需要Role對(duì)象或者裝載Role對(duì)象的集合!

在UserDao有修改某用戶角色的方法,我們是想把所有的角色都刪除了,再添加新的角色


    //更新用戶的角色
    public void updateRole(User user, List roles) {

        try {

            QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource());

            //先把用戶原來(lái)的所有角色刪掉了
            String delete = "DELETE FROM user_role WHERE user_id = ?";
            queryRunner.update(delete, user.getId());


            String add = "INSERT INTO user_role (user_id,role_id) VALUES(?,?)";
            for (Role role : roles) {
                queryRunner.update(add, new Object[]{user.getId(), role.getId()});
            }

        } catch (Exception e) {

            e.printStackTrace();
            throw new RuntimeException("添加權(quán)限失敗了!");
        }
        
    }

在RoleDao有修改角色權(quán)限的方法,和上面是類似的。

    //為某個(gè)角色授權(quán)
    public void addPrivilege2Role(Role role, List privileges) {

        try{
            QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());


            //先刪除該角色的所有權(quán)限
            String delete = "DELETE FROM role_privilege WHERE role_id = ?";
            runner.update(delete, new Object[]{role.getId()});

            //賦予角色新的權(quán)限
            String sql = "INSERT INTO role_privilege (role_id, privilege_id) VALUES (?, ?)";
            for (Privilege privilege : privileges) {
                runner.update(sql, new Object[]{role.getId(), privilege.getId()});
            }
        }catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
更新

剛才又思考了一下:

其實(shí)我們并不需要在User類用使用集合來(lái)維護(hù)Role,在Role中使用集合來(lái)維護(hù)Privilege。在原本的做法我們已經(jīng)看到了,我們完全是不需要這兩個(gè)變量也能完成效果的。

那么,現(xiàn)在問(wèn)題就來(lái)了。什么時(shí)候我們才需要在實(shí)體中使用變量來(lái)維護(hù)多的一方的關(guān)系呢???我覺(jué)得是這樣的:當(dāng)我們?cè)诓樵円环綌?shù)據(jù)的時(shí)候,另一方的數(shù)據(jù)也同時(shí)需要展示。那么此時(shí)我們就應(yīng)該使用集合來(lái)維護(hù)多的一方數(shù)據(jù)了。

基于上面一個(gè)例子,就比如:訂單與訂單項(xiàng)。當(dāng)我們查看訂單的時(shí)候,同時(shí)一定會(huì)把所有的訂單項(xiàng)都列舉出來(lái)。

再比如:當(dāng)我們查看購(gòu)物車的時(shí)候,就需要把所有的購(gòu)物項(xiàng)都列舉出來(lái)。

而我們使用展示用戶的時(shí)候,并不需要第一時(shí)間就把角色列舉出來(lái),而是通過(guò)超鏈接來(lái)查看用戶下的角色,基于這種情況,我覺(jué)得我們是不用使用集合變量來(lái)維護(hù)多的一方的數(shù)據(jù)的。

這就跟Hibernate的懶加載差不多。用到關(guān)聯(lián)關(guān)系的數(shù)據(jù)的時(shí)候才加載,沒(méi)有用到的時(shí)候就先不查詢數(shù)據(jù)庫(kù)。

ps:我不知道在這我理解得對(duì)不對(duì),如果有錯(cuò)的地方希望能指出!

開(kāi)發(fā)BusinessService UserService
    public class UserService {
    
    
        UserDao userDao = new UserDao();
    
        //添加用戶
        public void addUser(User user) {
    
            userDao.addUser(user);
        }
    
        //根據(jù)id查找用戶
        public User findUser(String id) {
            return userDao.find(id);
        }
    
        //得到所有的用戶
        public List getAllUser() {
            return userDao.getAll();
        }
    
        //獲取用戶所有的角色
        public List getUserRole(String user_id) {
            return userDao.getRoles(user_id);
        }
    
        //修改用戶的角色
        public void updateUserRole(User user, List roles) {
    
            userDao.updateRole(user, roles);
        }
    
    }
RoleService
    public class RoleService {
    
        RoleDao roleDao = new RoleDao();
    
        //添加角色
        public void addRole(Role role) {
    
            roleDao.add(role);
        }
    
        //根據(jù)id查找角色
        public Role findRole(String id) {
            return roleDao.find(id);
        }
    
        //獲取所有的角色
        public List getAllRole() {
            return roleDao.getAll();
        }
    
        //獲取角色所有的權(quán)限
        public List getRolePrivilege(String role_id) {
            return roleDao.getPrivileges(role_id);
        }
    
        //修改角色的權(quán)限
        public void updateRolePrivilege(Role role, List privileges) {
            roleDao.addPrivilege2Role(role, privileges);
        }
    }

PrivilegeService
    public class PrivilegeService {
    
        PrivilegeDao privilegeDao = new PrivilegeDao();
    
    
        //添加權(quán)限
        public void addPrivilege(Privilege privilege) {
            privilegeDao.addPrivilege(privilege);
        }
    
        //根據(jù)id獲得權(quán)限
        public Privilege findPrivilege(String id) {
            return privilegeDao.findPrivilege(id);
        }
    
        //獲取所有的權(quán)限
        public List getAllPrivileges() {
            return privilegeDao.getAllPrivileges();
        }
    }
開(kāi)發(fā)Web 用戶模塊 添加用戶

提供頁(yè)面界面的Servlet

        //直接跳轉(zhuǎn)到顯示添加用戶的界面
        request.getRequestDispatcher("/WEB-INF/jsp/addUser.jsp").forward(request, response);

顯示頁(yè)面的JSP

    
用戶名:
密碼:

處理表單數(shù)據(jù)的Servlet

        //得到客戶端傳遞進(jìn)來(lái)的參數(shù)
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        User user = new User();
        user.setId(WebUtils.makeId());
        user.setUsername(username);
        user.setPassword(password);

        try {
            UserService userService = new UserService();
            userService.addUser(user);

            request.setAttribute("message","添加用戶成功!");

        } catch (Exception e) {
            request.setAttribute("message", "添加用戶失敗!");
            throw new RuntimeException("在Controller添加客戶失敗");
        }
        request.getRequestDispatcher("/message.jsp").forward(request,response);
        
    }

效果:

顯示用戶

提供頁(yè)面界面的Servlet

        UserService userService = new UserService();
        List list = userService.getAllUser();
        request.setAttribute("list", list);

        //跳轉(zhuǎn)到顯示頁(yè)面
        request.getRequestDispatcher("/WEB-INF/jsp/LookUser.jsp").forward(request, response);

顯示頁(yè)面JSP



    對(duì)不起,暫時(shí)沒(méi)有任何客戶



    
            
用戶名 密碼
${user.username} ${user.password}

效果:

為用戶添加角色

在顯示用戶的基礎(chǔ)上,應(yīng)該添加為用戶授權(quán)角色的超鏈接。


    
            
用戶名 密碼 操作
${user.username} ${user.password} 為用戶授權(quán)角色 修改用戶 刪除用戶

效果:

處理顯示授權(quán)頁(yè)面的Servlet


        //得到客戶端傳遞過(guò)來(lái)的user_id
        String user_id = request.getParameter("user_id");

        //獲取該用戶所有的角色
        UserService userService = new UserService();
        List userRoles = userService.getUserRole(user_id);

        //得到全部的角色
        RoleService roleService = new RoleService();
        List allRoles = roleService.getAllRole();

        //為用戶授權(quán)的JSP頁(yè)面也應(yīng)該顯示用戶的信息,所以把User對(duì)象也傳遞過(guò)去給JSP頁(yè)面
        User user = userService.findUser(user_id);

        request.setAttribute("user", user);
        request.setAttribute("userRoles", userRoles);
        request.setAttribute("allRoles", allRoles);

        //跳轉(zhuǎn)到顯示頁(yè)面
        request.getRequestDispatcher("/WEB-INF/jsp/LookUserRole.jsp").forward(request, response);

授權(quán)頁(yè)面JSP



當(dāng)前用戶名稱 ${user.username}
當(dāng)前用戶所擁有的角色 ${userRole.name}
當(dāng)前系統(tǒng)所擁有的角色
<%--要為用戶添加角色,需要知道是哪一個(gè)用戶,通過(guò)hidden傳遞過(guò)去用戶的id--%> ${roles.name}

效果:

處理表單數(shù)據(jù)并為用戶添加角色的Servlet


        //得到傳遞進(jìn)來(lái)的role_id
        String[] ids = request.getParameterValues("role_id");

        try {
            //得到想要修改哪個(gè)用戶的id
            String user_id = request.getParameter("user_id");

            //通過(guò)id獲取得到User對(duì)象
            UserService userService = new UserService();
            User user = userService.findUser(user_id);

            //通過(guò)id獲取得到Role對(duì)象,再把對(duì)象用List集合裝載起來(lái)
            RoleService roleService = new RoleService();
            List list = new ArrayList<>();
            for (String id : ids) {
                Role role = roleService.findRole(id);
                list.add(role);
            }

            //更新用戶所擁有的角色
            userService.updateUserRole(user, list);

            request.setAttribute("message","添加角色成功!");

        } catch (Exception e) {
            e.printStackTrace();
            request.setAttribute("message","添加角色失??!");
        }
        request.getRequestDispatcher("/message.jsp").forward(request,response);

效果:

角色模塊 添加角色

提供添加角色頁(yè)面的Servlet

        //直接跳轉(zhuǎn)到j(luò)sp頁(yè)面即可
        request.getRequestDispatcher("WEB-INF/jsp/AddRole.jsp").forward(request, response);

顯示頁(yè)面JSP


    
角色名稱
詳細(xì)描述

處理表單數(shù)據(jù)并添加角色的Servlet


        //得到客戶端帶過(guò)來(lái)的數(shù)據(jù)
        String name = request.getParameter("name");
        String description = request.getParameter("description");

        try {
            //創(chuàng)建對(duì)象并封裝數(shù)據(jù)
            Role role = new Role();
            role.setId(WebUtils.makeId());
            role.setName(name);
            role.setDescription(description);

            //調(diào)用Service方法,完成功能
            RoleService roleService = new RoleService();
            roleService.addRole(role);

            request.setAttribute("message","添加角色成功!");
        } catch (Exception e) {
            request.setAttribute("message","添加角色失??!");
            e.printStackTrace();
        }

        request.getRequestDispatcher("/message.jsp").forward(request, response);

效果:

查看所有的角色

提供頁(yè)面的Servlet


        //得到所有的角色
        RoleService roleService = new RoleService();
        List list = roleService.getAllRole();

        request.setAttribute("list", list);
        request.getRequestDispatcher("/WEB-INF/jsp/LookRoles.jsp").forward(request, response);

顯示頁(yè)面JSP

    
        您還沒(méi)有任何角色,請(qǐng)?zhí)砑樱?    
    
    
        
                
角色名稱 描述
${role.name} ${role.description}

效果

為角色授權(quán)

與上面是類似的,我們要在查看角色的時(shí)候,添加授權(quán)的功能!

        
            
                ${role.name}
                ${role.description}
                
                    
                        為角色授權(quán)
                    
                    刪除角色
                    修改角色
                
            
        

效果:

提供顯示權(quán)利頁(yè)面的Servlet

        //得到瀏覽器想要查看的角色id
        String role_id = request.getParameter("role_id");
        RoleService roleService = new RoleService();

        //根據(jù)id獲取得到Role對(duì)象
        Role role = roleService.findRole(role_id);

        //得到當(dāng)前角色所有的權(quán)利
        List rolePrivilege = roleService.getRolePrivilege(role_id);

        //得到系統(tǒng)所有的權(quán)利
        PrivilegeService privilegeService = new PrivilegeService();
        List allPrivilege = privilegeService.getAllPrivileges();

        request.setAttribute("role", role);
        request.setAttribute("rolePrivilege", rolePrivilege);
        request.setAttribute("allPrivilege", allPrivilege);

        //跳轉(zhuǎn)到顯示頁(yè)面
        request.getRequestDispatcher("/WEB-INF/jsp/LookRolePrivilege.jsp").forward(request, response);

顯示頁(yè)面JSP


    
角色名稱 ${role.name}
當(dāng)前角色擁有的權(quán)利 ${privi.name}
系統(tǒng)擁有的所有權(quán)利
<%--讓服務(wù)器知道要修改哪一個(gè)用戶,就要把用戶的id傳遞過(guò)去--%> ${privileges.name}

效果:

處理表單數(shù)據(jù)并添加角色權(quán)利的Servlet


        //得到瀏覽器想要添加權(quán)利的id
        String[] ids = request.getParameterValues("privilege_id");

        //獲取角色id
        String role_id = request.getParameter("role_id");


        try {
            //得到想要添加權(quán)利的角色
            RoleService roleService = new RoleService();
            Role role = roleService.findRole(role_id);

            //得到權(quán)利對(duì)象,用List對(duì)象裝載起來(lái)
            PrivilegeService privilegeService = new PrivilegeService();
            List privileges_list = new ArrayList<>();
            for (String id : ids) {
                Privilege privilege = privilegeService.findPrivilege(id);
                privileges_list.add(privilege);
            }

            roleService.updateRolePrivilege(role, privileges_list);

            request.setAttribute("message","為角色添加權(quán)利成功!");

        } catch (Exception e) {
            e.printStackTrace();
            request.setAttribute("message","為角色添加權(quán)利失??!");
        }

        request.getRequestDispatcher("/message.jsp").forward(request, response);

效果:

權(quán)限模塊 添加權(quán)限

提供添加權(quán)限頁(yè)面的Servlet

        //直接跳轉(zhuǎn)到j(luò)sp頁(yè)面
        request.getRequestDispatcher("/WEB-INF/jsp/AddPrivilege.jsp").forward(request, response);

顯示頁(yè)面JSP


    
權(quán)限名字
權(quán)限描述

效果:

處理表單數(shù)據(jù),并添加權(quán)限的Servlet

        //得到瀏覽器帶過(guò)來(lái)的數(shù)據(jù)
        String name = request.getParameter("name");
        String description = request.getParameter("description");

        //封裝數(shù)據(jù)到Privilege對(duì)象
        Privilege privilege = new Privilege();
        privilege.setId(WebUtils.makeId().substring(3,10));
        privilege.setName(name);
        privilege.setDescription(name);


        try {
            PrivilegeService privilegeService = new PrivilegeService();
            privilegeService.addPrivilege(privilege);

            request.setAttribute("message","添加權(quán)限成功!");

        } catch (Exception e) {
            e.printStackTrace();
            request.setAttribute("message", "添加權(quán)限失敗!");
        }

        request.getRequestDispatcher("/message.jsp").forward(request, response);

效果:

查看所有權(quán)限

提供頁(yè)面的Servlet



        //得到所有的權(quán)限
        PrivilegeService privilegeService = new PrivilegeService();
        List list = privilegeService.getAllPrivileges();

        request.setAttribute("list", list);
        request.getRequestDispatcher("/WEB-INF/jsp/LookPrivileges.jsp").forward(request, response);

顯示權(quán)限頁(yè)面的JSP


    
        您還沒(méi)添加任何的權(quán)限
    
    
    
        
                
權(quán)限名稱 描述 操作
${privilege.name} ${privilege.description} 刪除權(quán)限 修改權(quán)限

效果:

用分幀把功能拼接

head頁(yè)面

    
    
    

XX管理系統(tǒng)

left頁(yè)面

    
    
    用戶管理



角色管理



權(quán)限管理



body頁(yè)面是空白的!

index頁(yè)面:


    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
      
        $Title$
      
    
      
        
          
          
        
    
    

效果:

過(guò)濾器

過(guò)濾器主要的工作就是:點(diǎn)擊超鏈接時(shí),過(guò)濾器會(huì)檢測(cè)該點(diǎn)擊者是否有權(quán)限進(jìn)入頁(yè)面進(jìn)行操作(CURD)。

這里我們是這樣子做的:uri作為key,權(quán)限作為value,構(gòu)成一個(gè)Map集合。當(dāng)用戶請(qǐng)求資源的時(shí)候,判斷該資源是否需要權(quán)限,如果需要權(quán)限,就判斷該用戶是否登陸了,如果登陸了,就判斷該用戶有沒(méi)有權(quán)限去訪問(wèn)該資源!

在UserDao和UserService中需要添加login方法:

補(bǔ)充的代碼

    public User login(String username, String password) {

        try {
            QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource());

            String sql = "SELECT * FROM user WHERE username=? AND password=?";
            User user = (User) queryRunner.query(sql, new BeanHandler(User.class), new Object[]{username, password});

            return user;

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("登陸失敗了!!");
        }
    }

登陸界面的JSP


    
用戶名:
密碼:

處理登陸的Servlet


        //獲取表單數(shù)據(jù)
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        UserService userService = new UserService();
        User user = userService.login(username, password);

        if (user != null) {
            request.setAttribute("message", "恭喜你,登陸成功了!");
            request.getSession().setAttribute("user", user);
        } else {
            request.setAttribute("message","用戶名或密碼出錯(cuò)了!!");
        }

        request.getRequestDispatcher("/message.jsp").forward(request, response);
Filter代碼

完整代碼:

    private Map map = new HashMap<>();
    public void init(FilterConfig config) throws ServletException {

        map.put("/addServlet", new Privilege("增加"));
        map.put("/deleteServlet", new Privilege("刪除"));
        map.put("/updateServlet", new Privilege("修改"));
        map.put("/findServlet", new Privilege("查賬單"));

    }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        //得到用戶請(qǐng)求的資源地址
        String uri = request.getRequestURI();
        System.out.println(uri);

        //通過(guò)key獲取值,看看能不能獲取得到值【為空,就是不需要權(quán)限了】
        if (map.get(uri) == null) {
            chain.doFilter(request, response);
            System.out.println("放行了");
            return ;
        }
        //如果不為空,就是需要權(quán)限。需要權(quán)限的話,就判斷請(qǐng)求者是否登陸了!
        if (request.getSession().getAttribute("user") == null) {
            request.setAttribute("message", "您登陸了再來(lái)操作把!");
            request.getRequestDispatcher("/message.jsp").forward(request, response);
            return;
        }

        //如果登陸了,就查一下用戶的權(quán)限是否和訪問(wèn)資源的權(quán)限匹配
        User user = (User) request.getSession().getAttribute("user");
        UserService userService = new UserService();
        RoleService roleService = new RoleService();

        //得到用戶所有的角色
        List roles = userService.getUserRole(user.getId());

        //通過(guò)角色,得到所有的權(quán)限【一個(gè)角色有多個(gè)權(quán)限,如果用戶角色很多,那么權(quán)限也就很多了】
        //此時(shí),我們又要用集合來(lái)裝載每一個(gè)角色的權(quán)限了!
        Set privileges = new HashSet();
        for (Role role : roles) {
            List list = roleService.getRolePrivilege(role.getId());
            privileges.addAll(list);
        }

        //得到的Set集合就是用戶所有的權(quán)限了?。。。。?        //集合的contains方法比較的是默認(rèn)對(duì)象,而我們想要比較的是字符串名稱,所以我們要在Privilege對(duì)象中重寫(xiě)equals和hashCode方法!
        if (!privileges.contains(map.get(uri))) {
            request.setAttribute("message", "你沒(méi)有權(quán)限喲");
            request.getRequestDispatcher("/message.jsp").forward(request, response);
            return ;
        }

        //到這里,就是有權(quán)限了
        chain.doFilter(request, response);
    }


    public void destroy() {
    }

測(cè)試

總結(jié)要點(diǎn)

①:用戶和權(quán)限的關(guān)系,由于添加用戶的權(quán)限和修改用戶權(quán)限的不足【在權(quán)限很多的情況下,這種情況是不好處理的】,所以我們引入了角色這個(gè)概念

②:用戶與角色,角色與權(quán)限都是多對(duì)多的關(guān)系

③:按照數(shù)據(jù)庫(kù)范式,我們會(huì)創(chuàng)建5張實(shí)體表,其中兩張是代表著:用戶與角色、角色與權(quán)限的關(guān)系表。角色這個(gè)字段在外鍵中,不能同名!

④:無(wú)論是角色、用戶、權(quán)限都有這三個(gè)方法:得到所有的權(quán)限(角色、用戶)、添加權(quán)限(角色、用戶)、權(quán)限的id得到權(quán)限(角色、用戶)對(duì)象

⑤:根據(jù)id得到具體的對(duì)象方法的意義:在web顯示層只能通過(guò)id來(lái)標(biāo)識(shí)著這個(gè)對(duì)象,然而在后端常常使用的是對(duì)象,于是就有了這個(gè)方法。

⑥:多對(duì)多之間的關(guān)系,在程序中并不是都要在其類上定義一個(gè)集合來(lái)記住對(duì)方。當(dāng)顯示用戶時(shí),需要顯示角色,但是顯示角色時(shí),一般我們是不需要顯示用戶的信息的。因此在角色上,并不需要維護(hù)一個(gè)集合來(lái)記住所有的用戶

⑦:得到用戶的所有角色:傳入的參數(shù)必定有具體的用戶或角色,所以id必須是外界傳遞進(jìn)來(lái)的。【得到角色的所有權(quán)限是同理】

⑧:修改用戶的角色:我們先把用戶的角色全部刪除了,再通過(guò)外界勾選的角色進(jìn)行添加(這是一個(gè)折中的辦法)【修改角色的權(quán)限是同理】

⑨:在添加用戶角色的時(shí)候,要把用戶的id通過(guò)隱藏域傳遞進(jìn)去給服務(wù)器端,不然是不知道要修改的是哪一個(gè)用戶的角色的?!拘薷慕巧臋?quán)限是同理】

⑩:frameset和frame來(lái)實(shí)現(xiàn)前臺(tái)的分幀,target指定在哪里顯示具體的數(shù)據(jù)

①①:在init()方法中用一個(gè)Map集合,以u(píng)ri作為key,以具體的權(quán)限作為值來(lái)實(shí)現(xiàn)過(guò)濾

①②:如果uri不需要權(quán)限,直接放行。需要權(quán)限,那么判斷該用戶是否登錄了。沒(méi)有登錄就讓用戶去登錄

①③:如果登錄了,就得到用戶所有的權(quán)限,權(quán)限用一個(gè)Set集合裝載,遍歷Set集合,使用contains()方法就可以查看出有沒(méi)有對(duì)應(yīng)的權(quán)限了。

①④:使用contains()方法需要在權(quán)限類上重寫(xiě)hashCode()和equals()方法的。因?yàn)槲覀儽容^的是字符串。

如果文章有錯(cuò)的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章的同學(xué),想要獲取更多的Java資源的同學(xué),可以關(guān)注微信公眾號(hào):Java3y

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/68599.html

相關(guān)文章

  • 基于javaweb+jsp的機(jī)房設(shè)備管理系統(tǒng)

    摘要:基于的機(jī)房設(shè)備管理系統(tǒng)部分代碼實(shí)現(xiàn)機(jī)房號(hào)容納人數(shù)介紹狀態(tài) 基于javaweb+jsp的機(jī)房設(shè)備管理系統(tǒng) JavaWeb JavaBean JSP MVC MySQL...

    Me_Kun 評(píng)論0 收藏0
  • 基于javaweb+jsp的醫(yī)院信息管理系統(tǒng)

    摘要:基于的醫(yī)院信息管理系統(tǒng)代碼實(shí)現(xiàn)提交取消是否掛號(hào)否否 基于javaweb+jsp的醫(yī)院信息管理系統(tǒng) 代碼實(shí)現(xiàn) }) ...

    gitmilk 評(píng)論0 收藏0
  • 基于javaweb+jsp的新生報(bào)道管理系統(tǒng)

    摘要:基于的新生報(bào)道管理系統(tǒng)部分代碼實(shí)現(xiàn)新生報(bào)道管理系統(tǒng)新生報(bào)道管理系統(tǒng) 基于javaweb+jsp的新生報(bào)道管理系統(tǒng) JavaWeb JavaBean JSP MVC ...

    genefy 評(píng)論0 收藏0
  • 基于javaweb+jsp的學(xué)生宿舍管理系統(tǒng)

    摘要:基于的學(xué)生宿舍管理系統(tǒng)部分代碼實(shí)現(xiàn)樓棟不能為空編輯表單提交之前進(jìn)行檢查,如果,則不允許提交根據(jù)獲取值姓名不能為空電話不能為空側(cè)邊欄 基于javaweb+jsp的學(xué)生...

    DandJ 評(píng)論0 收藏0
  • 基于javaweb+jsp的超市管理系統(tǒng)

    摘要:基于的超市管理系統(tǒng)代碼實(shí)現(xiàn)側(cè)邊欄類型不能為空入庫(kù)時(shí)間數(shù) 基于javaweb+jsp的超市管理系統(tǒng) 代碼實(shí)現(xiàn) ...

    aisuhua 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<