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 設定
| フィールド | 既定値 | 必須 | 説明 | エージェントバージョン |
|---|---|---|---|---|
| clientId | N/A | O | コンソールで発行されたクライアント ID を入力します。 | 4.0.1 以上 |
| secretKey | N/A | O | コンソールで発行された秘密鍵を入力します。 | 4.0.1 以上 |
| serverUrl | N/A | X | NetFUNNEL サーバーの URL。CNAME を使わず、clientId ベース以外の URL でサーバーにアクセスする場合に指定します。<br />(従来方式との互換のためサポート。) | 4.0.1 以上 |
| settingUrl | N/A | X | NetFUNNEL 環境設定ファイルの URL。CNAME を使わず、clientId ベース以外の URL で設定を読み込む場合に指定します。<br />(従来方式との互換のためサポート。) | 4.0.1 以上 |
| vwrPageUrl | N/A | X | NetFUNNEL VWR ページの URL。CNAME を使わず、clientId ベース以外の URL で待機室に遷移する場合に指定します。 | 4.0.1 以上 |
| returnKey | true | X | ユーザーが待機列を通過してページに進入すると、次のユーザーがすぐに入場できます。<br />無効にすると、進入後も一定時間は次のユーザーが待機します。<br />(タイムアウトはコンソールのセグメント設定 > 詳細設定で設定。) | 4.0.1 以上 |
| logLevel | Level.OFF | X | ch.qos.logback.classic.Level に基づきログレベルを設定します。該当依存の追加が必要です。<br />指定可能: ERROR, WARN, INFO, DEBUG, TRACE, OFF | 4.0.1 以上 |
| goodBots | N/A | X | 検索エンジンなどの善意のボットを NetFUNNEL 進入リクエストから除外します。文字列の配列で指定。<br />例: ["Googlebot", "Bingbot"] | 4.0.1 以上 |
| userId | N/A | X | 指定すると、ホワイトリスト・永久ブロックの識別にこの ID が使われます。<br />コンソールの反復リクエストブロック > ユーザー設定 > 訪問者管理で設定した ID が適用されます。 | 4.0.1 以上 |
| vwrPageDomain | N/A | X | CNAME ドメインのみで VWR ページ URL を構成する場合に指定します。<br />例: https://vwr.example.com | 4.0.1 以上 |
| cookieDomain | N/A | X | 発行する 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 がトリガールールに合うか、事前にテストできます。