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表情就会被拦截器拦截直接返回提示
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人