2018-10-17 08:48:45

修改Spring Data Elasticsearch 对象序列化方式

Spring Data Elasticsearch默认采用了Jackson作为对象序列化方式,但是为了保持Json序列化一致性就不得不修改Spring Data Elasticsearch的序列化结果了,这里讲下如何使用的是Fastjson来序列化Spring Data Elasticsearch查询出来的数据。 Spring Data Elasticsearch中,默认会调用org.springframework.data.elasticsearch.core.DefaultResultMapper来映射ElasticSearch返回的结果,而最终序列化方法在DefaultResultMapper的父类org.springframework.data.elasticsearch.core.AbstractResultMapper的publicT mapEntity(String source, Classclazz)方法,所以只需要想办法重写mapEntity方法就行了。 在Spring Boot项目中定义下自定义的ElasticsearchTemplate就可以实现自定义ResultMapper了: @Bean("elasticsearchTemplate") public ElasticsearchTemplate elasticsearchTempla

2018-08-03 09:47:51

Spring MVC MultipartResolver特性-QP编码

今天看Spring的Multipart处理发现一段比较奇怪的代码: 奇怪的是Spring为什么会对“=?”、“?=”进行特殊处理?跟进后发现这玩意是QP编码,用来解决邮件内附件编码问题。Spring调用了java mail的api对文件上传的附件文件名称进行了QP编码。 既然已知Spring的这个特性,那么某些时候或许就可以通过对文件名称进行编码来绕过传统的waf、cdn的防御了。 利用Java mail库生成特殊的文件名: 上传进行编码后的文件: Spring会做decode解析:

2018-06-14 07:24:21

Spring Boot 2.x JPA 不能够添加自定义Repository

升级Spring Boot版本后出现了大量的问题,升级到新版的Spring data JPA 会报错: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sysPostAPI': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sysPostServiceImpl': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sysPostRepositoryImpl': Injection of resource dependencies failed; nested exception is org.spr

2018-05-23 08:09:31

Mac IDEA+CLION jni Hello World

新建一个空的javaweb-jni项目,并在IDEA添加拓展工具: 添加拓展工具: Program: $JDKPath$/bin/javah Arguments: -jni -classpath $OutputPath$ -d ./jni/ $FileClass$ Working directory: $ProjectFileDir$  新建org.javaweb.jni.Test.java: package org.javaweb.jni; public class Test { static { System.loadLibrary("test"); } private static native String exec(String cmd); public static void main(String[] args) { System.out.println(exec("123")); } } 生成JNI头文件测试: 成功生成的头文件会存放在当前项目根目录下创建jni目录: Clion新建C项目: 复制jni.h和jni_md.h到Clion项目目录(jdk1.8.0_144.jdk换成本地的JDK版本): cd /Library/J

2018-05-08 07:57:18

一个绕Runtime、ProcessBuilder的linux-cmd.jsp

最近有人问怎么绕过ProcessBuilder的exec方法,所以就写了一个可以绕大部分WAF或者说RASP的jsp。原理很简单:直接反射java.lang.UNIXProcess类。 请求:http://localhost:8080/linux-cmd.jsp?str=ls -la Windows版懒得写,会的朋友自己动手稍微改下就可以了。 下载地址:linux-cmd.jsp.zip 再发一个纯Java反射ProcessBuilder类的cmd.jspx,下载地址:cmd.jspx

2018-04-13 08:09:56

Java SpEL、Ognl、MVEL2表达式Hook项目

最近Spring连续两个命令执行,SpEL表达式在Spring的子项目中大量的使用甚至是滥用让人感觉不到安全。昨天写了一个Hook并记录Java表达式语言的项目,可用于观测命令和执行点调用链信息。适当的改改可以直接用于拦截未知的表达式注入漏洞攻击。 git地址:https://github.com/anbai-inc/javaweb-expression 这是一个专门Hook并记录Java表达式语言执行的Agent小程序。逻辑非常简单,适合初学者使用。所有的实现代码逻辑都在:org.javaweb.expression.Agent.java类里面。导入javaweb-expression并构建expression-agent模块。然后在程序运行之前加入以下jvm参数: -noverify -javaagent:/目标路径/expression-agent.jar -Dfile.encoding=UTF-8 如果是Tomcat需要修改catalina.sh或者catalina.bat文件,添加如下配置参数:JAVA_OPTS="-noverify -javaagent:/目标路径/expression-agent.jar 成功插入后控制台(可以根据具体的情况输出到文件或者数据库)会打印出拦截到的表达式和程序调用链。 如: --------------------------

2018-03-16 09:43:51

2018-01-12 06:26:25

AB在线Markdown编辑器

Git地址:https://github.com/anbai-inc/ab-editor 简介 这是一个简单的Markdown在线编辑器,演示项目环境是一个SpringBoot+JPA的maven项目,clone后请修改数据库密码。项目比较简单,调用请参考示例editor.html。前端代码依赖主要markdown-it.js jquery、codemirror、jquery-file-upload。  支持表情包和文件上传(表情包支持自定义表情分组、图片、描述之类的)。  基本配置 创建编辑器时可以指定表情包、文件上传的API地址: var editor = $('#ab_editor_demo').ABEditor({ "url": "./api/ab-editor/upload_json.php", "emoji_api": "./api/ab-editor/emoji.php", "height": 400 }); 当然也可以通过height和width指定编辑器的宽高。 获取编辑器值方式:editor.getValue() HTML渲染markdown方式: var md = markdownit({ htm

2017-12-11 05:53:54

Elasticsearch The number of object passed must be even but was [1]

新版的elasticsearch 在调用setSource的时候传入json字符串、对象后都会爆:The number of object passed must be even but was [1].其实是新版需要传入Map类型。 使用fastjson转换成Map对象 Map data = JSONObject.parseObject((String) doc.get("json"), Map.class); 使用自带的XContentParser XContentParser parser = XContentFactory.xContent(XContentType.JSON). createParser(NamedXContentRegistry.EMPTY, json); 然后在setSource时转换成Map类型: .setSource(parser.map())

2017-11-06 08:20:13

Proxifier Mac和Windows全局代理

有很多时候我们利用ShadowsocksX或者SSH隧道打开代理后发现Mac和windows都无法全流量代理。Proxifier只需要简单的配置就可以支持全局的流量代理。 首先需要利用SSH隧道或者ShadowsocksX先在本地开发一个Socket代理(监听一个用于本机代理的socket端口)。 Mac版本配置 如果要使用mac下的ssh代理隧道,在控制台执行如下命令:ssh -nNTf -D 1080 root@123.123.123.123 (123.123.123.123是你的远程linux服务器地址)。如果用ShadowsocksX直接配置好ss服务器代理就可以了。 点击Proxies添加一个Socket5代理,如图: 设置代理规则(Applications可以选择你想要代理的应用,默认是任何的mac应用): action选择前面配置好的Socket5代理。 Windows版本 Windows版本配置过于简单,启动好ShadowsocksX或者ssh代理后直接添加代理就可以了。 Mac版:Proxifier+for+Mac+2.15.3.dmg (安装密码www.ifunmac.com) Windows汉化版:HA-Proxifier331-LDR.rar