【问题标题】:Tomcat - Custom Session Cookie HandlingTomcat - 自定义会话 Cookie 处理
【发布时间】:2016-02-04 17:55:49
【问题描述】:

我的问题如下:我们正在努力将我们的应用程序部署为 Tomcat 内的 WebApp。但是,我们的软件能够在多租户模式下运行,即有多个“客户端”(租户)由 WebApp 的一个实例提供服务。

URL 看起来像这样(假设 WebApp 的上下文是/app

  • 对于客户端 Customer 1,将为 URL /app/customer1/<path> 提供数据
  • 对于客户端 Customer 2,数据将是 URL /app/customer2/<path> 的服务器

到目前为止,一切都按预期工作 - 除了会话管理。我们想为/app/customer1/app/customer2 的两条不同路径使用两个distinct Session Cookies。但是,问题在于 Tomcat 总是会为 WebApp 的上下文路径 /app 创建一个 Session Cookie,之后无法更改。

有人知道这个问题的解决方案吗?提前致谢!

迈克尔

【问题讨论】:

    标签: java session tomcat


    【解决方案1】:

    解决方案是为应用程序创建两个单独的 url 模式。

    使用@WebServlet:

    @WebServlet(
        urlPatterns={"/app/customer1/servlet", "/app/customer2/servlet"})
    

    或者,使用 web.xml

    <servlet>
        <servlet-name>MyApp</servlet-name>
        <servlet-class>myPackage.myClass</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyApp</servlet-name>
        <url-pattern>/app/customer1/servlet</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>MyApp</servlet-name>
        <url-pattern>/app/customer2/servlet</url-pattern>
    </servlet-mapping>
    

    现在,当您创建 cookie 时,路径将默认为访问 servlet 的路径。每个客户只会得到自己的 cookie。

    Cookie cookie = new Cookie("color", "green");
    

    这是一个显示和创建 cookie 的 servlet。

    @WebServlet(
        urlPatterns={"/app/customer1/servlet", "/app/customer2/servlet"})
    public class CookieExample extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
              throws ServletException, IOException {
            String urlSaved = "No Saved URL";
            Cookie[] cookies = req.getCookies();
            for (Cookie aCookie : cookies) {
                if ("url".equals(aCookie.getName())) {
                    urlSaved = aCookie.getValue();
                }
            }
            resp.getWriter().print("Saved url = " + urlSaved); 
            String path = req.getRequestURI().substring(
                req.getRequestURI().indexOf("/app")
            );
            resp.addCookie(new Cookie("url", path));
        }    
    
    }
    

    这是一张显示已创建两个名为“url”的 cookie 的图像。显示其中之一的详细信息。该路径是针对一个客户的,内容具有特定客户的路径,它是一个会话 cookie。另一个类似,只是路径是针对另一个客户的。

    我生成 cookie 的方式取决于应用程序的访问方式。我使用了两个不同的链接:

        <a href="app/customer1/servlet">Cookie Customer 1</a><br>
        <a href="app/customer2/servlet">Cookie Customer 2</a>       
    

    【讨论】:

    • 问题是,Tomcat 创建的 Session Cookie 不尊重这一点,它总是以应用程序的上下文作为路径创建(即/app)。我希望 Tomcat 设置的 Session Cookie 的行为与您描述的一样。