Dubbo REST APIでの絵文字のフィルタリング実装

Dubboを使用したREST APIを開発中に、ユーザーが入力するデータに絵文字が含まれているとMySQLのUTF-8エンコーディングの問題でエラーが発生しました。これを解決するために、絵文字を検出しブロックするフィルタリングロジックを実装しました。
この問題に対処するために、emoji-javaというオープンソースライブラリを利用しました。

Maven依存性追加

<dependency>
  <groupId>com.vdurmont</groupId>
  <artifactId>emoji-java</artifactId>
  <version>3.2.0</version>
</dependency>

フィルタリングロジックの実装

package com.example.api.interceptor;

import com.alibaba.dubbo.rpc.*;
import com.vdurmont.emoji.EmojiParser;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;

public class EmojiFilter implements Filter {

    private static final Log logger = LogFactory.getLog(EmojiFilter.class);
    private static final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        HttpServletResponse response = (HttpServletResponse) RpcContext.getContext().getResponse();
        String paramsJson = objectMapper.writeValueAsString(RpcContext.getContext().getArguments());

        if (paramsJson != null) {
            String cleanedParamsJson = EmojiParser.removeAllEmojis(paramsJson);
            if (!paramsJson.equals(cleanedParamsJson)) {
                logger.info("Illegal characters detected: " + paramsJson);
                sendErrorResponse(response, "909", "入力内容に不正な文字が含まれています。");
                return new RpcResult();
            }
        }

        return invoker.invoke(invocation);
    }

    private void sendErrorResponse(HttpServletResponse response, String errorCode, String message) {
        PrintWriter writer = null;
        try {
            response.setContentType("application/json; charset=utf-8");
            writer = response.getWriter();
            writer.print("{\"code\":\"" + errorCode + "\", \"message\":\"" + message + "\", \"data\":null}");
        } catch (Exception e) {
            logger.error("Error sending error response", e);
        } finally {
            if (writer != null) {
                writer.close();
            }
        }
    }
}

フィルタの設定

Dubboサービスにフィルタを適用するための設定を行います。

<dubbo:service interface="com.example.api.YourServiceInterface" ref="yourServiceImpl">
    <dubbo:filter ref="emojiFilter"/>
</dubbo:service>

これにより、クライアントから送信されたデータに絵文字が含まれている場合、フィルタによって検出しエラーレスポンスが返されます。

タグ: Dubbo rest-api emoji Java filters

7月10日 16:14 投稿