- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 Tomcat 6 实例在我的本地机器上运行。
我对其配置进行了以下更改:
在/conf/context.xml
– 如下更改标签
<Context crossContext="true">
在/conf/server.xml
– 更改标签如下
<Connector port="8080" protocol="HTTP/1.1" emptySessionPath="true"
connectionTimeout="20000"
redirectPort="8443" />
假设我在此处部署了一个名为 SampleProject.war
的 WAR 文件,该文件解压缩到文件夹 SampleProject
。
在这个WAR中的一些servlet中,比如说SampleServlet
,我写了两 block 代码如下:
ServletContext context1 = session.getServletContext();
和
ServletContext context2 = session.getServletContext().getContext("/SampleProject");
context1
和 context2
有什么区别?我认为两者都指的是应用程序上下文。但是如果我在 context1
中设置一些属性并在 context2
中访问,我不会在 context2
中获取值。
如有任何帮助,我们将不胜感激。
最佳答案
我觉得你的问题有点被误解了,你已经对 API 有了基本的了解,即一旦网络应用程序设置了它的 crossContext="true"
它就可以使用 getContext()
以访问与部署在服务器上的其他一些网络应用相对应的上下文。
getServletContext().getContext() equals NULL unless <Context crossContext="true">
据我了解,您的问题实际上是在 /SameWebApp
为什么
ServletContext context1 = session.getServletContext();
context1.setAttribute("contextAttribute", new Object());
ServletContext context2 = session.getServletContext().getContext("/SameWebApp");
System.out.println(context1.equals(context2)); // prints false, or
System.out.println(context2.getAttribute("contextAttribute")); // prints null (at least they could have been clones)
一言以蔽之,答案就是“安全”。想象一下,如果您不能保证“adminEmail”上下文属性没有被具有 crossContext=true
的邪恶 web 应用程序篡改。一旦“忘记密码”请求出现,您的应用程序可能会帮助妥协自身! :)
Tomcat 7 提供了一个 class ApplicationContext implements ServletContext
,它从 getContext("/context-root")
返回为
if (context.getCrossContext()) {
// If crossContext is enabled, can always return the context
return child.getServletContext();
} else if (child == context) {
// Can still return the current context
return context.getServletContext();
} else {
// Nothing to return
return (null);
}
这里的 context
属于当前的 web-app 而 child
代表另一个 web-app。但是,等等,是什么让 Tomcat 称它为 child ?
这两个实际上不是 ApplicationContext
而是 StandardContext
的实例 implements Context
但不是 servlet 特定的东西持有 Tomcat 特定的配置网络应用程序的设置,如 crossContext、主机名、mimeMappings 等。StandardContext.getParent()
为您提供 Container
,因此它在上面被称为子项。
无论如何,我们对 child == context
为 true 的情况感兴趣,即 getContext()
在“/SameWebApp 上被调用”。该调用被委托(delegate)给 StandardContext.getServletContext()
,它已被实现以返回 ApplicationContext
的不同实例。
这就是为什么您在 context1
中设置的属性在 context2
中找不到的原因。
但是等等,还有更多。为什么 StandardContext.getServletContext()
返回类似
return (context.getFacade());
Tomcat 实例基本上执行两种类型的 Java 代码:
容器代码是“受信任的”,有时可能需要以提升的权限运行。另一方面,用户代码不受信任,需要限制其破坏 Tomcat 内部。
Tomcat 为实现此目的所做的一件事是始终将 ApplicationContextFacade
包裹在 ApplicationContext
周围(因此也包裹 StandardContext
) .因此,回顾一下,看似简单的 ServletContext
实现实际上是一个 StandardContext
映射到一个 ApplicationContext
,然后将其包装在一个 ApplicationContextFacade
.
有关 ApplicationContextFacade
如何将反射与 Globals.IS_SECURITY_ENABLED
和 SecurityUtil.isPackageProtectionEnabled()
设置结合使用的更多信息,请查看看Why do Servlets access Tomcat ApplicationContext through a Facade在 SO 上。
关于java - session.getServletContext() 和 session.getServletContext().getContext 的区别 ("/SampleProject"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15639673/
我开始学习WebGL,因为我找到了一些旧教程,我不知道在2014年什么是正确的方法? 我启动了 (基本),并且在教程中他们说了类似的话: use getContext('2d') and if yo
我的 fragment 中多次需要上下文: ... account.restore(getContext()); ... dbHelper = new DBHelper
尝试根据 Youtube 上的教程创建 HTML5 Canvas 时钟时。我按照说明进行了整个演示,但无法在自己的浏览器(Safari 8.0.7 和 FireFox 39.0.3)上查看时钟,它显示
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceS
我是 android/java 编程新手,遇到错误,提示无法解析符号getContext,我正在尝试从我的应用程序获取图片以保存到手机主要外部存储上的照片库。如果有人可以帮助我解决这个错误,我将非常感
我是 android/java 编程新手,并且遇到错误,提示符号 getContext 无法解析。该系统以Activity启动,有两个fragment。第一个是显示 Rest Api 的按钮。请帮忙
typedef struct _ut_slot { ucontext_t uc; .... }*ut_slot; static ut_slot* table; //array of t
我有扩展 recyclerview.adapter 的适配器类,我需要在此类中使用以下代码,但它在“this”上有错误。 public void addItems(int howMany){
我正在使用常规 JS(我知道这不是最好的,但我是初学者) 所以我正在为 Canvas 项目编写代码。然而,当使用 getContext() 函数时,JS 控制台会显示 Uncaught TypeErr
我知道使用上述 API 对于普通的基于 x86 的桌面系统是安全的,但对于使用 ARM 或 MIP 的嵌入式系统,某些不常用的 API 可能会得到较少的支持或错误的实现。在一个程序中包含这样的高级 A
所以我一直在官方网站上接受 Android 开发人员培训,他们希望我们最终实例化我们的数据库。 所以他们告诉我们使用这段代码: FeedReaderDbHelper mDbHelper = new F
在我的 Android 应用程序中,我正在使用标准的 Android 登录模板构建登录屏幕。在此代码模板中, Activity 中有一个名为 UserLoginTask 的类。如果用户成功登录,我想将
我正在使用 Canvas 制作一个基本的 Web 应用程序,它会在窗口调整大小时动态更改 Canvas 大小。我已经让它静态地工作,没有任何缺陷,但是当我创建一个对象使其动态地工作时,它会抛出一个错误
在 AndroidX 中, InstrumentationRegistry 现在已被弃用。 documentation状态 This method is deprecated. In most sce
我正在尝试在Spring Boot应用程序中使用Spring Security添加Facebook授权。目前,我的问题是从Principal提取数据。 这是我的安全配置: public class S
我正在尝试获取 Canvas 的上下文,显然我收到错误Uncaught TypeError: Cannot call method 'getContext' of null 显然我在它初始化之前就得到
我是Kotlin Coroutines的新手,我想以异步方式为我的每位员工调用API。但是我遇到了一个问题,即新协程的存在,我无法从SecurityContextHolder.getContext检索
最近我将 struts2 版本从 2.0.11 更新到了当前的 2.2.3。不幸的是,我现在遇到了一些奇怪的问题,到目前为止我还无法解决。 当我尝试获取 ActionContext 时: Action
我想要一个 ActorFactory 类,如下所示 public class SampleActorFactory { // Simple create method public creat
我尝试对用户进行身份验证(它有效)并从上下文中获取用户 token ,但它不起作用。 我有一个简单的微服务应用程序作为我的宠物项目,并使用 WebFlux 作为网络框架。我尝试调试 ReactiveS
我是一名优秀的程序员,十分优秀!