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

資訊專欄INFORMATION COLUMN

圖書管理系統【用戶、購買、訂單模塊、添加權限】

kk_miles / 1953人閱讀

摘要:于是我們想要為之前的項目添加權限控制只有用戶有權限的時候,后臺管理才可以進行相對應的操作實現思路之前我們做權限管理系統的時候,是根據用戶請求的來判斷該鏈接是否需要權限的。直接是用戶和權限之間的關系了。

用戶模塊

要登陸后才能購買,因此我們先寫購買模塊.

設計實體
    private String id;
    private String username;
    private String password;
    private String email;
    private String cellphone;
    private String address;

    //各種setter、getter
設計數據庫表
CREATE TABLE user (

  id        VARCHAR(40) PRIMARY KEY,
  username  VARCHAR(20) NOT NULL,
  cellphone VARCHAR(20) NOT NULL,
  address   VARCHAR(40) NOT NULL,
  email     VARCHAR(30),
  password  VARCHAR(30) NOT NULL

);
編寫DAO
/**
 * 用戶的登錄注冊模塊
 * 1:登陸
 * 2:注冊
 * 3:根據id查找具體的用戶
 */
public class UserDaoImpl {



    public void register(User user) {

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

        String sql = "INSERT INTO user (id,username,cellphone,address,email,password) VALUES(?,?,?,?,?,?)";
        try {

            queryRunner.update(sql, new Object[]{user.getId(),user.getUsername(), user.getCellphone(), user.getAddress(), user.getEmail(), user.getPassword()});
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public User login(String username, String password) {

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

        String sql = "SELECT * FROM user WHERE username = ? AND password=?";
        try {

            return (User) queryRunner.query(sql, new Object[]{username, password}, new BeanHandler(User.class));
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public User find(String id) {

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

        String sql = "SELECT * FROM user WHERE id=?";
        try {

            return (User) queryRunner.query(sql, id, new BeanHandler(User.class));
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

}
測試DAO
public class UserDemo {
    UserDaoImpl userDao = new UserDaoImpl();

    @Test
    public void add() {

        User user = new User();
        user.setId("1");
        user.setUsername("zhong");
        user.setPassword("123");
        user.setCellphone("10085");
        user.setAddress("廣州蘿崗");
        user.setEmail("40368324234234@QQ.com");

        userDao.register(user);
    }

    @Test
    public void find() {

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

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

    @Test
    public void login() {
        String username = "zhong";
        String password = "123";
        User user = userDao.login(username, password);

        System.out.println(user.getAddress());
    }
}
抽取DAO
public interface UserDao {
    void register(User user);

    User login(String username, String password);

    User find(String id);
}
編寫Service
    private UserDao userDao = DaoFactory.getInstance().createDao("zhongfucheng.dao.impl.UserDaoImpl", UserDao.class);

    public void registerUser(User user) {
        userDao.register(user);
    }
    
    public User loginUser(String username,String password) {
        return userDao.login(username, password);
    }
    
    public User findUser(String id) {
        return userDao.find(id);
    }
前臺樣式

head.jsp

用戶名: 密碼:

head.css

#body {
    position: relative;
}
#user {
    position: absolute;
    margin-top: 130px;
    margin-left: 1364px;
}

效果:

實現登陸注冊功能

當點擊登陸按鈕的時候,把數據帶過去給Servlet,讓Servlet調用BusinessService方法,實現登陸。注冊同理.....因此,我們需要用到JavaScript代碼

head.jsp


用戶名: 密碼:
      歡迎您:${user.username}    注銷

javaScript代碼

    

UserServlet


        String method = request.getParameter("method");

        BussinessServiceImpl service = new BussinessServiceImpl();
        if (method.equals("login")) {

            try {
                //得到頁面傳遞過來的數據
                String username = request.getParameter("username");
                String password = request.getParameter("password");
                User user = service.loginUser(username, password);

                request.getSession().setAttribute("user",user);
                request.getRequestDispatcher("/client/head.jsp").forward(request, response);

            } catch (Exception e) {
                request.setAttribute("message", "登陸失敗了!");
                request.getRequestDispatcher("/message.jsp").forward(request, response);
            }

        } else if (method.equals("register")) {

            try {
                //得到JSP傳遞過來的數據,封裝成Bean對象
                User user = WebUtils.request2Bean(request, User.class);
                user.setId(WebUtils.makeId());

                service.registerUser(user);

                request.setAttribute("message", "注冊成功了!");

            } catch (Exception e) {
                e.printStackTrace();
                request.setAttribute("message", "注冊失敗了!");
            }
            request.getRequestDispatcher("/message.jsp").forward(request, response);
        } else if (method.equals("Logout")) {

            //銷毀session
            request.getSession().invalidate();

            //回到首頁
            request.getRequestDispatcher("/client/head.jsp").forward(request, response);

        }
購買模塊

在顯示圖書的時候,順便添加購買的超鏈接

    
  • 購買
  • 設計購物車實體

    如果不清楚為什么這樣設計,可參考我之前的博文:http://blog.csdn.net/hon_3y/article/details/56481439#t5

    Cart實體

    public class Cart {
    
        private Map map = new HashMap<>();
        private double price;
    
    
        //提供把商品添加到購物的功能
        public void addBook2Cart(Book book) {
    
            //得到對應的購物項
            CartItem cartItem = map.get(book.getId());
    
            //如果是null,說明購物車還沒有該購物項
            if (cartItem == null) {
                cartItem = new CartItem();
                cartItem.setQuantity(1);
                cartItem.setBook(book);
                cartItem.setPrice(book.getPrice());
    
                //把購物項加到購物車中
                map.put(book.getId(), cartItem);
            } else {
    
                //如果購物車有該購物項了,那么將購物項的數量+1
                cartItem.setQuantity(cartItem.getQuantity() + 1);
            }
        }
    
    
        //購物車的價錢是購物項價錢的總和
        public double getPrice() {
    
            double totalPrice = 0;
            for (Map.Entry me : map.entrySet()) {
                CartItem cartItem = me.getValue();
                totalPrice += cartItem.getPrice();
            }
    
            return totalPrice;
        }
    
        public Map getMap() {
            return map;
        }
    
        public void setMap(Map map) {
            this.map = map;
        }
    
    
        public void setPrice(double price) {
            this.price = price;
        }
    }
    
    設計購物項實體
    public class CartItem {
    
        private Book book;
        private double price;
        private int quantity;
    
        public double getPrice() {
            return this.book.getPrice() * this.quantity;
        }
    
        public void setPrice(double price) {
            this.price = price;
        }
    
        public Book getBook() {
            return book;
        }
    
        public void setBook(Book book) {
            this.book = book;
        }
        public int getQuantity() {
            return quantity;
        }
    
        public void setQuantity(int quantity) {
            this.quantity = quantity;
        }
    }
    處理用戶想要買的書籍Servlet
        
  • 購買
  • BuyServlet

            BussinessServiceImpl service = new BussinessServiceImpl();
    
            //先檢查該用戶是否登陸了。
            User user = (User) request.getSession().getAttribute("user");
            if (user == null) {
                request.setAttribute("message", "您還沒登陸,請登陸了再來購買");
                request.getRequestDispatcher("/message.jsp").forward(request, response);
                return ;
            }
    
            //如果登陸了...
    
            //得到該用戶的購物車
            Cart cart = (Cart) request.getSession().getAttribute("cart");
            if (cart == null) {
                cart = new Cart();
                request.getSession().setAttribute("cart", cart);
            }
    
            //得到用戶想買的書籍
            String book_id = request.getParameter("book_id");
            Book book = service.findBook(book_id);
    
            //把書籍添加到購物車中
            service.buyBook(cart, book);
            request.setAttribute("message", "該商品已添加到購物車中");
            request.getRequestDispatcher("/message.jsp").forward(request,response);
    提供顯示購物車商品的Servlet
            //先判斷該用戶是否登陸了
            User user = (User) request.getSession().getAttribute("user");
            if (user == null) {
                request.setAttribute("message", "您還沒有登陸呢!");
                request.getRequestDispatcher("/message.jsp").forward(request, response);
                return;
            }
    
            //如果登陸了.....
            Cart cart = (Cart) request.getSession().getAttribute("cart");
    
            //把該用戶的購物車給JSP頁面顯示
            request.setAttribute("cart", cart);
            request.getRequestDispatcher("/client/listCart.jsp").forward(request, response);
    顯示購物車的JSP頁面
    
    
        您還沒有購買過任何商品哦!!!
    
    
    
    
            

    您購物車下有如下的商品:


    書名: 作者: 數量: 價錢:
    ${cartItme.value.book.name} ${cartItme.value.book.author} ${cartItme.value.quantity} ${cartItme.value.price}
    效果:

    訂單模塊

    在前臺用戶界面中,當用戶要把購物車付款時,應該提供生成訂單的超鏈接....

    設計訂單實體

    訂單應該包含id,收貨人信息,下單的時間,訂單的總價,訂單的狀態【有無發貨】..而不應該包含商品的信息的。商品的信息用一個專門的”訂單項“來表示

    一個訂單對應多個訂單項,這是一對多的關系!

        private String id;
        
        //下單的時間、日期、狀態
        private Date date;
        private double price;
        private boolean state;
        
        //一個用戶可以有多個訂單,把用戶記住
        private String user_id;
    
        //一個訂單中有多個訂單項
        private Set items = new HashSet<>();
    
        //各種的setter和getter
    
    
    設計訂單項實體
        private String id;
    
    
        //一本書對應多個訂單項,訂單項一定是由書組成,記住書
        private String book_id;
    
        private double price;
        private int quantity;
    
        //各種的setter和getter
    設計數據庫表

    訂單表

    mysql不能創建名為”order”的表,后邊加個s就可以

    
    CREATE TABLE orders (
      id      VARCHAR(40) PRIMARY KEY,
      date    DATE        NOT NULL,
      user_id VARCHAR(40) NOT NULL,
      state   BOOLEAN,
      price   DOUBLE,
      CONSTRAINT user_id_FK FOREIGN KEY (user_id) REFERENCES user (id)
    );
    

    訂單項表:

    CREATE TABLE orderItem (
      id       VARCHAR(40) PRIMARY KEY,
      price    DOUBLE,
      quantity INT,
      order_id VARCHAR(40) ,
      book_id  VARCHAR(40) ,
      CONSTRAINT order_id_FK FOREIGN KEY (order_id) REFERENCES orders (id),
      CONSTRAINT book_id_FK FOREIGN KEY (book_id) REFERENCES book (id)
    );
    

    表之間的結構:

    設計Dao
    public class OrderDaoImpl implements zhongfucheng.dao.OrderDao {
    
        @Override
        public void addOrder(Order order) {
            QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
            String sql1 = "INSERT INTO orders(id,ordertime,user_id,state,price) VALUES(?,?,?,?,?)";
            try {
                //訂單的基本信息
                queryRunner.update(sql1, new Object[]{order.getId(), order.getOrdertime(), order.getUser_id(), order.isState(), order.getPrice()});
    
                //訂單項的信息
                String sql2 = "INSERT INTO orderItem(id,price,quantity,order_id,book_id) VALUES(?,?,?,?,?)";
    
                Set items = order.getItems();
    
                for (OrderItem item : items) {
                    queryRunner.update(sql2, new Object[]{item.getId(), item.getPrice(), item.getQuantity(), item.getOrder_id(), item.getBook_id()});
                }
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    
        @Override
        public Order findOrder(String id) {
            QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
    
            Order order;
            try {
                //找出訂單的基本信息
                String sql = "SELECT * FROM orders WHERE id=?";
                order = (Order) queryRunner.query(sql, new BeanHandler(Order.class), new Object[]{id});
    
                //找出訂單的所有訂單項
                String sql2 = "SELECT * FROM orderItem WHERE order_id=?";
                List list = (List) queryRunner.query(sql2, new BeanListHandler(OrderItem.class), new Object[]{order.getId()});
    
                System.out.println("這是數據庫拿到的list集合:"+list.size());
    
    
                //將所有訂單項裝到訂單里邊
                order.getItems().addAll(list);
                System.out.println("這是數據庫拿到的"+order.getItems().size());
    
    
                //找出該訂單是屬于哪一個用戶的
                String sql3 = "SELECT * FROM orders o,user u WHERE o.user_id=u.id AND o.id=? ";
                User user = (User) queryRunner.query(sql3, new BeanHandler(User.class), new Object[]{order.getId()});
    
                order.setUser_id(user.getId());
                return order;
    
    
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    
    
        //更新訂單的狀態
        public void updateState(String id) {
    
            QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
    
            String sql = "UPDATE orders SET state=? WHERE id=?";
    
            try {
                queryRunner.update(sql, new Object[]{true, id});
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    
        //查看已經發貨或沒發貨的訂單信息
        public List getAllOrder(boolean state) {
            QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
    
            String sql = "SELECT * FROM orders WHERE state=? ";
            try {
                return (List) queryRunner.query(sql, new BeanListHandler(Order.class), new Object[]{state});
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    
        //通過用戶的id查找用戶的訂單,可能不止一個
        public List findUserOrder(String user_id) {
            QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
    
            String sql = "SELECT * FROM orders WHERE user_id=? ";
    
            try {
                return List queryRunner.query(sql, new BeanHandler(Order.class), new Object[]{user_id});
    
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
    
        }
    }
    
    二次更新

    在編寫dao的時候,尤其是Add方法。它是將所有數據都封裝到Order對象上,然后取出數據,把數據插入到數據表中

    其實,我們的Order和OrderItem的操作可以分開。OrderItem也可以另外編寫一個Dao,那么我們在插入完Order對象之后,得到Order對象返回的主鍵,再調用OrderItemDao的方法來插入OrderItem的數據,這樣我覺得會讓代碼清晰一些。

    在OrderItemDao中接收的是一個List,因為我們一個訂單會對應多個訂單項。

    抽取成DAO接口
    public interface OrderDao {
        void addOrder(Order order);
    
        Order findOrder(String id);
    
        List getAllOrder(boolean state);
    
        void updateState(String user_id);
    
         List findUserOrder(String user_id);
    }
    
    BussinessService
        private OrderDao orderDao = DaoFactory.getInstance().createDao("zhongfucheng.dao.impl.OrderDaoImpl", OrderDao.class);
        public void createOrder(Cart cart, User user) {
    
            //訂單的基本信息
            String order_id = WebUtils.makeId();
            Order order = new Order();
            order.setId(order_id);
            order.setPrice(cart.getPrice());
            order.setOrdertime(new Date());
            order.setState(false);
            order.setUser_id(user.getId());
    
    
            //訂單項的基本信息
            //得到每個購物項,購物項就作為訂單項
            for (Map.Entry me : cart.getMap().entrySet()) {
    
                OrderItem orderItem = new OrderItem();
                CartItem cartItem = me.getValue();
    
                orderItem.setId(WebUtils.makeId());
                orderItem.setPrice(cartItem.getPrice());
                orderItem.setBook_id(cartItem.getBook().getId());
                orderItem.setQuantity(cartItem.getQuantity());
                orderItem.setOrder_id(order_id);
                order.getItems().add(orderItem);
            }
    
            orderDao.addOrder(order);
    
        }
    
        public Order findOrder(String user_id) {
    
            return orderDao.findOrder(user_id);
        }
    
        public List getAllOrder(boolean state) {
            return orderDao.getAllOrder(state);
        }
    
        public void sendOutOrder(String id) {
    
            orderDao.updateState(id);
        }
    
        public List findUserOrder(String user_id) {
            return orderDao.findUserOrder(user_id);
        }
    
    生成訂單的Servlet
    
            BussinessServiceImpl service = new BussinessServiceImpl();
    
            //檢查該用戶的購物車是否有商品
            Cart cart = (Cart) request.getSession().getAttribute("cart");
            if (cart == null) {
                request.setAttribute("message", "您購物車沒有商品,無法生成訂單");
                request.getRequestDispatcher("/message.jsp").forward(request, response);
                return;
            }
    
            //如果有商品,得到當前用戶
            User user = (User) request.getSession().getAttribute("user");
            service.createOrder(cart, user);
            request.setAttribute("message", "訂單已經生成了,準備好錢來收貨把");
            request.getRequestDispatcher("/message.jsp").forward(request, response);
            return;
    
    用戶查詢自己的訂單Servlet
        查看訂單
            BussinessServiceImpl service = new BussinessServiceImpl();
    
            //檢查該用戶是否登陸了
            User user = (User) request.getSession().getAttribute("user");
            if (user == null) {
                request.setAttribute("message", "您還沒登陸,等您登陸了再來看把");
                request.getRequestDispatcher("/message.jsp").forward(request, response);
                return;
            }
    
            //用戶登陸了!
            Order order = service.findUserOrder(user.getId());
    
            //交給相對應的JSP 顯示
            request.setAttribute("order", order);
            request.setAttribute("user",user);
            request.getRequestDispatcher("/client/listOrder.jsp").forward(request, response);
            return ;
    顯示訂單數據的JSP
    
        您還沒有下過任何訂單!!
    
    
    
    
    
        
    下單人: 訂單時間 訂單狀態 訂單價錢
    ${user.username} ${order.ordertime} ${order.state==false?"未發貨":"已發貨"} ${order.price}
    效果:

    后臺查詢訂單的狀況Servlet
    待處理訂單
    已發貨訂單
            BussinessServiceImpl service = new BussinessServiceImpl();
            String state = request.getParameter("state");
    
            if (state.equals("true")) {
                List list = service.getAllOrder(true);
                request.setAttribute("list",list);
    
            } else if (state.equals("false")) {
                List list = service.getAllOrder(false);
                request.setAttribute("list", list);
            }
    
    
            request.getRequestDispatcher("/background/listOrder.jsp").forward(request, response);
    顯示訂單狀況的JSP
    
    
        還沒有任何訂單哦!
    
    
    
    
    
        
                
    下單人: 訂單時間 訂單狀態 訂單價錢 操作
    ${order.user_id} ${order.ordertime} ${order.state==false?"未發貨":"已發貨"} ${order.price} 查看詳細信息 刪除
    查看具體訂單的詳細信息Servlet
            BussinessServiceImpl service = new BussinessServiceImpl();
    
            //得到用戶想要查看詳細信息的表單
            String order_id = request.getParameter("order_id");
    
            Order order = service.findOrder(order_id);
    
            //將該order對象給相對應的JSP顯示
            request.setAttribute("order", order);
            request.getRequestDispatcher("/background/listDetail.jsp").forward(request, response);
    
    查看具體訂單的詳細信息JSP
    
            
    書籍的編號 價錢 數量 操作
    ${item.book_id} ${item.price} ${item.quantity} 發貨
    處理發貨的Servlet
    
            BussinessServiceImpl service = new BussinessServiceImpl();
            String id = request.getParameter("id");
    
            service.sendOutOrder(id);
            request.setAttribute("message", "已發貨!");
            request.getRequestDispatcher("/message.jsp").forward(request, response);
            return;
    效果:

    添加權限控制

    目前為止,我們已經學習了動態代理技術和注解技術了。于是我們想要為之前的bookStore項目添加權限控制.....

    只有用戶有權限的時候,后臺管理才可以進行相對應的操作.....

    實現思路

    之前我們做權限管理系統的時候,是根據用戶請求的URI來判斷該鏈接是否需要權限的。這次我們使用動態代理的技術和注解來判斷:用戶調用該方法時,檢查該方法是否需要權限...

    根據MVC模式,我們在web層都是調用service層來實現功能的。那么我們具體的思路是這樣的:

    web層調用service層的時候,得到的并不是ServiceDao對象,而是我們的代理對象

    在service層中的方法添加注解,如果方法上有注解,那么說明調用該方法需要權限...

    當web層調用代理對象方法的時候,代理對象會判斷該方法是否需要權限,再給出相對應的提示....

    設計實體、數據庫表

    上次我們做的權限管理系統是引入了角色這個概念的,這次主要為了練習動態代理和注解技術,就以簡單為主,不引入角色這個實體。直接是用戶和權限之間的關系了。

    Privilege實體
    public class Privilege {
    
        private String id ;
        private String name;
    
        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;
        }
    }
    
    數據庫表

    privilege表

    
    CREATE TABLE privilege (
    
      id   VARCHAR(40) PRIMARY KEY,
      name VARCHAR(40)
    
    );
    

    privilege和user是多對多的關系,于是使用第三方表來維護他們的關系

    user_privilege表

    
    CREATE TABLE user_privilege (
      privilege_id VARCHAR(40),
      user_id      VARCHAR(40),
    
      PRIMARY KEY (privilege_id, user_id),
      CONSTRAINT privilege_id_FK FOREIGN KEY (privilege_id) REFERENCES privilege(id),
      CONSTRAINT user_id_FK1 FOREIGN KEY (user_id) REFERENCES user(id)
    
    );
    
    
    添加測試數據

    為了方便,直接添加數據了。就不寫詳細的DAO了。

    在數據庫中添加了兩個權限

    為id為1的user添加了兩個權限

    編寫DAO

    后面在動態代理中,我們需要檢查該用戶是否有權限...那么就必須查找出該用戶擁有的哪些權限。再看看用戶有沒有相對應的權限

        //查找用戶的所有權限
        public List findUserPrivilege(String user_id) {
            QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
    
            String sql = "SELECT p.* FROM privilege p, user_privilege up WHERE p.id = up.privilege_id AND up.user_id = ?";
            try {
                return (List) queryRunner.query(sql, new Object[]{user_id}, new BeanListHandler(Privilege.class));
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    
    抽取到接口上
        List findUserPrivilege(String user_id);
    注解模塊

    編寫注解

    @Retention(RetentionPolicy.RUNTIME)
    public @interface permission {
        String value();
    }

    在Service層方法中需要權限的地方添加注解CategoryServiceImpl

        @permission("添加分類")
        /*添加分類*/
        public void addCategory(Category category) {
            categoryDao.addCategory(category);
        }
    
    
        /*查找分類*/
        public void findCategory(String id) {
            categoryDao.findCategory(id);
        }
    
        @permission("查找分類")
        /*查看分類*/
        public List getAllCategory() {
            return categoryDao.getAllCategory();
        }
    
    抽取Service

    把Service的方法抽取成ServiceDao。在Servlet中,也是通過ServiceFactory來得到Service的對象【和DaoFactory是類似的】

    CategoryService
        @permission("添加分類")
        /*添加分類*/ void addCategory(Category category);
    
        /*查找分類*/
        void findCategory(String id);
    
        @permission("查找分類")
        /*查看分類*/ List getAllCategory();
    
    ServiceFactory
    public class ServiceDaoFactory {
    
        private static final ServiceDaoFactory factory = new ServiceDaoFactory();
    
        private ServiceDaoFactory() {
        }
    
        public static ServiceDaoFactory getInstance() {
            return factory;
        }
    
    
        //需要判斷該用戶是否有權限
        public  T createDao(String className, Class clazz, final User user) {
    
            System.out.println("添加分類進來了!");
    
            try {
                //得到該類的類型
                final T t = (T) Class.forName(className).newInstance();
                //返回一個動態代理對象出去
                return (T) Proxy.newProxyInstance(ServiceDaoFactory.class.getClassLoader(), t.getClass().getInterfaces(), new InvocationHandler() {
    
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, PrivilegeException {
                        //判斷用戶調用的是什么方法
                        String methodName = method.getName();
                        System.out.println(methodName);
    
                        //得到用戶調用的真實方法,注意參數!!!
                        Method method1 = t.getClass().getMethod(methodName,method.getParameterTypes());
    
                        //查看方法上有沒有注解
                        permission permis = method1.getAnnotation(permission.class);
    
                        //如果注解為空,那么表示該方法并不需要權限,直接調用方法即可
                        if (permis == null) {
                            return method.invoke(t, args);
                        }
    
                        //如果注解不為空,得到注解上的權限
                        String privilege = permis.value();
    
                        //設置權限【后面通過它來判斷用戶的權限有沒有自己】
                        Privilege p = new Privilege();
                        p.setName(privilege);
    
                        //到這里的時候,已經是需要權限了,那么判斷用戶是否登陸了
                        if (user == null) {
    
                            //這里拋出的異常是代理對象拋出的,sun公司會自動轉換成運行期異常拋出,于是在Servlet上我們根據getCause()來判斷是不是該異常,從而做出相對應的提示。
                            throw new PrivilegeException("對不起請先登陸");
                        }
    
                        //執行到這里用戶已經登陸了,判斷用戶有沒有權限
                        Method m = t.getClass().getMethod("findUserPrivilege", String.class);
                        List list = (List) m.invoke(t, user.getId());
    
                        //看下權限集合中有沒有包含方法需要的權限。使用contains方法,在Privilege對象中需要重寫hashCode和equals()
                        if (!list.contains(p)) {
                            //這里拋出的異常是代理對象拋出的,sun公司會自動轉換成運行期異常拋出,于是在Servlet上我們根據getCause()來判斷是不是該異常,從而做出相對應的提示。
                            throw new PrivilegeException("您沒有權限,請聯系管理員!");
                        }
    
                        //執行到這里的時候,已經有權限了,所以可以放行了
                        return method.invoke(t, args);
                    }
                });
    
            } catch (Exception e) {
                new RuntimeException(e);
            }
            return null;
        }
    }
    PrivilegeExcetption

    當用戶沒有登陸或者沒有權限的時候,我們應該給用戶一些友好的提示....于是我們自定義了PrivilegeException

    public class PrivilegeException extends Exception {
    
        public PrivilegeException() {
            super();
        }
    
        public PrivilegeException(String message) {
            super(message);
        }
    
        public PrivilegeException(String message, Throwable cause) {
            super(message, cause);
        }
    
        public PrivilegeException(Throwable cause) {
            super(cause);
        }
    }
    

    我們繼承的是Exception,通過方法名拋出去。但是我們是通過代理對象調用方法的,于是sun公司的策略就是把它們轉換成運行期異常拋出去

    因此,我們就在Servlet上得到異常,再給出友好的提示。。

    效果:

    沒有登陸的時候:

    登陸了,但是沒有相對應的權限的時候

    登陸了,并且有權限

    要點總結

    該權限控制是十分優雅的,只要我在Service層中添加一個注解...那么當web層調用該方法的時候就需要判斷用戶有沒有該權限....

    外界調用Service層的方法是代理調用invoke()方法,我們在invoke()方法可以對其進行增強!

    invoke()方法內部就是在查詢調用該方法上有沒有注解,如果沒有注解,就可以直接調用。如果有注解,那么就得到注解的信息,判斷該用戶有沒有權限來訪問這個方法

    在反射具體方法的時候,必須記得要給出相對應的參數!

    在invoke()方法拋出的編譯時期異常,java會自動轉換成運行期異常進行拋出...

    使用contains()方法時,就要重寫該對象的hashCode()和equals()

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

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

    相關文章

    • 【JavaWeb】圖書管理系統【總結】

      摘要:存在則購物項的數量提供購買功能,參數是和。用戶想要購買商品時,判斷用戶是否登陸了,還要判斷購物車是否存在購物車使用來保存,不存在則創建。得到未發貨的全部訂單和已發貨的全部訂單,其實就是檢索出不同狀態的全部訂單。 感想 該項目是目前為止,我寫過代碼量最多的項目了.....雖然清楚是沒有含金量的【跟著視頻來寫的】,但感覺自己也在進步中...... 寫的過程中,出了不少的問題.....非常多...

      張率功 評論0 收藏0
    • Java3y文章目錄導航

      摘要:前言由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 前言 由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 由于更新比較頻繁,因此隔一段時間才會更新目錄導航哦~想要獲取最新原創的技術文章歡迎關注我的公眾號:Java3y Java3y文章目錄導航 Java基礎 泛型就這么簡單 注解就這么簡單 Druid數據庫連接池...

      KevinYan 評論0 收藏0
    • 圖書管理系統【JavaWeb:部署開發環境、解決分類、圖書、前臺頁面模塊

      摘要:前言鞏固開發模式,做一個比較完整的小項目成果圖該項目包含了兩個部分,前臺和后臺。前臺用于顯示后臺用于管理該項目可分為個模塊來組成分類模塊,用戶模塊,圖書模塊,購買模塊,訂單模塊。 前言 鞏固Servlet+JSP開發模式,做一個比較完整的小項目. 成果圖 該項目包含了兩個部分,前臺和后臺。 前臺用于顯示 showImg(https://segmentfault.com/img/remo...

      djfml 評論0 收藏0
    • 通過項目逐步深入了解Mybatis<三>

      摘要:場合常見一些明細記錄的展示,比如用戶購買商品明細,將關聯查詢信息全部展示在頁面時,此時可直接使用將每一條記錄映射到中,在前端頁面遍歷中是即可。作用將關聯查詢信息映射到一個對象中。 相關閱讀: 1、通過項目逐步深入了解Mybatis 2、 通過項目逐步深入了解Mybatis 本項目所有代碼及文檔都托管在 Github地址:https://github.com/zhisheng17/myb...

      khlbat 評論0 收藏0

    發表評論

    0條評論

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