国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【JavaWeb】權限管理系統

Simon_Zhou / 3174人閱讀

摘要:現在我們來做一個權限管理系統,體驗一下多表的業務邏輯,順便鞏固一下過濾器的知識。目的現在我有一個管理商品訂單的頁面。這里我們是這樣子做的作為,權限作為,構成一個集合。

前言
前面我們做的小項目都是一個表的,業務代碼也相對簡單。現在我們來做一個權限管理系統,體驗一下多表的業務邏輯,順便鞏固一下過濾器的知識。!
目的

現在我有一個管理商品、訂單的頁面。當用戶點擊某個超鏈接時,過濾器會檢測該用戶是否有權限!

需求分析

按照面向對象的思想,我們至少應該有權限(Privilege)和用戶(User)實體。兩個實體足夠了嗎?細想一下,如果我們有多個用戶,多個用戶也有多個權限,當要為用戶授權的時候,這樣子就會非常麻煩!所以我們應該引入角色(Role)這個實體!

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

權限和角色是多對多的關系,角色和用戶也是多對多的關系!

開發實體 用戶實體
public class User {

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

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

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


}
角色實體
public class Role {
    private String id;
    private String name;
    private String description;

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

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

    //各種getter和setter.....
}
權限實體
public class Privilege {

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

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

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

}
改良

用戶和角色、角色和權限都是多對多的關系,這是毋庸置疑的!我們也按照面向對象的方法來設計,用集合來記住另一方的數據!

但是呢,我們想想:

在權限的Dao中,在查看權限的時候,有必要列出相對應的角色嗎??

在角色的Dao中,在查看角色的時候,有必要列出相對應的用戶嗎??

答案是沒有的,一般我們都不會顯示出來。所以,權限的實體沒必要使用Set集合來記住角色,角色實體沒必要使用Set集合來記住用戶!

改良后的權限實體

public class Privilege {

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

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

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

    //各種setter和getter方法


}

在數據庫中建表 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的關系表
    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的關系表
    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的關系表、role和privilege的關系都有role_id作為外鍵,外鍵的名稱是不能一樣的!

開發DAO PrivilegeDao
/**
* 權限的管理應該有以下的功能:
* 1.添加權限
* 2.查看所有權限
* 3.查找某個權限
*
* */
public class PrivilegeDao {

    /*添加權限*/
    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("添加權限失敗了!");
        }
    }

    /*查找權限*/
    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("查找權限失敗了!");
        }
    }

    /*獲取所有的權限*/
    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("查找權限失敗了!");
        }
    }
}
測試PrivilegeDao的功能

為了測試方便,添加有參構造函數到Privilege對象中

    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("添加權限失敗了!");
        }

    }

    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("添加權限失敗了!");
        }

    }

    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("添加權限失敗了!");
        }
    }
}
測試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);
        }

    }

測試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());
        }
    }


補充

上面的僅僅是單表的Dao功能,User和Role表是多對多的關系,Role和Privilege表也是多對多的關系。

前面已經分析了

在User對象中,需要一個Set集合來記住Role的關系。【顯示用戶的時候,應該把所有角色顯示出來】

在Role對象中,需要一個Set集合來記住Privilege的關系【顯示角色的時候,應該把所有權限顯示很出來】。

所以應該在UserDao有獲取某用戶所有的角色的方法

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

        try {

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

            //根據用戶id查詢所有角色,重點就在角色上,所以要有role表。然后查詢user_role表,就可以鎖定用戶id對應的角色了!
            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有獲取所有權限的方法



    //得到某角色的所有權限【權限表、權限和角色關系表】
    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);
        }
    }

我們既然能獲取得到用戶所有的角色了,獲取得到角色所有的權限了。那自然我們就應該有修改用戶的角色功能,修改角色的權限的功能啦!

我們先來分析一下它怎么寫:要修改用戶所擁有的角色,應該知道修改用戶是哪一個,所以需要用戶的id或者User對象!修改的角色是什么,需要Role對象或者裝載Role對象的集合!

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


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

        try {

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

            //先把用戶原來的所有角色刪掉了
            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("添加權限失敗了!");
        }
        
    }

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

    //為某個角色授權
    public void addPrivilege2Role(Role role, List privileges) {

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


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

            //賦予角色新的權限
            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);
        }
    }
更新

剛才又思考了一下:

其實我們并不需要在User類用使用集合來維護Role,在Role中使用集合來維護Privilege。在原本的做法我們已經看到了,我們完全是不需要這兩個變量也能完成效果的。

那么,現在問題就來了。什么時候我們才需要在實體中使用變量來維護多的一方的關系呢???我覺得是這樣的:當我們在查詢一方數據的時候,另一方的數據也同時需要展示。那么此時我們就應該使用集合來維護多的一方數據了。

