AccessController.doPrivileged

Pet*_*ler 20 java security api java-ee

我想弄清楚一些遗留代码在做什么.这条线到底在做什么,为什么我会这样需要呢?

String lineSeparator = (String) java.security.AccessController.doPrivileged(
       new sun.security.action.GetPropertyAction("line.separator")); 
Run Code Online (Sandbox Code Playgroud)

我在Weblogic 8上运行的web/ejb应用程序的logger实现中找到了它.据我所知,没有启用特殊的安全策略.(我不喜欢从sun.*包中导入,所以我想摆脱这条线;-)

Tom*_*ine 31

它只是获得一个系统属性.检索系统属性需要调用代码可能没有的权限.该doPrivileged断言它是如何被称为调用类不论特权.显然,doPrivileged你需要小心谨慎.

引用的代码相当于:

String lineSeparator = java.security.AccessController.doPrivileged(
    new java.security.PrivilegedAction<String>() {
        public String run() {
            return System.getProperty("line.separator");
        }
    }
 );
Run Code Online (Sandbox Code Playgroud)

(难道你不喜欢Java语法的简洁性吗?)

如果没有声明权限,可以将其重写为:

String lineSeparator = System.getProperty("line.separator");
Run Code Online (Sandbox Code Playgroud)

  • @Tom,"doPrivileged声明了调用类的特权,而不管它是如何被调用的." 那是什么意思?你能给我举个例子吗? (2认同)
  • 我想我的意思是不考虑当前访问控制上下文的权限.因此,通常在调用受信任方法时,该方法可用的权限是调用它的权限.`doPrivileged`重新开始(虽然它确实包括直接调用者的权限限制). (2认同)