メインコンテンツまでスキップ
バージョン: 4.6.1-saas

Java Agent

概要

NetFUNNEL Java エージェントは、Java ベースの Spring Boot サーバーから NetFUNNEL サーバーと通信する専用クライアントです。

最小要件

  • Java 1.7 以上
  • Spring Boot 3.x 以上

外部依存

  • gson: JSON シリアライズ/デシリアライズ用ライブラリ
  • jackson-module-kotlin: Kotlin 利用時に必要なライブラリ(Java 利用時)

動作フロー

待機列の制御ポイントは、NetFUNNEL コンソールのセグメントトリガールールで設定できます。ユーザーがアクセスしたページの URL とトリガールールを比較し、一致した場合に待機列が適用されます。

待機前: ページ読み込み → エージェント初期化 → トリガールールマッチ 待機中: NetFUNNEL サーバーへリクエスト → NetFUNNEL キー発行 → 待機室ページへ遷移 待機後: サービスページ進入 → NetFUNNEL キー返却

エージェントのインストール

ライブラリの追加

Kotlin DSL (build.gradle.kts)

implementation(files'libs/netfunnel-agent.jar')
implementation(com.google.code.gson:gson:2.9.1)
implementation (com.fasterxml.jackson.module:jackson-module-kotlin)

Groovy DSL (build.gradle)

implementation files('libs/netfunnel-agent.jar')
implementation 'com.google.code.gson:gson:2.9.1'
// Java 利用時
implementation 'com.fasterxml.jackson.module:jackson-module-kotlin'

Interceptor の適用

警告

プロジェクト構成に合わせて Interceptor と Filter のいずれか一方のみを適用してください。どちらも同じ NetFUNNEL 待機列制御を提供するため、両方実装する必要はありません。

リクエストを最初に受け取る Interceptor に、以下のようにコードを追加します。

Kotlin

@Component
public class DemoInterceptor implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
NetFunnelInitializer initializer = getNetFunnelInitializer(requestUrl);
Netfunnel netfunnel = new Netfunnel(initializer, new NetFunnelServletService(request, response));
return netfunnel.run();
}

private NetFunnelInitializer getNetFunnelInitializer(String requestUrl) {
return NetFunnelInitializer.builder()
.clientId("{{CLIENT_ID}}")
.secretKey("{{SECRET_KEY}}")
.build();
}
}

Java

import com.stclab.Netfunnel;
import com.stclab.servlet.NetFunnelServletService;
import com.stclab.utils.NetFunnelInitialize;

@Component
public class DemoInterceptor implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
NetFunnelInitialize config = NetFunnelInitialize.Companion.builder()
.clientId("{{CLIENT_ID}}")
.secretKey("{{SECRET_KEY}}")
.build();

Netfunnel netfunnel = new Netfunnel(config, new NetFunnelServletService(request, response), null, null);
return netfunnel.run();
}
}

作成した Interceptor を、WebMvcConfigurer の addInterceptors をオーバーライドして登録します。

Kotlin

@Configuration
public class WebConfig implements WebMvcConfigurer {

private final DemoInterceptor demoInterceptor;

@Autowired
public WebConfig(DemoInterceptor demoInterceptor) {
this.demoInterceptor = demoInterceptor;
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(demoInterceptor);
}
}

Java

@Configuration
public class WebConfig implements WebMvcConfigurer {

private final DemoInterceptor demoInterceptor;

@Autowired
public WebConfig(DemoInterceptor demoInterceptor) {
this.demoInterceptor = demoInterceptor;
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(demoInterceptor)
.addPathPatterns("/**");
}
}

Filter の適用

リクエストを最初に受け取る Filter に、以下のようにコードを追加します。

Kotlin

@Component
public class DemoFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;

NetFunnelInitializer initializer = getNetFunnelInitializer(requestUrl);
Netfunnel netfunnel = new Netfunnel(initializer, new NetFunnelServletService(request, response));

if (netfunnel.run()) {
chain.doFilter(servletRequest, servletResponse);
}
}

private NetFunnelInitializer getNetFunnelInitializer(String requestUrl) {
return NetFunnelInitializer.builder()
.clientId("{{CLIENT_ID}}")
.secretKey("{{SECRET_KEY}}")
.build();
}
}

Java

import com.stclab.Netfunnel;
import com.stclab.servlet.NetFunnelServletService;
import com.stclab.utils.NetFunnelInitialize;

public class DemoFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;

