dubbo rest emoji表情拦截器 java实现

最近给公司开发了一个手机app,当添加或修改数据的时候,只要参数内容包含"emoji表情"就会报错,原因是mysql数据库同一格式为UTF-8,保存不了"emoji表情"。

 

当时在网上也找了一些处理emoji的工具类,但是只能处理类似qq的表情,处理不了输入法的emoji表情,由于产品要求必须拦截。

为之困惑,就继续找,功夫不负有心人,最后还是找到了。

 

emoji-java

 

没错就是它,emoji-java开源库

 

实现如下:

 

1.maven依赖

 

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

 

 

 

2.代码实现

 

package com.jlj.erp.app.web.interceptor;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.alibaba.dubbo.rpc.Filter;
import com.alibaba.dubbo.rpc.Invocation;
import com.alibaba.dubbo.rpc.Invoker;
import com.alibaba.dubbo.rpc.Result;
import com.alibaba.dubbo.rpc.RpcContext;
import com.alibaba.dubbo.rpc.RpcException;
import com.alibaba.dubbo.rpc.RpcResult;
import com.jlj.erp.app.dubbo.domain.base.ApiResult;
import com.jlj.erp.common.dict.AppDict;
import com.jlj.erp.common.dict.AppMessageDict;
import com.tools.common.util.close.CloseUtil;
import com.tools.common.util.json.JsonUtil;
import com.vdurmont.emoji.EmojiParser;
/**
 * @描述 : 特殊字符拦截器
 * @创建者 : HeZeMin
 * @创建时间 : 2017-6-19 上午10:25:17
 */
public class EmojiInterceptor implements Filter{
    /*******************************声明区*******************************************/
    private static final Log LOG = LogFactory.getLog(EmojiInterceptor.class);
    /*******************************方法区*******************************************/
    /**
     * @描述 : 特殊字符验证
     * @创建者 : HeZeMin
     * @创建时间 : 2017-6-19 上午10:25:17
     */
	@Override
	public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
	    HttpServletResponse response = (HttpServletResponse)RpcContext.getContext().getResponse();
            //把参数信息转成json字符串
            String param = JsonUtil.toJson(RpcContext.getContext().getArguments());
	    if(null != param){
            //移除请求参数里面的emoji表情
            String removeAllEmojisParam = EmojiParser.removeAllEmojis(param);
            //判断没处理的值与处理过的值是否相同,如果不相同,说明该参数包含emoji表情,返回
            if (!param.equals(removeAllEmojisParam)) {
    		    LOG.info("非法字符:" + param);
    		    ApiResult app = new ApiResult();
    			app.setCode("909"); 
    			app.setMessage("含有非法字符集,请检查所填内容"); 
    			app.setData("");
    			print(JsonUtil.toJson(app), response);
    			return new RpcResult();
    		}else {
    			return invoker.invoke(invocation);
    		}
		}else {
		    return invoker.invoke(invocation);
		}
	}
	/**
	 * @描述 : 输出
	 * @创建者 : HeZeMin
	 * @创建时间 : 2017-6-19 上午10:26:59
	 */
	protected void print(String str, HttpServletResponse response) {
		PrintWriter writer = null;
		try {
			response.setContentType("text/html; charset=utf-8" );
			writer = response.getWriter();
			writer.print(str);
		} catch (Exception e) {
		    LOG.error("--------print------error----------", e);
		} finally {
			CloseUtil.close(writer);
		}
	}
	
	
	
	
}

 

3.filter配置如下

 

 

4.在dubbo:service加上

 

 

5.OK啦,当app提交数据时包含emoji表情就会被拦截器拦截直接返回提示

 

 

 

 

 

posted @ 2022-10-27 08:48  何童鞋  阅读(79)  评论(0编辑  收藏  举报