要点:
Domino服务器8.5.3 Windows服务器2008 FP2。 致电时
NotesAgent.runOnServer(noteid)
从代理设置为“以web用户身份运行”的线程中的Web浏览器,我收到错误“HTTP JVM:您无权执行该操作”。
详情:
所有网络请求都通过2个渠道进入我们的应用程序,通过笔记代理或xpage(其作用类似于XAgent)。我们有一个后端进程,最多可能需要20秒才能完成,它是对远程Web服务的调用,我们无法控制它。由于要求,我们无法将这些文档排入已安排的代理,他们需要立即...或者直接服务允许! 2个主要问题是:1 ..用户必须等待最多20秒,2 .. http线程未被释放。在繁忙的时间,我们看到http线程池饱和。我在测试环境中所做的是将请求发送到XAgent,这会调用我们的支持bean,它启动一个单独的线程,向用户返回消息。它运行良好,http线程立即释放,及时响应用户和提交到Web服务“异步”进行。
调用Web服务的逻辑是在LotusScript中,转换为java将是一项巨大的工作,因为LotusScript中存在大量互连的进程。在java线程中,用户名是服务器名称,effectiveUserName是经过身份验证的http用户,线程调用
NotesAgent.runOnServer(noteid)
,除了代理程序使用签署代理程序的用户的凭据运行外,它才有效。如果我们将代理设置为“以Web用户身份运行”,则会收到上述错误。作为测试,我将触发NotesAgent.run()的代码移动到主“调用”函数中,该函数通过以下方式获取会话:
JSFUtil.getVariableValue("session")
并且按预期工作(user = server,http user = effective user)。线程会话是这样的:
this.module = NotesContext.getCurrent().getModule();
this.sessionCloner = SessionCloner.getSessionCloner();
NotesContext context = new NotesContext( this.module );
NotesContext.initThread( context );
session = this.sessionCloner.getSession();
...如上所述,有效用户名是经过身份验证的http用户,用户名是服务器名称。
如果我直接浏览代理商,例如... / myapp.nsf / myagent?openagent,代理将作为有效的http用户运行。然后我将我的测试http用户放入我测试服务器上的最高安全组,同样的错误。然后我以服务器管理员用户身份登录(具有所有内容的安全设置)并得到相同的错误。
在我的测试服务器上,我从NSF运行作业时有:Domino \ jvm \ lib \ security \ java.policy:
grant {
permission java.security.AllPermission;
};
由于我可以通过JSFUtil.getVariableValue(“session”)触发代理,因此通过SessionCloner.getSessionCloner()获取会话时存在一些安全性差异.getSession()?
提前致谢。
答案 0 :(得分:2)
代理商和XPage不得杂交:-)。对于该线程,我将删除获取Web用户的需要。将java对象传递给不包含任何Notes对象的线程。然后去旧学校并使用sInitThread stermThread来获得一个闪亮的新会话并从那里运行代理。