修改默认的 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.6
和 Jetty 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)
...
}
}
我的目标是通过 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.6
和 Jetty 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)
...
}
}