KHAN [session manager] is the scalable Web Session Manager for Infinispan(JBoss Data Grid) or Redis.
Opennau, Inc.
Blog
Presentation
KHAN [session manager]
KHAN [session manager]는 JBoss, Tomcat, WebLogic등 WAS의 세션 클러스터링을 위한 모듈입니다. WAS의 세션 클러스터링 기능을 In Memory Data Grid(IMDG) 제품인 JBoss Data Grid(Infinispan)이나 Redis를 사용하여 구축할 수 있도록 합니다. 기존 애플리케이션의 변경없이 web.xml 파일에 서블릿 필터 설정만 추가하고 필요 라이브러리를 추가하면 됩니다.
세션 구성 방법
KHAN [session manager]는 다음의 두가지 방법으로 WAS의 세션 클러스터링을 구축할 수 있습니다. 아래 두가지 방법을 혼용하여 사용할 수도 있습니다.
KHAN [session manager]의 주요 기능
빌드 방법
$ mvn install
사용 방법
Infinispan Library Mode
<dependency>
<groupId>com.opennaru.khan</groupId>
<artifactId>khan-session-infinispan</artifactId>
<version>1.3.0</version>
</dependency>
Filter Class : com.opennaru.khan.session.filter.InfinispanLibSessionFilter
Infinispan HotRod Mode
<dependency>
<groupId>com.opennaru.khan</groupId>
<artifactId>khan-session-hotrod</artifactId>
<version>1.3.0</version>
</dependency>
Filter Class : com.opennaru.khan.session.filter.InfinispanHotRodSessionFilter
Redis Mode
<dependency>
<groupId>com.opennaru.khan</groupId>
<artifactId>khan-session-redis</artifactId>
<version>1.3.0</version>
</dependency>
Filter Class : com.opennaru.khan.session.filter.RedisSessionFilter
web.xml 설정
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Opennaru, Inc. http://www.opennaru.com/
~
~ Copyright (C) 2014 Opennaru, Inc. and/or its affiliates.
~ All rights reserved by Opennaru, Inc.
~
~ This is free software; you can redistribute it and/or modify it
~ under the terms of the GNU Lesser General Public License as
~ published by the Free Software Foundation; either version 2.1 of
~ the License, or (at your option) any later version.
~
~ This software is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
~ Lesser General Public License for more details.
~
~ You should have received a copy of the GNU Lesser General Public
~ License along with this software; if not, write to the Free
~ Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
~ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-->
<web-app
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
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"
id="session1" version="2.5">
<display-name>Test</display-name>
<description>Test App</description>
<!-- <distributable/> -->
<filter>
<filter-name>KhanSessionFilter</filter-name>
<filter-class>com.opennaru.khan.session.filter.InfinispanLibSessionFilter</filter-class>
<!-- Infinispan Library Mode -->
<init-param>
<param-name>configFile</param-name>
<param-value>khan-session.xml</param-value>
</init-param>
<init-param>
<param-name>infinispanCache</param-name>
<param-value>KHAN_SESSION</param-value>
</init-param>
<init-param>
<param-name>infinispanLoginCache</param-name>
<param-value>KHAN_SESSION_LOGIN</param-value>
</init-param>
<init-param>
<param-name>sessionId</param-name>
<param-value>__KSMSID__</param-value>
</init-param>
<init-param>
<param-name>domain</param-name>
<param-value></param-value>
</init-param>
<init-param>
<param-name>path</param-name>
<param-value>/test1</param-value> <!-- 서로 다른 WebApp간 세션 공유하려면 '/' 으로 설정 -->
</init-param>
<init-param>
<param-name>secure</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>httpOnly</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>sessionTimeout</param-name>
<param-value>30</param-value>
</init-param>
<init-param>
<param-name>excludeRegExp</param-name>
<param-value>/.+\.(html|jpg|jpeg|png|gif|js|css|swf)</param-value>
</init-param>
<init-param>
<param-name>allowDuplicateLogin</param-name> <!-- 중복 로그인을 허용하려면 true로 설정 -->
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>logoutUrl</param-name> <!-- 중복 로그인시 logout URL 설정 -->
<param-value>/logout.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>KhanSessionFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>ERROR</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<listener>
<listener-class>com.opennaru.khan.session.listener.SessionListener</listener-class>
</listener>
* **Library 모드를 사용할 때 설정**
* khan-session.xml 파일에서 설정
```xml
<infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:infinispan:config:6.0 http://www.infinispan.org/schemas/infinispan-config-6.0.xsd"
xmlns="urn:infinispan:config:6.0">
<global>
<transport clusterName="opennaru">
<properties>
<property name="configurationFile" value="jgroups.xml" />
</properties>
</transport>
</global>
<default>
<locking concurrencyLevel="1000" useLockStriping="false" />
<unsafe unreliableReturnValues="true" />
<clustering mode="distribution">
<sync replTimeout="200000" />
<!-- <async/> -->
<hash numOwners="2" numSegments="40" />
<l1 enabled="true" lifespan="60000" />
</clustering>
<invocationBatching enabled="false" />
<transaction transactionMode="NON_TRANSACTIONAL" />
</default>
<namedCache name="KHAN_SESSION">
<jmxStatistics enabled="true" />
</namedCache>
<namedCache name="KHAN_SESSION_LOGIN">
<jmxStatistics enabled="true" />
</namedCache>
</infinispan>
infinispan.client.hotrod.server_list = 192.168.0.11:11222
Redis 모드를 사용할 때 설정
redis.client.server_url=redis://:@localhost:6379/1
메모리 모니터링을 위한 설정
export JAVA_OPTS=" $JAVA_OPTS -Djboss.modules.system.pkgs=org.jboss.byteman,org.github.jamm"
export JAVA_OPTS=" $JAVA_OPTS -javaagent:/PATH_TO_JAMM_JAR/jamm-0.2.5.jar"
중복로그인 방지 기능을 사용하려면 로그인, 로그아웃시 KHAN [session manager]가 제공하는 API를 사용하여 다음과 같이 로그인/로그아웃 코드를 추가하여야 합니다.
SessionLoginManager.getInstance().login(request, "userId");
SessionLoginManager.getInstance().logout(request);
SessionLoginManager.getInstance().loggedInUserId(request));