修改默认的 JSESSIONID cookie,Scala Lift Framework

Modifying the default JSESSIONID cookie, Scala Lift Framework

我的目标是通过 scala 代码修改默认的 JSESSIONID cookie(servlet cookie)。

如果我直接对 web.xml 中的值进行硬编码,效果会很好,如下所示。

web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

  <context-param>
    <param-name>org.eclipse.jetty.servlet.SessionDomain</param-name>
    <param-value>.subdomain.com</param-value>
  </context-param>

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

  ...
</web-app>

但是当我尝试通过下面的 scala 代码修改它时它不起作用,我想它缺少一些步骤。

Boot.scala

package bootstrap.liftweb

...
import org.eclipse.jetty.servlet.ServletContextHandler


/**
 * A class that's instantiated early and run.  It allows the application
 * to modify lift's environment
 */
class Boot {
  def boot {

    val context = new ServletContextHandler(ServletContextHandler.SESSIONS)
    context.setInitParameter("org.eclipse.jetty.servlet.SessionCookie", "CustomID")
    context.setInitParameter("org.eclipse.jetty.servlet.SessionDomain", ".subdomain.com")

    ...
  }
}

但 JSESSIONID cookie 仍未修改。

我正在尝试遵循以下看起来有点相似的 Stack Overflow 问题

Set Jetty session cookie name programmatically

根据这个解决方案,它使用的是 SessionHandler 但我相信在我的情况下我不能使用它,因为我相信在 Boot.scala 执行时会话已经创建并且看起来像context.setSessionHandler(...) 抛出错误。

ServletContextHandler.java

...
public class ServletContextHandler extends ContextHandler
{   ...
    public void setSessionHandler(SessionHandler sessionHandler)
    {
        if (isStarted())
            throw new IllegalStateException("STARTED");

        _sessionHandler = sessionHandler;
    }
    ...
}

我不确定如何连接它。

我正在使用 Lift 2.6Jetty 8

我按如下方式修复了它。

build.sbt

...

libraryDependencies ++= {
  ...
  Seq(
    ...
    "org.eclipse.jetty" % "jetty-webapp"        % "8.1.17.v20150415"  % "container,test,compile",
    "org.eclipse.jetty.orbit" % "javax.servlet" % "3.0.0.v201112011016" % "container,test,compile" artifacts Artifact("javax.servlet", "jar", "jar"),
    ...

  )
}

...

Boot.scala

...

import javax.servlet.http.HttpServletRequest
import net.liftweb.http.provider.servlet.HTTPRequestServlet
import org.eclipse.jetty.server.{Request=>JettyReq}

class Boot {
  def boot {

    def servletRequest(req: Req): Box[HttpServletRequest] = for {
      inner <- Box.asA[HTTPRequestServlet](req.request)
    } yield inner.req

    def setCookieDomain(req: Req) = {

      servletRequest(req).foreach { r =>
      {
        val sessionManager = r.asInstanceOf[JettyReq].getSessionManager
        val cookieConfig = sessionManager.getSessionCookieConfig

        cookieConfig.setDomain(".subdomain.com")
      }
      }
    }

    LiftRules.onBeginServicing.append(setCookieDomain)

    ...
  }
}