W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
java.lang.Object
|---java.lang.SecurityManager
public class SecurityManager
extends Object
安全管理器是一個(gè)允許應(yīng)用程序?qū)崿F(xiàn)安全策略的類。 它允許應(yīng)用程序在執(zhí)行可能不安全或敏感的操作之前確定該操作是什么以及是否在允許執(zhí)行該操作的安全上下文中嘗試該操作。 應(yīng)用程序可以允許或禁止該操作。
SecurityManager 類包含許多名稱以單詞 check 開頭的方法。 在這些方法執(zhí)行某些潛在敏感操作之前,這些方法由 Java 庫中的各種方法調(diào)用。 這種檢查方法的調(diào)用通常如下所示:
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkXXX(argument, . . . );
}
因此,安全管理器有機(jī)會(huì)通過拋出異常來阻止操作完成。 如果操作被允許,安全管理器例程會(huì)簡(jiǎn)單地返回,但如果操作不被允許,則拋出 SecurityException。 此約定的唯一例外是 checkTopLevelWindow,它返回一個(gè)布爾值。
當(dāng)前的安全管理器由 System.class 中的 setSecurityManager 方法設(shè)置。 當(dāng)前的安全管理器通過 getSecurityManager 方法獲取。
特殊方法 SecurityManager#checkPermission(java.security.Permission) 確定是否應(yīng)授予或拒絕由指定權(quán)限指示的訪問請(qǐng)求。 默認(rèn)實(shí)現(xiàn)調(diào)用
AccessController.checkPermission(perm);
如果請(qǐng)求的訪問被允許,checkPermission 會(huì)安靜地返回。如果被拒絕,則會(huì)引發(fā) SecurityException。
從 Java 2 SDK v1.2 開始,SecurityManager 中其他每個(gè)檢查方法的默認(rèn)實(shí)現(xiàn)是調(diào)用 SecurityManager 的 checkPermission 方法來確定調(diào)用線程是否有權(quán)執(zhí)行請(qǐng)求的操作。
請(qǐng)注意,只有一個(gè)權(quán)限參數(shù)的 checkPermission 方法總是在當(dāng)前執(zhí)行線程的上下文中執(zhí)行安全檢查。有時(shí),應(yīng)該在給定上下文中進(jìn)行的安全檢查實(shí)際上需要在不同的上下文中進(jìn)行(例如,從工作線程中)。針對(duì)這種情況提供了包含上下文參數(shù)的 SecurityManager#getSecurityContext 方法和 SecurityManager#checkPermission(java.security.Permission, java.lang.Object) 方法。 getSecurityContext 方法返回當(dāng)前調(diào)用上下文的“快照”。 (默認(rèn)實(shí)現(xiàn)返回一個(gè) AccessControlContext 對(duì)象。)示例調(diào)用如下:
Object context = null;
SecurityManager sm = System.getSecurityManager();
if (sm != null) context = sm.getSecurityContext();
checkPermission 方法除了權(quán)限外還接受上下文對(duì)象,根據(jù)該上下文而不是當(dāng)前執(zhí)行線程的上下文做出訪問決策。 因此,不同上下文中的代碼可以調(diào)用該方法,傳遞權(quán)限和先前保存的上下文對(duì)象。 使用如上例中獲得的 SecurityManager sm 的示例調(diào)用如下:
if (sm != null) sm.checkPermission(permission, context);
權(quán)限分為以下類別:文件、套接字、網(wǎng)絡(luò)、安全性、運(yùn)行時(shí)、屬性、AWT、反映和可序列化。管理這些不同權(quán)限類別的類是 java.io.FilePermission、java.net.SocketPermission、java.net.NetPermission、java.security.SecurityPermission、java.lang.RuntimePermission、java.util.PropertyPermission、java.awt.AWTPermission、 java.lang.reflect.ReflectPermission 和 java.io.SerializablePermission。
除了前兩個(gè)(FilePermission 和 SocketPermission)之外的所有都是 java.security.BasicPermission 的子類,它本身是頂級(jí)權(quán)限類 java.security.Permission 的抽象子類。 BasicPermission 定義了包含遵循分層屬性命名約定的名稱的所有權(quán)限所需的功能(例如,“exitVM”、“setFactory”、“queuePrintJob”等)。星號(hào)可能出現(xiàn)在名稱的末尾,跟在“.”之后,或者單獨(dú)出現(xiàn),表示通配符匹配。例如:“一”。 or "" 有效,"a" 或 "ab" 無效。
FilePermission 和 SocketPermission 是頂級(jí)權(quán)限類 (java.security.Permission) 的子類。與 BasicPermission 子類直接從 Permission 而不是從 BasicPermission 中使用的類相比,此類具有更復(fù)雜的名稱語法。例如,對(duì)于 java.io.FilePermission 對(duì)象,權(quán)限名稱是文件(或目錄)的路徑名。
一些權(quán)限類有一個(gè)“動(dòng)作”列表,它告訴對(duì)象允許的動(dòng)作。例如,對(duì)于 java.io.FilePermission 對(duì)象,操作列表(例如“讀、寫”)指定為指定文件(或指定目錄中的文件)授予哪些操作。
其他權(quán)限類用于“命名”權(quán)限 - 包含名稱但沒有操作列表的權(quán)限;您要么擁有命名權(quán)限,要么沒有。
注意:還有一個(gè) java.security.AllPermission 權(quán)限意味著所有權(quán)限。它的存在是為了簡(jiǎn)化可能需要執(zhí)行需要全部(或大量)權(quán)限的多項(xiàng)任務(wù)的系統(tǒng)管理員的工作。
修飾符和類型 | 字段 | 描述 |
---|---|---|
protected boolean | inCheck | 已棄用。 不推薦這種類型的安全檢查。 建議改用 checkPermission 調(diào)用。 |
構(gòu)造函數(shù) | 描述 |
---|---|
SecurityManager() | 構(gòu)造一個(gè)新的 SecurityManager。 |
修飾符和類型 | 方法 | 描述 |
---|---|---|
void | checkAccept(String host, int port) | 如果不允許調(diào)用線程接受來自指定主機(jī)和端口號(hào)的套接字連接,則拋出 SecurityException。 |
void | checkAccess(Thread t) | 如果不允許調(diào)用線程修改線程參數(shù),則拋出 SecurityException。 |
void | checkAccess(ThreadGroup g) | 如果不允許調(diào)用線程修改線程組參數(shù),則拋出 SecurityException。 |
void | checkAwtEventQueueAccess() | 已棄用。 對(duì) AWTPermission 的依賴對(duì) Java 平臺(tái)的未來模塊化造成了障礙。 此方法的用戶應(yīng)改為直接調(diào)用 checkPermission(java.security.Permission)。 此方法將在未來版本中更改以檢查權(quán)限 java.security.AllPermission。 |
void | checkConnect(String host, int port) | 如果不允許調(diào)用線程打開到指定主機(jī)和端口號(hào)的套接字連接,則拋出 SecurityException。 |
void | checkConnect(String host, int port, Object context) | 如果不允許指定的安全上下文打開到指定主機(jī)和端口號(hào)的套接字連接,則拋出 SecurityException。 |
void | checkCreateClassLoader() | 如果不允許調(diào)用線程創(chuàng)建新的類加載器,則拋出 SecurityException。 |
void | checkDelete(String file) | 如果不允許調(diào)用線程刪除指定文件,則拋出 SecurityException。 |
void | checkExec(String cmd) | 如果不允許調(diào)用線程創(chuàng)建子進(jìn)程,則拋出 SecurityException。 |
void | checkExit(int status) | 如果不允許調(diào)用線程導(dǎo)致 Java 虛擬機(jī)以指定的狀態(tài)碼停止,則拋出 SecurityException。 |
void | checkLink(String lib) | 如果不允許調(diào)用線程動(dòng)態(tài)鏈接字符串參數(shù)文件指定的庫代碼,則拋出 SecurityException。 |
void | checkListen(int port) | 如果不允許調(diào)用線程在指定的本地端口號(hào)上等待連接請(qǐng)求,則拋出 SecurityException。 |
void | checkMemberAccess(Class<?> clazz, int which) | 已棄用。 此方法依賴于調(diào)用者處于 4 的堆棧深度,這很容易出錯(cuò)并且不能由運(yùn)行時(shí)強(qiáng)制執(zhí)行。 此方法的用戶應(yīng)改為直接調(diào)用 checkPermission(java.security.Permission)。 此方法將在未來版本中更改以檢查權(quán)限 java.security.AllPermission。 |
void | checkMulticast(InetAddress maddr) | 如果不允許調(diào)用線程使用(加入/離開/發(fā)送/接收)IP 多播,則拋出 SecurityException。 |
void | checkMulticast(InetAddress maddr, byte ttl) | 已棄用。 改用#checkPermission(java.security.Permission) |
void | checkPackageAccess(String pkg) | 如果不允許調(diào)用線程訪問參數(shù)指定的包,則拋出 SecurityException。 |
void | checkPackageDefinition(String pkg) | 如果不允許調(diào)用線程在參數(shù)指定的包中定義類,則拋出 SecurityException。 |
void | checkPermission(Permission perm) | 如果根據(jù)當(dāng)前有效的安全策略不允許由給定權(quán)限指定的請(qǐng)求訪問,則拋出 SecurityException。 |
void | checkPermission(Permission perm, Object context) | 如果指定的安全上下文被拒絕訪問由給定權(quán)限指定的資源,則引發(fā) SecurityException。 |
void | checkPrintJobAccess() | 如果不允許調(diào)用線程發(fā)起打印作業(yè)請(qǐng)求,則拋出 SecurityException。 |
void | checkPropertiesAccess() | 如果不允許調(diào)用線程訪問或修改系統(tǒng)屬性,則拋出 SecurityException。 |
void | checkPropertyAccess(String key) | 如果不允許調(diào)用線程訪問具有指定鍵名的系統(tǒng)屬性,則拋出 SecurityException。 |
void | checkRead(FileDescriptor fd) | 如果不允許調(diào)用線程從指定的文件描述符中讀取,則拋出 SecurityException。 |
void | checkRead(String file) | 如果不允許調(diào)用線程讀取由字符串參數(shù)指定的文件,則拋出 SecurityException。 |
void | checkRead(String file, Object context) | 如果不允許指定的安全上下文讀取字符串參數(shù)指定的文件,則拋出 SecurityException。 |
void | checkSecurityAccess(String target) | 確定是否應(yīng)授予或拒絕具有指定權(quán)限目標(biāo)名稱的權(quán)限。 |
void | checkSetFactory() | 如果不允許調(diào)用線程設(shè)置 ServerSocket 或 Socket 使用的套接字工廠或 URL 使用的流處理程序工廠,則拋出 SecurityException。 |
void | checkSystemClipboardAccess() | 已棄用。 對(duì) AWTPermission 的依賴對(duì) Java 平臺(tái)的未來模塊化造成了障礙。 此方法的用戶應(yīng)改為直接調(diào)用 checkPermission(java.security.Permission)。 此方法將在未來版本中更改以檢查權(quán)限 java.security.AllPermission。 |
boolean | checkTopLevelWindow(Object window) | 已棄用。 對(duì) AWTPermission 的依賴對(duì) Java 平臺(tái)的未來模塊化造成了障礙。 此方法的用戶應(yīng)改為直接調(diào)用 checkPermission(java.security.Permission)。 此方法將在未來版本中更改以檢查權(quán)限 java.security.AllPermission。 |
void | checkWrite(FileDescriptor fd) | 如果不允許調(diào)用線程寫入指定的文件描述符,則拋出 SecurityException。 |
void | checkWrite(String file) | 如果不允許調(diào)用線程寫入由字符串參數(shù)指定的文件,則拋出 SecurityException。 |
protected int | classDepth(String name) | 已棄用。 不推薦這種類型的安全檢查。 建議改用 checkPermission 調(diào)用。 |
protected int | classLoaderDepth() | 已棄用。 不推薦這種類型的安全檢查。 建議改用 checkPermission 調(diào)用。 |
protected ClassLoader | currentClassLoader() | 已棄用。 不推薦這種類型的安全檢查。 建議改用 checkPermission 調(diào)用。 |
protected Class<?> | currentLoadedClass() | 已棄用。 不推薦這種類型的安全檢查。 建議改用 checkPermission 調(diào)用。 |
protected Class[] | getClassContext() | 以類數(shù)組的形式返回當(dāng)前執(zhí)行堆棧。 |
boolean | getInCheck() | 已棄用。 不推薦這種類型的安全檢查。 建議改用 checkPermission 調(diào)用。 |
Object | getSecurityContext() | 創(chuàng)建一個(gè)封裝當(dāng)前執(zhí)行環(huán)境的對(duì)象。 |
ThreadGroup | getThreadGroup() | 返回線程組,在該線程組中實(shí)例化在調(diào)用它時(shí)創(chuàng)建的任何新線程。 |
protected boolean | inClass(String name) | 已棄用。 不推薦這種類型的安全檢查。 建議改用 checkPermission 調(diào)用。 |
protected boolean | inClassLoader() | 已棄用。 不推薦這種類型的安全檢查。 建議改用 checkPermission 調(diào)用。 |
從類 java.lang.Object 繼承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
@Deprecated protected boolean inCheck
已棄用。 不推薦這種類型的安全檢查。 建議改用 checkPermission 調(diào)用。
如果正在進(jìn)行安全檢查,則該字段為 true; 否則為 false。
public SecurityManager()
構(gòu)造一個(gè)新的 SecurityManager。
如果已經(jīng)安裝了安全管理器,該方法首先調(diào)用安全管理器的 checkPermission 方法,具有 RuntimePermission("createSecurityManager") 權(quán)限,以確保調(diào)用線程具有創(chuàng)建新安全管理器的權(quán)限。 這可能會(huì)導(dǎo)致拋出 SecurityException。
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果安全管理器已經(jīng)存在并且其 checkPermission 方法不允許創(chuàng)建新的安全管理器。 |
@Deprecated public boolean getInCheck()
已棄用。 不推薦這種類型的安全檢查。 建議改用 checkPermission 調(diào)用。
測(cè)試是否正在進(jìn)行安全檢查。
返回:
inCheck 字段的值。 如果正在進(jìn)行安全檢查,則該字段應(yīng)包含 true,否則為 false。
protected Class[] getClassContext()
以類數(shù)組的形式返回當(dāng)前執(zhí)行堆棧。
數(shù)組的長(zhǎng)度是執(zhí)行堆棧上的方法數(shù)。 索引 0 處的元素是當(dāng)前執(zhí)行方法的類,索引 1 處的元素是該方法調(diào)用者的類,依此類推。
返回:
執(zhí)行堆棧。
@Deprecated protected ClassLoader currentClassLoader()
已棄用。不推薦這種類型的安全檢查。建議改用 checkPermission 調(diào)用。
從使用非系統(tǒng)類加載器定義的類中返回最近執(zhí)行的方法的類加載器。非系統(tǒng)類加載器被定義為不等于系統(tǒng)類加載器(由 ClassLoader#getSystemClassLoader 返回)或其祖先之一的類加載器。
該方法將在以下三種情況下返回 null:
返回:
使用非系統(tǒng)類加載器定義的類的方法堆棧上最近出現(xiàn)的類加載器。
@Deprecated protected Class<?> currentLoadedClass()
已棄用。不推薦這種類型的安全檢查。建議改用 checkPermission 調(diào)用。
從使用非系統(tǒng)類加載器定義的類中返回最近執(zhí)行的方法的類。非系統(tǒng)類加載器被定義為不等于系統(tǒng)類加載器(由 ClassLoader#getSystemClassLoader 返回)或其祖先之一的類加載器。
該方法將在以下三種情況下返回 null:
返回:
使用非系統(tǒng)類加載器定義的類的方法堆棧上最近出現(xiàn)的類。
@Deprecated protected int classDepth(String name)
已棄用。 不推薦這種類型的安全檢查。 建議改用 checkPermission 調(diào)用。
返回指定類的堆棧深度。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 要搜索的類的完全限定名稱。 |
返回:
具有指定名稱的類中第一次出現(xiàn)方法的堆棧幀深度; -1 如果找不到這樣的框架。
@Deprecated protected int classLoaderDepth()
已棄用。不推薦這種類型的安全檢查。建議改用 checkPermission 調(diào)用。
返回使用非系統(tǒng)類加載器定義的類中最近執(zhí)行的方法的堆棧深度。非系統(tǒng)類加載器被定義為不等于系統(tǒng)類加載器(由 ClassLoader#getSystemClassLoader 返回)或其祖先之一的類加載器。
此方法將在以下三種情況下返回 -1:
返回:
使用非系統(tǒng)類加載器定義的類中最近出現(xiàn)的方法的堆棧幀深度。
@Deprecated protected boolean inClass(String name)
已棄用。 不推薦這種類型的安全檢查。 建議改用 checkPermission 調(diào)用。
測(cè)試具有指定名稱的類中的方法是否在執(zhí)行堆棧上。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 類的完全限定名。 |
返回:
如果具有指定名稱的類中的方法在執(zhí)行堆棧上,則為 true; 否則為假。
@Deprecated protected boolean inClassLoader()
已棄用。 不推薦這種類型的安全檢查。 建議改用 checkPermission 調(diào)用。
基本上,測(cè)試使用類加載器定義的類中的方法是否在執(zhí)行堆棧上。
返回:
如果對(duì) currentClassLoader 的調(diào)用具有非空返回值,則為 true。
public Object getSecurityContext()
創(chuàng)建一個(gè)封裝當(dāng)前執(zhí)行環(huán)境的對(duì)象。 例如,三參數(shù) checkConnect 方法和二參數(shù) checkRead 方法使用此方法的結(jié)果。 這些方法是必需的,因?yàn)榭梢哉{(diào)用受信任的方法來讀取文件或代表另一個(gè)方法打開套接字。 受信任的方法需要確定是否允許其他(可能不受信任的)方法自行執(zhí)行操作。
此方法的默認(rèn)實(shí)現(xiàn)是返回一個(gè) AccessControlContext 對(duì)象。
返回:
一個(gè)依賴于實(shí)現(xiàn)的對(duì)象,它封裝了有關(guān)當(dāng)前執(zhí)行環(huán)境的足夠信息,以便稍后執(zhí)行一些安全檢查。
public void checkPermission(Permission perm)
如果根據(jù)當(dāng)前有效的安全策略不允許由給定權(quán)限指定的請(qǐng)求訪問,則引發(fā) SecurityException。
此方法使用給定的權(quán)限調(diào)用 AccessController.checkPermission。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
perm | 請(qǐng)求的權(quán)限。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果根據(jù)當(dāng)前的安全策略不允許訪問。 |
NullPointerException | 如果權(quán)限參數(shù)為空。 |
public void checkPermission(Permission perm, Object context)
如果指定的安全上下文被拒絕訪問由給定權(quán)限指定的資源,則引發(fā) SecurityException。 上下文必須是先前調(diào)用 getSecurityContext 返回的安全上下文,并且訪問控制決策基于為該安全上下文配置的安全策略。
如果 context 是 AccessControlContext 的實(shí)例,則使用指定的權(quán)限調(diào)用 AccessControlContext.checkPermission 方法。
如果 context 不是 AccessControlContext 的實(shí)例,則拋出 SecurityException。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
perm | 指定的權(quán)限 |
context | 依賴于系統(tǒng)的安全上下文。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果指定的安全上下文不是 AccessControlContext 的實(shí)例(例如,為null),或者被拒絕訪問由給定權(quán)限指定的資源。 |
NullPointerException | 如果權(quán)限參數(shù)為null。 |
public void checkCreateClassLoader()
如果不允許調(diào)用線程創(chuàng)建新的類加載器,則拋出 SecurityException。
此方法使用 RuntimePermission("createClassLoader") 權(quán)限調(diào)用 checkPermission。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)拋出異常的時(shí)候調(diào)用 super.checkCreateClassLoader。
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程沒有創(chuàng)建新類加載器的權(quán)限。 |
public void checkAccess(Thread t)
如果不允許調(diào)用線程修改線程參數(shù),則拋出 SecurityException。
此方法由 Thread 類的 stop、suspend、resume、setPriority、setName 和 setDaemon 方法為當(dāng)前安全管理器調(diào)用。
如果線程參數(shù)是系統(tǒng)線程(屬于具有 null 父級(jí)的線程組),則此方法使用 RuntimePermission("modifyThread") 權(quán)限調(diào)用 checkPermission。如果線程參數(shù)不是系統(tǒng)線程,則此方法只是靜默返回。
需要更嚴(yán)格策略的應(yīng)用程序應(yīng)覆蓋此方法。如果此方法被覆蓋,則覆蓋它的方法應(yīng)另外檢查調(diào)用線程是否具有 RuntimePermission("modifyThread") 權(quán)限,如果是,則靜默返回。這是為了確保授予該權(quán)限的代碼(例如 JDK 本身)可以操作任何線程。
如果此方法被覆蓋,則 super.checkAccess 應(yīng)由被覆蓋方法中的第一條語句調(diào)用,或者應(yīng)在被覆蓋方法中放置等效的安全檢查。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
t | 要檢查的線程。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程沒有修改線程的權(quán)限。 |
NullPointerException | 如果線程參數(shù)為空。 |
public void checkAccess(ThreadGroup g)
如果不允許調(diào)用線程修改線程組參數(shù),則拋出 SecurityException。
當(dāng)創(chuàng)建新的子線程或子線程組時(shí),通過 ThreadGroup 類的 setDaemon、setMaxPriority、stop、suspend、resume 和 destroy 方法為當(dāng)前安全管理器調(diào)用此方法。
如果線程組參數(shù)是系統(tǒng)線程組(具有 null 父級(jí)),則此方法使用 RuntimePermission("modifyThreadGroup") 權(quán)限調(diào)用 checkPermission。如果線程組參數(shù)不是系統(tǒng)線程組,則此方法只是靜默返回。
需要更嚴(yán)格策略的應(yīng)用程序應(yīng)覆蓋此方法。如果此方法被覆蓋,則覆蓋它的方法應(yīng)另外檢查調(diào)用線程是否具有 RuntimePermission("modifyThreadGroup") 權(quán)限,如果是,則靜默返回。這是為了確保授予該權(quán)限的代碼(例如 JDK 本身)可以操作任何線程。
如果此方法被覆蓋,則 super.checkAccess 應(yīng)由被覆蓋方法中的第一條語句調(diào)用,或者應(yīng)在被覆蓋方法中放置等效的安全檢查。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
g | 要檢查的線程組。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程沒有修改線程組的權(quán)限。 |
NullPointerException | 如果線程組參數(shù)為空。 |
public void checkExit(int status)
如果不允許調(diào)用線程導(dǎo)致 Java 虛擬機(jī)以指定的狀態(tài)碼停止,則拋出 SecurityException。
該方法由 Runtime 類的 exit 方法為當(dāng)前安全管理器調(diào)用。 狀態(tài)為 0 表示成功; 其他值表示各種錯(cuò)誤。
此方法使用 RuntimePermission("exitVM."+status) 權(quán)限調(diào)用 checkPermission。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)拋出異常的地方調(diào)用 super.checkExit。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
status | 退出狀態(tài)。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程沒有權(quán)限以指定狀態(tài)暫停 Java 虛擬機(jī)。 |
public void checkExec(String cmd)
如果不允許調(diào)用線程創(chuàng)建子進(jìn)程,則拋出 SecurityException。
此方法由 Runtime 類的 exec 方法為當(dāng)前安全管理器調(diào)用。
如果 cmd 是絕對(duì)路徑,則此方法使用 FilePermission(cmd,"execute") 權(quán)限調(diào)用 checkPermission,否則使用 FilePermission("<<ALL FILES>>","execute") 調(diào)用 checkPermission。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)拋出異常的時(shí)候調(diào)用 super.checkExec。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
cmd | 指定的系統(tǒng)命令。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程沒有創(chuàng)建子進(jìn)程的權(quán)限。 |
NullPointerException | 如果 cmd 參數(shù)為空。 |
public void checkLink(String lib)
如果不允許調(diào)用線程動(dòng)態(tài)鏈接字符串參數(shù)文件指定的庫代碼,則拋出 SecurityException。 參數(shù)要么是一個(gè)簡(jiǎn)單的庫名,要么是一個(gè)完整的文件名。
該方法由 Runtime 類的 load 和 loadLibrary 方法為當(dāng)前安全管理器調(diào)用。
此方法使用 RuntimePermission("loadLibrary."+lib) 權(quán)限調(diào)用 checkPermission。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)拋出異常的時(shí)候調(diào)用 super.checkLink。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
lib | 庫的名稱。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程沒有動(dòng)態(tài)鏈接庫的權(quán)限。 |
NullPointerException | 如果 lib 參數(shù)為空。 |
public void checkRead(FileDescriptor fd)
如果不允許調(diào)用線程從指定的文件描述符中讀取,則拋出 SecurityException。
此方法使用 RuntimePermission("readFileDescriptor") 權(quán)限調(diào)用 checkPermission。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)拋出異常的時(shí)候調(diào)用 super.checkRead。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
fd | 系統(tǒng)相關(guān)的文件描述符。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程沒有訪問指定文件描述符的權(quán)限。 |
NullPointerException | 如果文件描述符參數(shù)為空。 |
public void checkRead(String file)
如果不允許調(diào)用線程讀取由字符串參數(shù)指定的文件,則拋出 SecurityException。
此方法使用 FilePermission(file,"read") 權(quán)限調(diào)用 checkPermission。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)拋出異常的時(shí)候調(diào)用 super.checkRead。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
file | 系統(tǒng)相關(guān)的文件名。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程沒有訪問指定文件的權(quán)限。 |
NullPointerException | 如果文件參數(shù)為空。 |
public void checkRead(String file, Object context)
如果不允許指定的安全上下文讀取字符串參數(shù)指定的文件,則拋出 SecurityException。 上下文必須是先前調(diào)用 getSecurityContext 返回的安全上下文。
如果 context 是 AccessControlContext 的一個(gè)實(shí)例,那么將使用 FilePermission(file,"read") 權(quán)限調(diào)用 AccessControlContext.checkPermission 方法。
如果 context 不是 AccessControlContext 的實(shí)例,則拋出 SecurityException。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)拋出異常的時(shí)候調(diào)用 super.checkRead。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
file | 系統(tǒng)相關(guān)的文件名。 |
context | 依賴于系統(tǒng)的安全上下文。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果指定的安全上下文不是 AccessControlContext 的實(shí)例(例如,為 null),或者沒有讀取指定文件的權(quán)限。 |
NullPointerException | 如果文件參數(shù)為空。 |
public void checkWrite(FileDescriptor fd)
如果不允許調(diào)用線程寫入指定的文件描述符,則拋出 SecurityException。
此方法使用 RuntimePermission("writeFileDescriptor") 權(quán)限調(diào)用 checkPermission。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)拋出異常的時(shí)候調(diào)用 super.checkWrite。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
fd | 系統(tǒng)相關(guān)的文件描述符。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程沒有訪問指定文件描述符的權(quán)限。 |
NullPointerException | 如果文件描述符參數(shù)為空。 |
public void checkWrite(String file)
如果不允許調(diào)用線程寫入由字符串參數(shù)指定的文件,則拋出 SecurityException。
此方法使用 FilePermission(file,"write") 權(quán)限調(diào)用 checkPermission。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)拋出異常的時(shí)候調(diào)用 super.checkWrite。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
file | 系統(tǒng)相關(guān)的文件名。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程沒有訪問指定文件的權(quán)限。 |
NullPointerException | 如果文件參數(shù)為空。 |
public void checkDelete(String file)
如果不允許調(diào)用線程刪除指定文件,則拋出 SecurityException。
該方法由 File 類的 delete 方法為當(dāng)前安全管理器調(diào)用。
此方法使用 FilePermission(file,"delete") 權(quán)限調(diào)用 checkPermission。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)拋出異常的時(shí)候調(diào)用 super.checkDelete。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
file | 系統(tǒng)相關(guān)的文件名。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程沒有刪除文件的權(quán)限。 |
NullPointerException | 如果文件參數(shù)為空。 |
public void checkConnect(String host, int port)
如果不允許調(diào)用線程打開到指定主機(jī)和端口號(hào)的套接字連接,則拋出 SecurityException。
端口號(hào) -1 表示調(diào)用方法正在嘗試確定指定主機(jī)名的 IP 地址。
如果端口不等于 -1,則此方法使用 SocketPermission(host+":"+port,"connect") 權(quán)限調(diào)用 checkPermission。 如果端口等于 -1,那么它會(huì)調(diào)用帶有 SocketPermission(host,"resolve") 權(quán)限的 checkPermission。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)拋出異常的地方調(diào)用 super.checkConnect。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
host | 要連接的主機(jī)名端口。 |
port | 要連接的協(xié)議端口。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程無權(quán)打開到指定主機(jī)和端口的套接字連接。 |
NullPointerException | 如果主機(jī)參數(shù)為空。 |
public void checkConnect(String host, int port, Object context)
如果不允許指定的安全上下文打開到指定主機(jī)和端口號(hào)的套接字連接,則拋出 SecurityException。
端口號(hào) -1 表示調(diào)用方法正在嘗試確定指定主機(jī)名的 IP 地址。
如果 context 不是 AccessControlContext 的實(shí)例,則拋出 SecurityException。
否則,檢查端口號(hào)。 如果不等于 -1,則使用 SocketPermission(host+":"+port,"connect") 權(quán)限調(diào)用上下文的 checkPermission 方法。 如果端口等于 -1,則使用 SocketPermission(host,"resolve") 權(quán)限調(diào)用上下文的 checkPermission 方法。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)拋出異常的地方調(diào)用 super.checkConnect。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
host | 要連接的主機(jī)名端口。 |
port | 要連接的協(xié)議端口。 |
context | 依賴于系統(tǒng)的安全上下文。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果指定的安全上下文不是 AccessControlContext 的實(shí)例(例如,為 null),或者無權(quán)打開到指定主機(jī)和端口的套接字連接。 |
NullPointerException | 如果主機(jī)參數(shù)為空。 |
public void checkListen(int port)
如果不允許調(diào)用線程在指定的本地端口號(hào)上等待連接請(qǐng)求,則拋出 SecurityException。
此方法使用 SocketPermission("localhost:"+port,"listen") 調(diào)用 checkPermission。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)拋出異常的地方調(diào)用 super.checkListen。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
port | 本地端口。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程沒有權(quán)限監(jiān)聽指定端口。 |
public void checkAccept(String host, int port)
如果不允許調(diào)用線程接受來自指定主機(jī)和端口號(hào)的套接字連接,則拋出 SecurityException。
該方法由ServerSocket 類的accept 方法為當(dāng)前的安全管理器調(diào)用。
此方法使用 SocketPermission(host+":"+port,"accept") 權(quán)限調(diào)用 checkPermission。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)拋出異常的時(shí)候調(diào)用 super.checkAccept。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
host | 套接字連接的主機(jī)名。 |
port | 套接字連接的端口號(hào)。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程沒有接受連接的權(quán)限。 |
NullPointerException | 如果主機(jī)參數(shù)為空。 |
public void checkMulticast(InetAddress maddr)
如果不允許調(diào)用線程使用(加入/離開/發(fā)送/接收)IP 多播,則拋出 SecurityException。
此方法使用 java.net.SocketPermission(maddr.getHostAddress(), "accept,connect") 權(quán)限調(diào)用 checkPermission。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)拋出異常的時(shí)候調(diào)用 super.checkMulticast。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
maddr | 要使用的 Internet 組地址。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果不允許調(diào)用線程使用(加入/離開/發(fā)送/接收)IP 多播。 |
NullPointerException | 如果地址參數(shù)為空。 |
@Deprecated public void checkMulticast(InetAddress maddr, byte ttl)
已棄用。 改用#checkPermission(java.security.Permission)
如果不允許調(diào)用線程使用(加入/離開/發(fā)送/接收)IP 多播,則拋出 SecurityException。
此方法使用 java.net.SocketPermission(maddr.getHostAddress(), "accept,connect") 權(quán)限調(diào)用 checkPermission。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)拋出異常的時(shí)候調(diào)用 super.checkMulticast。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
maddr | 要使用的 Internet 組地址。 |
ttl | 使用中的值,如果是多播發(fā)送。 注意:此特定實(shí)現(xiàn)不使用 ttl 參數(shù)。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果不允許調(diào)用線程使用(加入/離開/發(fā)送/接收)IP 多播。 |
NullPointerException | 如果地址參數(shù)為空。 |
public void checkPropertiesAccess()
如果不允許調(diào)用線程訪問或修改系統(tǒng)屬性,則拋出 SecurityException。
此方法由 System 類的 getProperties 和 setProperties 方法使用。
此方法使用 PropertyPermission("*", "read,write") 權(quán)限調(diào)用 checkPermission。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)拋出異常的時(shí)候調(diào)用 super.checkPropertiesAccess。
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程無權(quán)訪問或修改系統(tǒng)屬性。 |
public void checkPropertyAccess(String key)
如果不允許調(diào)用線程訪問具有指定鍵名的系統(tǒng)屬性,則拋出 SecurityException。
此方法由 System 類的 getProperty 方法使用。
此方法使用 PropertyPermission(key, "read") 權(quán)限調(diào)用 checkPermission。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)拋出異常的時(shí)候調(diào)用 super.checkPropertyAccess。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
key | 系統(tǒng)屬性鍵。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程沒有訪問指定系統(tǒng)屬性的權(quán)限。 |
NullPointerException | 如果關(guān)鍵參數(shù)為空。 |
IllegalArgumentException | 如果鍵為空。 |
@Deprecated public boolean checkTopLevelWindow(Object window)
已棄用。對(duì) AWTPermission 的依賴對(duì) Java 平臺(tái)的未來模塊化造成了障礙。此方法的用戶應(yīng)改為直接調(diào)用 checkPermission(java.security.Permission)。此方法將在未來版本中更改以檢查權(quán)限 java.security.AllPermission。
如果不信任調(diào)用線程調(diào)出由 window 參數(shù)指示的頂級(jí)窗口,則返回 false。在這種情況下,調(diào)用者仍然可以決定顯示窗口,但窗口應(yīng)該包含某種視覺警告。如果該方法返回 true,則可以在沒有任何特殊限制的情況下顯示窗口。
該方法以 AWTPermission("showWindowWithoutWarningBanner") 權(quán)限調(diào)用 checkPermission,如果沒有拋出 SecurityException,則返回 true,否則返回 false。在不包含 java.awt 包的 Java SE 子集配置文件的情況下,將調(diào)用 checkPermission 來檢查權(quán)限 java.security.AllPermission。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)返回 false 的地方調(diào)用 super.checkTopLevelWindow,并且應(yīng)該返回 super.checkTopLevelWindow 的值。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
window | 正在創(chuàng)建的新窗口。 |
返回:
如果信任調(diào)用線程來建立頂級(jí)窗口,則為 true; 否則為 false。
Throws:
Throw名稱 | Throw描述 |
---|---|
NullPointerException | 如果窗口參數(shù)為空。 |
public void checkPrintJobAccess()
如果不允許調(diào)用線程發(fā)起打印作業(yè)請(qǐng)求,則拋出 SecurityException。
此方法使用 RuntimePermission("queuePrintJob") 權(quán)限調(diào)用 checkPermission。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)拋出異常的時(shí)候調(diào)用 super.checkPrintJobAccess。
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程無權(quán)發(fā)起打印作業(yè)請(qǐng)求。 |
@Deprecated public void checkSystemClipboardAccess()
已棄用。 對(duì) AWTPermission 的依賴對(duì) Java 平臺(tái)的未來模塊化造成了障礙。 此方法的用戶應(yīng)改為直接調(diào)用 checkPermission(java.security.Permission)。 此方法將在未來版本中更改以檢查權(quán)限 java.security.AllPermission。
如果不允許調(diào)用線程訪問系統(tǒng)剪貼板,則引發(fā) SecurityException。
此方法使用 AWTPermission("accessClipboard") 權(quán)限調(diào)用 checkPermission。 在不包含 java.awt 包的 Java SE 子集配置文件的情況下,將調(diào)用 checkPermission 來檢查權(quán)限 java.security.AllPermission。
如果你重寫了這個(gè)方法,那么你應(yīng)該調(diào)用 super.checkSystemClipboardAccess 在被重寫的方法通常會(huì)拋出異常的地方。
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程沒有訪問系統(tǒng)剪貼板的權(quán)限。 |
@Deprecated public void checkAwtEventQueueAccess()
已棄用。 對(duì) AWTPermission 的依賴對(duì) Java 平臺(tái)的未來模塊化造成了障礙。 此方法的用戶應(yīng)改為直接調(diào)用 checkPermission(java.security.Permission)。 此方法將在未來版本中更改以檢查權(quán)限 java.security.AllPermission。
如果不允許調(diào)用線程訪問 AWT 事件隊(duì)列,則引發(fā) SecurityException。
此方法使用 AWTPermission("accessEventQueue") 權(quán)限調(diào)用 checkPermission。 在不包含 java.awt 包的 Java SE 子集配置文件的情況下,將調(diào)用 checkPermission 來檢查權(quán)限 java.security.AllPermission。
如果您覆蓋此方法,那么您應(yīng)該調(diào)用 super.checkAwtEventQueueAccess,此時(shí)被覆蓋的方法通常會(huì)引發(fā)異常。
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程沒有訪問 AWT 事件隊(duì)列的權(quán)限。 |
public void checkPackageAccess(String pkg)
如果不允許調(diào)用線程訪問參數(shù)指定的包,則拋出 SecurityException。
該方法由類加載器的 loadClass 方法使用。
此方法首先通過從對(duì) java.security.Security.getProperty("package.access") 的調(diào)用中獲取逗號(hào)分隔的列表來獲取受限包的列表,并檢查 pkg 是否以或等于任何受限包開頭 . 如果是,則使用 RuntimePermission("accessClassInPackage."+pkg) 權(quán)限調(diào)用 checkPermission。
如果此方法被覆蓋,則 super.checkPackageAccess 應(yīng)作為被覆蓋方法的第一行調(diào)用。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
pkg | 包名。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程沒有訪問指定包的權(quán)限。 |
NullPointerException | 如果包名稱參數(shù)為空。 |
public void checkPackageDefinition(String pkg)
如果不允許調(diào)用線程在參數(shù)指定的包中定義類,則拋出 SecurityException。
該方法被某些類加載器的 loadClass 方法使用。
此方法首先通過從對(duì) java.security.Security.getProperty("package.definition") 的調(diào)用中獲取逗號(hào)分隔的列表來獲取受限包的列表,并檢查 pkg 是否以任何受限包開頭或等于任何受限包 . 如果是這樣,則使用 RuntimePermission("defineClassInPackage."+pkg) 權(quán)限調(diào)用 checkPermission。
如果此方法被覆蓋,則 super.checkPackageDefinition 應(yīng)作為被覆蓋方法的第一行調(diào)用。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
pkg | 包名。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程沒有權(quán)限在指定包中定義類。 |
public void checkSetFactory()
如果不允許調(diào)用線程設(shè)置 ServerSocket 或 Socket 使用的套接字工廠或 URL 使用的流處理程序工廠,則拋出 SecurityException。
此方法使用 RuntimePermission("setFactory") 權(quán)限調(diào)用 checkPermission。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)拋出異常的時(shí)候調(diào)用 super.checkSetFactory。
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程無權(quán)指定套接字工廠或流處理程序工廠。 |
@Deprecated public void checkMemberAccess(Class<?> clazz, int which)
已棄用。 此方法依賴于調(diào)用者處于 4 的堆棧深度,這很容易出錯(cuò)并且不能由運(yùn)行時(shí)強(qiáng)制執(zhí)行。 此方法的用戶應(yīng)改為直接調(diào)用 checkPermission(java.security.Permission)。 此方法將在未來版本中更改以檢查權(quán)限 java.security.AllPermission。
如果不允許調(diào)用線程訪問成員,則拋出 SecurityException。
默認(rèn)策略是允許訪問 PUBLIC 成員,以及訪問與調(diào)用者具有相同類加載器的類。 在所有其他情況下,此方法使用 RuntimePermission("accessDeclaredMembers") 權(quán)限調(diào)用 checkPermission。
如果此方法被覆蓋,則無法調(diào)用 super.checkMemberAccess,因?yàn)?checkMemberAccess 的默認(rèn)實(shí)現(xiàn)依賴于被檢查的代碼的堆棧深度為 4。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
clazz | 要在其上執(zhí)行反射的類。 |
which | 訪問類型,公共或聲明。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用者沒有訪問成員的權(quán)限。 |
NullPointerException | 如果 clazz 參數(shù)為空。 |
public void checkSecurityAccess(String target)
確定是否應(yīng)授予或拒絕具有指定權(quán)限目標(biāo)名稱的權(quán)限。
如果請(qǐng)求的權(quán)限被允許,則此方法安靜地返回。 如果被拒絕,則會(huì)引發(fā) SecurityException。
此方法為給定的權(quán)限目標(biāo)名稱創(chuàng)建一個(gè) SecurityPermission 對(duì)象,并使用它調(diào)用 checkPermission。
有關(guān)可能的權(quán)限目標(biāo)名稱的列表,請(qǐng)參閱 SecurityPermission 的文檔。
如果你重寫了這個(gè)方法,那么你應(yīng)該在被重寫的方法通常會(huì)拋出異常的時(shí)候調(diào)用 super.checkSecurityAccess。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
target | SecurityPermission 的目標(biāo)名稱。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果調(diào)用線程沒有請(qǐng)求訪問的權(quán)限。 |
NullPointerException | 如果目標(biāo)為null |
IllegalArgumentException | 如果目標(biāo)為empty |
public ThreadGroup getThreadGroup()
返回線程組,在該線程組中實(shí)例化在調(diào)用它時(shí)創(chuàng)建的任何新線程。 默認(rèn)情況下,它返回當(dāng)前線程的線程組。 這應(yīng)該由特定的安全管理器覆蓋以返回適當(dāng)?shù)木€程組。
返回:
將新線程實(shí)例化到的 ThreadGroup
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: