如何在 Jetty 上的 Spring 应用程序中将 jsessionid cookie 路径更改为服务器根目录?

Posted

技术标签:

【中文标题】如何在 Jetty 上的 Spring 应用程序中将 jsessionid cookie 路径更改为服务器根目录?【英文标题】:How to change jsessionid cookie path to server root in Spring app on Jetty? 【发布时间】:2012-09-27 03:44:13 【问题描述】:

我有一个在 /app 上下文上运行 Spring 应用程序的 Jetty 服务器。该应用程序使用会话,因此它设置了一个会话 cookie,其响应如下:

set-cookie:JSESSIONID=679b6291-d1cc-47be-bbf6-7ec75214f4e5; Path=/app; HttpOnly

我需要该 cookie 的路径为 / 而不是 webapp 的上下文。另外,我想使用安全 cookie。我想要这个回复:

set-cookie:JSESSIONID=679b6291-d1cc-47be-bbf6-7ec75214f4e5; Path=/; HttpOnly; Secure

配置会话 cookie 的合适位置在哪里?春天有帮助吗?它应该在web.xml 中吗?还是我需要以容器特定的方式配置它,例如jetty-web.xml

我已经尝试了很多东西,但到目前为止都没有奏效。以下是我尝试过的一些事情。


尝试 #1

使用以下内容创建WEB-INF/jetty-web.xml

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Get name="sessionHandler">
      <Get name="sessionManager">
        <Set name="sessionCookie">MYJETTYSESSION</Set>
        <Set name="sessionPath">/</Set>
        <Set name="secureCookies" type="boolean">true</Set>
        <Set name="httpOnly" type="boolean">true</Set>
      </Get>
    </Get>
</Configure>

这会导致抛出异常:

2012-10-05 02:41:41.180:WARN:oejx.XmlConfiguration:Config error at <Set name="sessionPath">/</Set> java.lang.NoSuchMethodException: class org.eclipse.jetty.server.session.HashSessionManager.setSessionPath(class java.lang.String)
2012-10-05 02:41:41.180:WARN:oejx.XmlConfiguration:Config error at <Get name="sessionManager"><Set name="sessionCookie">MYJETTYSESSION</Set><Set name="sessionPath">/</Set><Set name="secureCookies">true</Set><Set name="httpOnly">true</Set></Get> java.lang.NoSuchMethodException: class org.eclipse.jetty.server.session.HashSessionManager.setSessionPath(class java.lang.String)
2012-10-05 02:41:41.180:WARN:oejx.XmlConfiguration:Config error at <Get name="sessionHandler"><Get name="sessionManager"><Set name="sessionCookie">MYJETTYSESSION</Set><Set name="sessionPath">/</Set><Set name="secureCookies">true</Set><Set name="httpOnly">true</Set></Get></Get> java.lang.NoSuchMethodException: class 

完整的堆栈跟踪位于this gist。

尝试 #2

使用以下内容创建WEB-INF/jetty-web.xml

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Call name="setInitParameter">
        <Arg>org.eclipse.jetty.servlet.SessionCookie</Arg>
        <Arg>MYSESSIONID</Arg>
    </Call>
    <Call name="setInitParameter">
        <Arg>org.eclipse.jetty.servlet.SessionIdPathParameterName</Arg>
        <Arg>mysessionid</Arg>
    </Call>
    <Call name="setInitParameter">
        <Arg>org.eclipse.jetty.servlet.SessionPath</Arg>
        <Arg>/</Arg>
    </Call>
</Configure>

这不会导致任何异常,但是 cookie 仍然是 JSESSIONID 并且包含 webapp 上下文路径 /app

尝试 #3

更新了WEB-INF/web.xml,内容如下:

<context-param>
    <param-name>org.eclipse.jetty.servlet.SessionPath</param-name>
    <param-value>/</param-value>
</context-param>
<context-param>
    <param-name>org.eclipse.jetty.servlet.SessionCookie</param-name>
    <param-value>MYSESS</param-value>
</context-param>

这不会导致任何异常,但 cookie 仍然是 JSESSIONID 并包含 webapp 上下文路径 /app

尝试 #4

更新了WEB-INF/web.xml,内容如下:

<session-config>
    <session-timeout>720</session-timeout>
    <cookie-config>
        <name>SZSESSION</name>
        <path>/</path>
        <http-only>true</http-only>
        <secure>true</secure>
    </cookie-config>
</session-config>

这不会导致任何异常,但是 cookie 仍然是 JSESSIONID 并且包含 webapp 上下文路径 /app

Maven 配置

请注意,我正在使用 Jetty Maven 插件版本 8.1.5.v20120716 并执行mvn jetty:run

<jetty.maven.plugin.version>8.1.5.v20120716</jetty.maven.plugin.version>
<spring.version>3.0.0.RELEASE</spring.version>
  ...
<plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>$jetty.maven.plugin.version</version>
    <configuration>
        <scanIntervalSeconds>10</scanIntervalSeconds>
        <reload>manual</reload>
        <stopPort>$jetty.stop.port</stopPort>
        <stopKey>foo</stopKey>
        <webAppConfig>
              <contextPath>/app</contextPath>
        </webAppConfig>
    </configuration>
       ...
</plugin>

【问题讨论】:

我尝试了尝试 #4,但 cookie 仍然是 JSESSIONID。所以请建议你如何解决你的问题。 【参考方案1】:

为了我的理智,我只以编程方式配置 Jetty。如果您希望更改 Jetty 11 中的 cookie 路径:

sessionHandler.getSessionCookieConfig().setPath("/");

如果您没有显式创建 SessionHandler,则可以在创建 servlet 上下文之类的内容后获取对它的引用......

ServletContextHandler sch = new ServletContextHandler(..., "/api", true, false);
sch.getSessionHandler().getSessionCookieConfig().setPath("/");

这样,即使上下文位于/api 下,会话 cookie 也可以在其他上下文中访问。

【讨论】:

【参考方案2】:

尝试 #4 是正确的。

如果我没看错,你在上下文 /app 上使用 maven 配置,这意味着在你的 web.xml 中 / 你的设置 is /app 因为那是您正在配置的上下文。

换一种方式,如果您只是部署到 www.foo.com/app 上下文,则无法为 www.foo.com/ 配置会话,想象一下如果其他人正在将应用程序部署到该 url,您可以'不要只是决定让您的会话 cookie 应用于在该 url 下操作的每个人。

【讨论】:

以上是关于如何在 Jetty 上的 Spring 应用程序中将 jsessionid cookie 路径更改为服务器根目录?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 spring-boot 中配置 Jetty(很容易?)

如何在 spring-boot 中替换最新的 Jetty 9?

如何查看spring boot 支持的jetty版本

Day695.Spring Boot如何使用内嵌式的Tomcat和Jetty -深入拆解 Tomcat & Jetty

如何告诉 Spring Boot 忽略 Jetty 并始终使用 Tomcat?

Spring Boot如何使用内嵌式的Tomcat和Jetty?