前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Jetty配置自定义的JSESSIONID信息

Jetty配置自定义的JSESSIONID信息

作者头像
白凡
发布2018-08-07 17:05:29
2.1K0
发布2018-08-07 17:05:29
举报
文章被收录于专栏:光变

自定义Jetty的JSession的配置

初始化参数表格

Context参数名称

默认值

描述

org.eclipse.jetty.servlet.SessionCookie

JSESSIONID

会话cookie的名称默认是JSESSIONID,可以通过这个Context参数为特定的web应用设置名称

org.eclipse.jetty.servlet.SessionIdPathParameterName

jsessionid

会话URL的参数名称。默认是jsessionid,但可以通过这个Context参数为特定的web应用设置名称。如果值设置为”none”则禁用URL重写

org.eclipse.jetty.servlet.SessionDomain

-

会话域。如果ServletContext配置了该参数,就会使用该值作为会话cookie的域。如果没有设置,会话cookie就不会指定域。

org.eclipse.jetty.servlet.SessionPath

-

会话路径。 如果ServletContext配置了该参数,就会使用该值作为会话cookie的域。如果没有设置,会话cookie路径就会使用ContextPath。

org.eclipse.jetty.servlet.MaxAge

-1

Session的最长有效时间,单位秒.如果ServletContext配置了该参数,就会使用该值作为会话cookie的最大存活时间。如果没有设置,会话cookie的最长存活时间就会使用’-1’作为参数

org.eclipse.jetty.servlet.CheckingRemoteSessionIdEncoding

false

默认值是’false’,如果设置成’true’,Jetty会在调用encodeURL()方法时加入JSESSIONID参数,即使是外部url

如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。 maxAge为负数的Cookie,为临时性Cookie,不会被持久化,不会被写到Cookie文件中。 Cookie信息保存在浏览器内存中,因此关闭浏览器该Cookie就消失了。Cookie默认的maxAge值为-1。

使用初始化参数

下面提供了几个示例展示了如何使用初始化参数。

Context参数示例 可以在Web应用的WEB-INF/web.xml文件中指定这些参数。

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<web-app
  xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  version="2.5">
  ...
  <context-param>
  <param-name>org.eclipse.jetty.servlet.SessionCookie</param-name>
  <param-value>XSESSIONID</param-value>
  </context-param>
  <context-param>
  <param-name>org.eclipse.jetty.servlet.SessionIdPathParameterName</param-name>
  <param-value>xsessionid</param-value>
  </context-param>
  ...
</web-app>

Jetty应用参数设置 可以在Jetty容器的context xml配置文件或者代码中配置这些参数。

代码语言:javascript
复制
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="contextPath">/test</Set>
  <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/test</Set>

  ...

  <Call name="setInitParameter">
    <Arg>org.eclipse.jetty.servlet.SessionCookie</Arg>
    <Arg>XSESSIONID</Arg>
  </Call>
  <Call name="setInitParameter">
    <Arg>org.eclipse.jetty.servlet.SessionIdPathParameterName</Arg>
    <Arg>xsessionid</Arg>
  </Call>
</Configure>

SessionManager示例 可以在SessionManager实例或者代码中配置这些参数。

代码语言:javascript
复制
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="contextPath">/test</Set>
  <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/test</Set>

   ...

  <Get name="sessionHandler">
   <Set name="sessionManager">
     <New class="org.eclipse.jetty.server.session.HashSessionManager">
      <Set name="sessionCookie">XSESSIONID</Set>
      <Set name="sessionIdPathParameterName">xsessionid</Set>
     </New>
   </Set>
  </Get>
</Configure>

使用Servlet 3.0 Session配置

随着Servlet规范3.0的出现,有新的API来配置Session处理这些特性。 之前只能通过Jetty指定初始化参数来实现,现在可以使用容器无感知(container-agnostic)的方式通过代码或者web.xml实现。

SessionCookieConfiguration

javax.servlet.SessionCookieConfig类用于设定session处理这些特性。想要了解详细信息,请参考Javadoc文档。 下面是一个示例展示:一个ServletContextListener检索到SessionCookieConfig,并且在context初始化的时候设置新的值。

代码语言:javascript
复制
import javax.servlet.SessionCookieConfig;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class TestListener implements ServletContextListener {

  public void contextInitialized(ServletContextEvent sce) {
    String comment = "This is my special cookie configuration";
    String domain = "foo.com";
    String path = "/my/special/path";
    boolean isSecure = true;
    boolean httpOnly = false;
    int maxAge = 30000;
    String cookieName = "FOO_SESSION";
    SessionCookieConfig scf = sce.getServletContext().getSessionCookieConfig();

    scf.setComment(comment);
    scf.setDomain(domain);
    scf.setHttpOnly(httpOnly);
    scf.setMaxAge(maxAge);
    scf.setPath(path);
    scf.setSecure(isSecure);
    scf.setName(cookieName);
  }

  public void contextDestroyed(ServletContextEvent sce) {

  }
}

你也可以在web.xml中配置session处理这些特性:下面的示例和上面的代码做了完全相同的事情:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<web-app
  xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  metadata-complete="true"
  version="3.0">

  <session-config>
    <cookie-config>
      <comment>This is my special cookie configuration</comment>
        <domain>foo.com</domain>
        <http-only>false</http-only>
        <max-age>30000</max-age>
        <path>/my/special/path</path>
        <secure>true</secure>
        <name>FOO_SESSION</name>
     </cookie-config>
  </session-config>
</web-app>
SessionTrackingModes

除了配置会话cookie,从Servlet3.0规范后,你也可以配置 javax.servlet.SessionTrackingMode跟踪session。

如果想要确定容器使用了哪些默认的session跟踪特性,调用以下代码:

代码语言:javascript
复制
javax.servlet.SessionContext.getDefaultSessionTrackingModes();

如果改变session的跟踪模式,调用以下代码:

代码语言:javascript
复制
javax.servlet.SessionContext.setSessionTrackingModes(Set<SessionTrackingMode>);

也可以在web.xml文件中配置跟中模式,例如:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<web-app
   xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   metadata-complete="true"
   version="3.0">

   <session-config>
      <tracking-mode>URL</tracking-mode>
      <tracking-mode>COOKIE</tracking-mode>
   </session-config>
</web-app>

原文参照 官方文档:Session管理

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 初始化参数表格
  • 使用初始化参数
  • 使用Servlet 3.0 Session配置
    • SessionCookieConfiguration
      • SessionTrackingModes
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档