Java 在Tomcat中获取和保存应用程序范围变量

Java 在Tomcat中获取和保存应用程序范围变量,java,tomcat,Java,Tomcat,这是一个基于Java1.8和Tomcat9的应用程序,没有Spring 我希望能够将对象保存在应用程序作用域中,并使其可由任何其他会话获取。只有一个Tomcat服务器,它无论如何都不是联合的。在本例中,我们有基于已验证的AUTH_用户和ROLE_ID头的应用程序授权。代码会运行,但每次它将对象保存到应用程序范围时,它都会被遗忘,或者以后的任何请求都无法访问它。因此,不会发生缓存 我的问题是如何保存在一个请求中创建的对象,并通过应用程序作用域将其用于下一个请求。请查看代码中的注释,以了解我认为它应

这是一个基于Java1.8和Tomcat9的应用程序,没有Spring

我希望能够将对象保存在应用程序作用域中,并使其可由任何其他会话获取。只有一个Tomcat服务器,它无论如何都不是联合的。在本例中,我们有基于已验证的AUTH_用户和ROLE_ID头的应用程序授权。代码会运行,但每次它将对象保存到应用程序范围时,它都会被遗忘,或者以后的任何请求都无法访问它。因此,不会发生缓存

我的问题是如何保存在一个请求中创建的对象,并通过应用程序作用域将其用于下一个请求。请查看代码中的注释,以了解我认为它应该在哪里工作

请求通过web JAX-RS类型函数传入。下面我所说的并不是它的编码方式,而是为了避免不必要的细节而进行了简化。一个例子是:

    @POST
    @Path("getDashboardTotalHubs")
    @Produces({ MediaType.APPLICATION_JSON + AppConstants.COMMA + MediaType.CHARSET_PARAMETER + AppConstants.UTF_8 })
    @Consumes(MediaType.APPLICATION_JSON)
    public Response getDashboardTotalHubs(@Context HttpServletRequest httpServletRequest,
            HubRequestFilter hubRequestFilter) {
        // I want to get check authorization based on the value of the HTTP request headers here.  
        this.httpServletRequest = httpServletRequest;
        AuthorizedHubRequest = getCachedAuthorizedHubRequestMap();
        
    }


我的server.xml是

<Server port="8015" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener"/>
  <Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/>
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>
  <GlobalNamingResources>
    <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
  </GlobalNamingResources>
  <Service name="Catalina">
    <Connector connectionTimeout="20000" port="8090" protocol="HTTP/1.1" redirectPort="8443"/>
    <Engine defaultHost="localhost" name="Catalina">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
      </Realm>
      <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log" suffix=".txt"/>
      </Host>
    </Engine>
  </Service>
</Server>
这是一个基于Java1.8和Tomcat9的应用程序,没有Spring

Javaservlet属性可用于在请求之间传递数据。有三个不同的作用域:请求作用域、会话作用域和应用程序作用域

我的问题是如何保存在一个请求中创建的对象,并通过应用程序作用域将其用于下一个请求。请查看代码中的注释,以了解我认为它应该在哪里工作

应用程序范围与web应用程序关联。只要部署了web应用程序,此作用域就存在。您可以在servlet上下文属性中设置应用程序范围的值属性。比如说

@WebServlet("/set-application-scope-attributes")
public class SetAttributesServlet extends HttpServlet{

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // set application scoped attribute
        req.getServletContext().setAttribute("name", "application scoped attribute");
// ...

}

可以通过调用另一种特定类型的请求来检索应用程序级作用域存储属性。例如:

@WebServlet("/get-application-scoped-attribute")
public class GetAttributesServlet extends HttpServlet{

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // get application scoped attribute
        String applicationScope = (String)req.getServletContext().getAttribute("name");

// ...

}
这是一个基于Java1.8和Tomcat9的应用程序,没有Spring

Javaservlet属性可用于在请求之间传递数据。有三个不同的作用域:请求作用域、会话作用域和应用程序作用域

我的问题是如何保存在一个请求中创建的对象,并通过应用程序作用域将其用于下一个请求。请查看代码中的注释,以了解我认为它应该在哪里工作

应用程序范围与web应用程序关联。只要部署了web应用程序,此作用域就存在。您可以在servlet上下文属性中设置应用程序范围的值属性。比如说

@WebServlet("/set-application-scope-attributes")
public class SetAttributesServlet extends HttpServlet{

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // set application scoped attribute
        req.getServletContext().setAttribute("name", "application scoped attribute");
// ...

}

可以通过调用另一种特定类型的请求来检索应用程序级作用域存储属性。例如:

@WebServlet("/get-application-scoped-attribute")
public class GetAttributesServlet extends HttpServlet{

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // get application scoped attribute
        String applicationScope = (String)req.getServletContext().getAttribute("name");

// ...

}

也许您需要会话,而不是应用程序范围。会话存储属性在HttpSession中,因此保存的信息将仅对来自同一用户的请求可用。

可能您需要会话,而不是应用程序范围。会话将属性存储在HttpSession中,因此保存的信息将仅对来自同一用户的请求可用。

Carlos,您是否意识到,在方法getAuthorizedHubRequest中,您实际上是在缓存变量结果,代码后面的变量结果必须为null,而不是新变量authorizedHubRequest?我认为这就是问题所在。

Carlos,您是否意识到,在getAuthorizedHubRequest方法中,您实际上是在缓存变量结果,代码后面的变量必须为null,而不是新变量authorizedHubRequest?我想这就是问题所在。

而且。。。你的实际问题是什么?@Stultuske我会编辑这个问题,但如上所述,我想在应用程序范围中保存一个对象。我上面的代码是为了在一个请求中保存工作并在下一个请求中访问它。this.httpServletRequest在哪里设置的?@Greg我编辑了我的问题以显示一个传入的JAX-RS请求示例。可以这样想:服务加载用户可能拥有的所有允许授权需要时间。因此,基于SAML集合头,它仅在缓存没有值的情况下从数据库中获取值。。。你的实际问题是什么?@Stultuske我会编辑这个问题,但如上所述,我想在应用程序范围中保存一个对象。我上面的代码是为了在一个请求中保存工作并在下一个请求中访问它。this.httpServletRequest在哪里设置的?@Greg我编辑了我的问题以显示一个传入的JAX-RS请求示例。可以这样想:服务加载用户可能拥有的所有允许授权需要时间。因此,基于SAML集合头,它只在缓存没有值的情况下从数据库中获取值。希望这次尝试能成功,你能拿到你的赏金。别担心@Woodsman。重要的是答案对你有帮助。致以最良好的祝愿。我想我早些时候接受了这个答案。希望这次尝试能成功,你能拿到你的赏金。别担心@Woodsman。重要的是答案对你有帮助。顺致敬意,