基于上面一個例子,就比如:訂單與訂單項。當我們查看訂單的時候,同時一定會把所有的訂單項都列舉出來。

再比如:當我們查看購物車的時候,就需要把所有的購物項都列舉出來。

而我們使用展示用戶的時候,并不需要第一時間就把角色列舉出來,而是通過超鏈接來查看用戶下的角色,基于這種情況,我覺得我們是不用使用集合變量來維護多的一方的數據的。

這就跟Hibernate的懶加載差不多。用到關聯關系的數據的時候才加載,沒有用到的時候就先不查詢數據庫。

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

開發BusinessService UserService
    public class UserService {
    
    
        UserDao userDao = new UserDao();
    
        //添加用戶
        public void addUser(User user) {
    
            userDao.addUser(user);
        }
    
        //根據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);
        }
    
        //根據id查找角色
        public Role findRole(String id) {
            return roleDao.find(id);
        }
    
        //獲取所有的角色
        public List getAllRole() {
            return roleDao.getAll();
        }
    
        //獲取角色所有的權限
        public List getRolePrivilege(String role_id) {
            return roleDao.getPrivileges(role_id);
        }
    
        //修改角色的權限
        public void updateRolePrivilege(Role role, List privileges) {
            roleDao.addPrivilege2Role(role, privileges);
        }
    }

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

提供頁面界面的Servlet

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

顯示頁面的JSP

    
用戶名:
密碼:

處理表單數據的Servlet

        //得到客戶端傳遞進來的參數
        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);
        
    }

效果:

顯示用戶

提供頁面界面的Servlet

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

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

顯示頁面JSP



    對不起,暫時沒有任何客戶



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

效果:

為用戶添加角色

在顯示用戶的基礎上,應該添加為用戶授權角色的超鏈接。


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

效果:

處理顯示授權頁面的Servlet


        //得到客戶端傳遞過來的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();

        //為用戶授權的JSP頁面也應該顯示用戶的信息,所以把User對象也傳遞過去給JSP頁面
        User user = userService.findUser(user_id);

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

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

授權頁面JSP



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

效果:

處理表單數據并為用戶添加角色的Servlet


        //得到傳遞進來的role_id
        String[] ids = request.getParameterValues("role_id");

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

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

            //通過id獲取得到Role對象,再把對象用List集合裝載起來
            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);

效果:

角色模塊 添加角色

提供添加角色頁面的Servlet

        //直接跳轉到jsp頁面即可
        request.getRequestDispatcher("WEB-INF/jsp/AddRole.jsp").forward(request, response);

顯示頁面JSP


    
角色名稱
詳細描述

處理表單數據并添加角色的Servlet


        //得到客戶端帶過來的數據
        String name = request.getParameter("name");
        String description = request.getParameter("description");

        try {
            //創建對象并封裝數據
            Role role = new Role();
            role.setId(WebUtils.makeId());
            role.setName(name);
            role.setDescription(description);

            //調用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);

效果:

查看所有的角色

提供頁面的Servlet


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

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

顯示頁面JSP

    
        您還沒有任何角色,請添加!
    
    
    
        
                
角色名稱 描述
${role.name} ${role.description}

效果

為角色授權

與上面是類似的,我們要在查看角色的時候,添加授權的功能!

        
            
                ${role.name}
                ${role.description}
                
                    
                        為角色授權
                    
                    刪除角色
                    修改角色
                
            
        

效果:

提供顯示權利頁面的Servlet

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

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

        //得到當前角色所有的權利
        List rolePrivilege = roleService.getRolePrivilege(role_id);

        //得到系統所有的權利
        PrivilegeService privilegeService = new PrivilegeService();
        List allPrivilege = privilegeService.getAllPrivileges();

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

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

顯示頁面JSP


    
角色名稱 ${role.name}
當前角色擁有的權利 ${privi.name}
系統擁有的所有權利
<%--讓服務器知道要修改哪一個用戶,就要把用戶的id傳遞過去--%> ${privileges.name}

效果:

處理表單數據并添加角色權利的Servlet


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

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


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

            //得到權利對象,用List對象裝載起來
            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","為角色添加權利成功!");

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

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

效果:

權限模塊 添加權限

提供添加權限頁面的Servlet

        //直接跳轉到jsp頁面
        request.getRequestDispatcher("/WEB-INF/jsp/AddPrivilege.jsp").forward(request, response);

顯示頁面JSP


    
權限名字
權限描述

效果:

處理表單數據,并添加權限的Servlet

        //得到瀏覽器帶過來的數據
        String name = request.getParameter("name");
        String description = request.getParameter("description");

        //封裝數據到Privilege對象
        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","添加權限成功!");

        } catch (Exception e) {
            e.printStackTrace();
            request.setAttribute("message", "添加權限失?。?);
        }

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

效果:

查看所有權限

提供頁面的Servlet



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

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

顯示權限頁面的JSP


    
        您還沒添加任何的權限
    
    
    
        
                
權限名稱 描述 操作
${privilege.name} ${privilege.description} 刪除權限 修改權限

效果:

用分幀把功能拼接

head頁面

    
    
    

XX管理系統

left頁面

    
    
    用戶管理



角色管理



權限管理



body頁面是空白的!

index頁面:


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

效果:

過濾器

過濾器主要的工作就是:點擊超鏈接時,過濾器會檢測該點擊者是否有權限進入頁面進行操作(CURD)。

這里我們是這樣子做的:uri作為key,權限作為value,構成一個Map集合。當用戶請求資源的時候,判斷該資源是否需要權限,如果需要權限,就判斷該用戶是否登陸了,如果登陸了,就判斷該用戶有沒有權限去訪問該資源!

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

補充的代碼

    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


        //獲取表單數據
        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","用戶名或密碼出錯了??!");
        }

        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;

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

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

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

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

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

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

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


    public void destroy() {
    }