NetFunnelInitialize config = NetFunnelInitialize.Companion.builder()
.clientId("{{CLIENT_ID}}")
.secretKey("{{SECRET_KEY}}")
.build();

Netfunnel netfunnel = new Netfunnel(config, new NetFunnelServletService(request, response), null, null);

if (!netfunnel.run()) {
return;
}

chain.doFilter(servletRequest, servletResponse);
}
}

作成した Filter を Bean に登録します。

Kotlin

@Configuration
@RequiredArgsConstructor
public class FilterConfig {
private final DemoFilter demoFilter;

@Bean
public FilterRegistrationBean<Filter> filterRegistrationBean() {
return new FilterRegistrationBean<>(demoFilter);
}
}

Java

@Configuration
@RequiredArgsConstructor
public class FilterConfig {

@Bean
public FilterRegistrationBean<Filter> filterRegistrationBean() {
FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
registration.setFilter(new DemoFilter());
registration.addUrlPatterns("/*");
registration.setOrder(1);
return registration;
}
}

Initialize 設定

フィールド既定値必須説明エージェントバージョン
clientIdN/AOコンソールで発行されたクライアント ID を入力します。4.0.1 以上
secretKeyN/AOコンソールで発行された秘密鍵を入力します。4.0.1 以上
serverUrlN/AXNetFUNNEL サーバーの URL。CNAME を使わず、clientId ベース以外の URL でサーバーにアクセスする場合に指定します。<br />(従来方式との互換のためサポート。)4.0.1 以上
settingUrlN/AXNetFUNNEL 環境設定ファイルの URL。CNAME を使わず、clientId ベース以外の URL で設定を読み込む場合に指定します。<br />(従来方式との互換のためサポート。)4.0.1 以上
vwrPageUrlN/AXNetFUNNEL VWR ページの URL。CNAME を使わず、clientId ベース以外の URL で待機室に遷移する場合に指定します。4.0.1 以上
returnKeytrueXユーザーが待機列を通過してページに進入すると、次のユーザーがすぐに入場できます。<br />無効にすると、進入後も一定時間は次のユーザーが待機します。<br />(タイムアウトはコンソールのセグメント設定 > 詳細設定で設定。)4.0.1 以上
logLevelLevel.OFFXch.qos.logback.classic.Level に基づきログレベルを設定します。該当依存の追加が必要です。<br />指定可能: ERROR, WARN, INFO, DEBUG, TRACE, OFF4.0.1 以上
goodBotsN/AX検索エンジンなどの善意のボットを NetFUNNEL 進入リクエストから除外します。文字列の配列で指定。<br />例: ["Googlebot", "Bingbot"]4.0.1 以上
userIdN/AX指定すると、ホワイトリスト・永久ブロックの識別にこの ID が使われます。<br />コンソールの反復リクエストブロック > ユーザー設定 > 訪問者管理で設定した ID が適用されます。4.0.1 以上
vwrPageDomainN/AXCNAME ドメインのみで VWR ページ URL を構成する場合に指定します。<br />例: https://vwr.example.com4.0.1 以上
cookieDomainN/AX発行する NetFUNNEL クッキーのドメインを直接指定できます。4.0.1 以上

エージェントの適用

待機列の制御ポイントは、NetFUNNEL コンソールのセグメントトリガールールで設定できます。ユーザーがアクセスしたページの URL とトリガールールを比較し、一致した場合に待機列が適用されます。

設定オプション

  • Logical Operator: トリガールールを 2 つ以上作る場合、and / or で関係を定義します。
  • Validator: トリガールールの対象となる最上位の範囲を定義します(例: URL のみ)。
  • Component: Validator で定義した範囲内で、より細かく対象を指定します(例: URL 全体、パス)。
  • Negate: 設定した条件の逆を適用する場合に使用します。
  • Match: ルールが適用される条件の種類を定義します(Equals、Exists など)。
  • Value: ルール評価時に比較する値を指定します。Match と組み合わせて使用します。
  • Aa: Value の比較で大文字・小文字を区別するかどうかを指定します。

Match オプション

  • Exists: URL にその Component が存在するか確認します。(Component が Path のときのみ使用可能。)
  • Equals: Component の値と Value が完全に一致するか確認します。
  • Contains: Component の値に Value が含まれるか確認します。
  • StartsWith: Component の値が Value で始まるか確認します。
  • EndsWith: Component の値が Value で終わるか確認します。

トリガールールのテスト

待機列を適用したい URL がトリガールールに合うか、事前にテストできます。