本文目錄一覽:
什麼是Java類的訪問許可權?
在解釋訪問許可權控制之前,先看一個場景。
在學生信息管理系統中,有兩個類,分別是學生類和課程類,課程類提供了課程表和課程安排兩個方法,學生類可以調用課程類提供的課程表查看課程安排,但不能調用課程安排方法,該如何處理,此時就可以利用訪問許可權來進行控制。
在Java中,提供了四種訪問許可權控制:默認訪問許可權(包訪問許可權),public,private以及protected。
默認訪問許可權(default):即不加任何訪問修飾符,通常稱為「默認訪問模式「。該模式下,只允許在同一個包中進行訪問。
private: 對訪問許可權限制的最窄的修飾符,一般稱之為「私有的」。被其修飾的類、屬性以及方法只能被該類的對象訪問,其子類不能訪問,更不能允許跨包訪問。
protect: 介於public 和 private 之間的一種訪問修飾符,一般稱之為「保護的」。被其修飾的類、屬性以及方法只能被類本身的方法及子類訪問,即使子類在不同的包中也可以訪問。
public: Java語言中訪問限制最寬的修飾符,一般稱之為「公共的」。被其修飾的類、屬性以及方法不僅可以跨類訪問,而且允許跨包(package)訪問。下表列出了四種訪問許可權的控制粒度:
例1:
Main.java:
package com.cxh.test1;
public class Main {
/**
* @param args */
public static void main(String[] args)
{
// TODO Auto-generated method stub
People people = new People(“Tom”);
System.out.println(people.getName());
}
}
People.java
package com.cxh.test1;
class People { //默認訪問許可權(包訪問許可權)
private String name = null;
public People(String name)
{
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name)
{
this.name = name;
}
}
從代碼可以看出,修飾People類採用的是默認訪問許可權,而由於People類和Main類在同一個包中,因此People類對於Main類是可見的。
java怎麼實現許可權控制
提供一個思路哈:
1、user類中定義兩個方法,分別根據許可權名和許可權路徑判斷用戶是否有對應許可權
2、定義一個攔截器,攔截所有請求,根據路徑判斷是否有操作許可權
3、頁面調用user的許可權判斷方法,決定是否顯示相應的許可權
Java的訪問控制許可權有哪幾種?試以類格式形式列出Java的訪問控制。
訪問許可權的等級最大到最小依次是:public,protected,包訪問許可權(無關鍵字)和private。
成員的訪問許可權取得對某成員(屬性和方法)的實現方法有下面四種情況
1, 許可權設置為public; 2, 默認包訪問許可權,在同一包中的其他類,可以訪問; 3, 許可權設置為public或者protected,通過繼承的子類可以訪問; 4, 設置為private,提供訪問器和變異器方法(get/set);
下面介紹這四種許可權(相對成員而言)
1, 包訪問許可權,在同一包中的類可以訪問; 2, Public:介面訪問許可權,任何類都可以訪問; 3, Private:你無法訪問,除了包含該成員的類,其他類都可以訪問。 4, Protected:繼承訪問許可權,包括包訪問許可權。在同一包中,還有就是子類可以訪問。
類的訪問許可權類的訪問
只有兩種:包訪問許可權或public(用法同上) 如果不希望其他類擁有該類的訪問許可權,可以把這個來說有的構造器制定為private(比如單列模式)。
java如何做許可權管理
首先介紹下思路:
1、用戶表 user;
2、角色表 role;
3、菜單 menu;
4、角色菜單許可權表 role_menu;
5、用戶菜單許可權表 user_menu;
如圖:
根據用戶角色取出該角色所有許可權,並對用戶進行許可權分配;注意菜單的按鈕(新增、刪除、修改)許可權是放在中間表(user_menu)中的;
1、新增用戶時,是要根據用戶角色進行分配許可權的 一定記得批量添加;批量、批量、批量,重要的事情說三遍,不要查詢角色許可權,然後for循環,這樣效率太低了;
SQL如下:
INSERT INTO sys_user_menu(UserId, MenuId, DelPower, UpdPower, InsPower, ViewPower)
SELECT #{userId} UserId, MenuId, 1 DelPower, 1 UpdPower, 1 InsPower, 1 ViewPower FROM sys_role_menu WHERE RoelId = #{roleId}
updPower 默認都是有的 所以都是1,這樣根據角色查詢出許可權直接添加,響應時間大大提升;
2、修改用戶角色也要記得重新分配用戶許可權哦!這個不能忘,可以用上面的方法;
業務方法:
如果角色沒有修改,是不用重新分配許可權的,所有userRole 重置為 null,如果角色修改則刪除原許可權,重新進行分配;
3、最後要優化的就是根據用戶查詢許可權的時候啦,我最開始是這樣做的,查詢角色許可權,用戶許可權,返回到前端,前端進行處理;結果就是很卡 基本上要三到四秒,
解決方案,一步到位;一個查詢返回全部數據。
如下SQL:
SELECT menu.MenuId id, ParentId pid, MenuName text,
(SELECT COUNT(1) FROM sys_user_menu WHERE UserId = #{userId} AND MenuId = sm.MenuId) isShow,
(SELECT CONCAT(
(CASE WHEN smenu.InsPower = 1 THEN 1 ELSE 0 END), ‘,’,
(CASE WHEN smenu.DelPower = 1 THEN 1 ELSE 0 END), ‘,’,
(CASE WHEN smenu.UpdPower = 1 THEN 1 ELSE 0 END), ‘,’,
(CASE WHEN smenu.ViewPower = 1 THEN 1 ELSE 0 END))
FROM sys_user_menu smenu WHERE smenu.UserId = #{userId}
AND smenu.MenuId = sm.MenuId) MenuInfo
FROM sys_role_menu sm INNER JOIN sys_menu menu on sm.MenuId = menu.MenuId
WHERE RoelId = #{roleId}
首先根據 角色ID查詢出許可權,然後子查詢用戶是否有該許可權,有返回1 木用返回 0;
最後按鈕許可權 我是直接拼接成字元串,分別對應 添加、刪除、修改、查看 1 有該按鈕 0 沒有該按鈕;
優化後 不管是添加、修改用戶,載入用戶許可權都能控制在 1~2 秒;
原創文章,作者:AEKQ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/145140.html