測試

總結要點

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

②:用戶與角色,角色與權限都是多對多的關系

③:按照數據庫范式,我們會創建5張實體表,其中兩張是代表著:用戶與角色、角色與權限的關系表。角色這個字段在外鍵中,不能同名!

④:無論是角色、用戶、權限都有這三個方法:得到所有的權限(角色、用戶)、添加權限(角色、用戶)、權限的id得到權限(角色、用戶)對象

⑤:根據id得到具體的對象方法的意義:在web顯示層只能通過id來標識著這個對象,然而在后端常常使用的是對象,于是就有了這個方法。

⑥:多對多之間的關系,在程序中并不是都要在其類上定義一個集合來記住對方。當顯示用戶時,需要顯示角色,但是顯示角色時,一般我們是不需要顯示用戶的信息的。因此在角色上,并不需要維護一個集合來記住所有的用戶

⑦:得到用戶的所有角色:傳入的參數必定有具體的用戶或角色,所以id必須是外界傳遞進來的?!镜玫浇巧乃袡嘞奘峭怼?/p>

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

⑨:在添加用戶角色的時候,要把用戶的id通過隱藏域傳遞進去給服務器端,不然是不知道要修改的是哪一個用戶的角色的。【修改角色的權限是同理】

⑩:frameset和frame來實現前臺的分幀,target指定在哪里顯示具體的數據

①①:在init()方法中用一個Map集合,以uri作為key,以具體的權限作為值來實現過濾

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

①③:如果登錄了,就得到用戶所有的權限,權限用一個Set集合裝載,遍歷Set集合,使用contains()方法就可以查看出有沒有對應的權限了。

①④:使用contains()方法需要在權限類上重寫hashCode()和equals()方法的。因為我們比較的是字符串。

如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章的同學,想要獲取更多的Java資源的同學,可以關注微信公眾號:Java3y

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68599.html

相關文章

  • 基于javaweb+jsp的機房設備管理系統

    摘要:基于的機房設備管理系統部分代碼實現機房號容納人數介紹狀態 基于javaweb+jsp的機房設備管理系統 JavaWeb JavaBean JSP MVC MySQL...

    Me_Kun 評論0 收藏0
  • 基于javaweb+jsp的醫院信息管理系統

    摘要:基于的醫院信息管理系統代碼實現提交取消是否掛號否否 基于javaweb+jsp的醫院信息管理系統 代碼實現 }) ...

    gitmilk 評論0 收藏0
  • 基于javaweb+jsp的新生報道管理系統

    摘要:基于的新生報道管理系統部分代碼實現新生報道管理系統新生報道管理系統 基于javaweb+jsp的新生報道管理系統 JavaWeb JavaBean JSP MVC ...

    genefy 評論0 收藏0
  • 基于javaweb+jsp的學生宿舍管理系統

    摘要:基于的學生宿舍管理系統部分代碼實現樓棟不能為空編輯表單提交之前進行檢查,如果,則不允許提交根據獲取值姓名不能為空電話不能為空側邊欄 基于javaweb+jsp的學生...

    DandJ 評論0 收藏0
  • 基于javaweb+jsp的超市管理系統

    摘要:基于的超市管理系統代碼實現側邊欄類型不能為空入庫時間數 基于javaweb+jsp的超市管理系統 代碼實現 ...

    aisuhua 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<