dubbo rest emoji表情拦截器 java实现
最近给公司开发了一个手机app,当添加或修改数据的时候,只要参数内容包含"emoji表情"就会报错,原因是mysql数据库同一格式为UTF-8,保存不了"emoji表情"。
当时在网上也找了一些处理emoji的工具类,但是只能处理类似qq的表情,处理不了输入法的emoji表情,由于产品要求必须拦截。
为之困惑,就继续找,功夫不负有心人,最后还是找到了。
没错就是它,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表情就会被拦截器拦截直接返回提示