|
14 | 14 |
|
15 | 15 | package apijson.boot;
|
16 | 16 |
|
| 17 | +import apijson.JSON; |
17 | 18 | import apijson.fastjson2.APIJSONApplication;
|
18 | 19 | import apijson.fastjson2.APIJSONCreator;
|
19 | 20 | import apijson.fastjson2.APIJSONVerifier;
|
20 | 21 | import apijson.fastjson2.APIJSONSQLConfig;
|
21 | 22 | import apijson.orm.AbstractParser;
|
22 | 23 | import apijson.orm.AbstractVerifier;
|
| 24 | +import com.alibaba.fastjson.JSONObject; |
| 25 | +import com.alibaba.fastjson.serializer.PropertyFilter; |
23 | 26 | import org.springframework.boot.SpringApplication;
|
24 | 27 | import org.springframework.boot.autoconfigure.SpringBootApplication;
|
25 | 28 | import org.springframework.boot.web.server.WebServerFactoryCustomizer;
|
|
30 | 33 | import org.springframework.web.servlet.config.annotation.CorsRegistry;
|
31 | 34 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
32 | 35 |
|
| 36 | +import java.lang.reflect.Modifier; |
| 37 | +import java.util.List; |
33 | 38 | import java.util.Map;
|
34 | 39 | import java.util.regex.Pattern;
|
35 | 40 |
|
|
43 | 48 | import apijson.demo.DemoSQLConfig;
|
44 | 49 | import apijson.demo.DemoSQLExecutor;
|
45 | 50 | import apijson.demo.DemoVerifier;
|
46 | | -import apijson.orm.Verifier; |
47 | | -//import unitauto.MethodUtil; |
48 | | -//import unitauto.MethodUtil.Argument; |
49 | | -//import unitauto.MethodUtil.InstanceGetter; |
50 | | -//import unitauto.MethodUtil.JSONCallback; |
51 | | -//import unitauto.jar.UnitAutoApp; |
| 51 | +import unitauto.MethodUtil; |
| 52 | +import unitauto.MethodUtil.Argument; |
| 53 | +import unitauto.MethodUtil.InstanceGetter; |
| 54 | +import unitauto.MethodUtil.JSONCallback; |
| 55 | +import unitauto.jar.UnitAutoApp; |
52 | 56 |
|
53 | 57 |
|
54 | 58 | /**
|
@@ -265,96 +269,96 @@ public DemoSQLExecutor createSQLExecutor() {
|
265 | 269 |
|
266 | 270 | // UnitAuto 单元测试配置 https://github.com/TommyLemon/UnitAuto <<<<<<<<<<<<<<<<<<<<<<<<<<<
|
267 | 271 | // FIXME 不要开放给项目组后端之外的任何人使用 UnitAuto(强制登录鉴权)!!!如果不需要单元测试则移除相关代码或 unitauto.Log.DEBUG = false;
|
268 | | - //UnitAutoApp.init(); |
| 272 | + UnitAutoApp.init(); |
269 | 273 |
|
270 | 274 | // 适配 Spring 注入的类及 Context 等环境相关的类
|
271 | | - //final InstanceGetter ig = MethodUtil.INSTANCE_GETTER; |
272 | | - //MethodUtil.INSTANCE_GETTER = new InstanceGetter() { |
273 | | -// |
274 | | - // @Override |
275 | | - // public Object getInstance(@NotNull Class<?> clazz, List<Argument> classArgs, Boolean reuse) throws Exception { |
276 | | - // if (APPLICATION_CONTEXT != null && ApplicationContext.class.isAssignableFrom(clazz) && clazz.isAssignableFrom(APPLICATION_CONTEXT.getClass())) { |
277 | | - // return APPLICATION_CONTEXT; |
278 | | - // } |
279 | | -// |
280 | | - // if (reuse != null && reuse && (classArgs == null || classArgs.isEmpty())) { |
281 | | - // return APPLICATION_CONTEXT.getBean(clazz); |
282 | | - // } |
283 | | -// |
284 | | - // return ig.getInstance(clazz, classArgs, reuse); |
285 | | - // } |
286 | | - //}; |
287 | | -// |
288 | | - //// 排除转换 JSON 异常的类,一般是 Context 等环境相关的类 |
289 | | - //final JSONCallback jc = MethodUtil.JSON_CALLBACK; |
290 | | - //MethodUtil.JSON_CALLBACK = new JSONCallback() { |
291 | | -// |
292 | | - // @Override |
293 | | - // public JSONObject newSuccessResult() { |
294 | | - // return jc.newSuccessResult(); |
295 | | - // } |
296 | | -// |
297 | | - // @Override |
298 | | - // public JSONObject newErrorResult(Throwable e) { |
299 | | - // return jc.newErrorResult(e); |
300 | | - // } |
301 | | -// |
302 | | - // @Override |
303 | | - // public JSONObject parseJSON(String type, Object value) { |
304 | | - // if (value == null || unitauto.JSON.isBooleanOrNumberOrString(value) || value instanceof JSON || value instanceof Enum) { |
305 | | - // return jc.parseJSON(type, value); |
306 | | - // } |
307 | | -// |
308 | | - // if (value instanceof ApplicationContext |
309 | | - // || value instanceof Context |
310 | | - // || value instanceof org.apache.catalina.Context |
311 | | - // // SpringBoot 2.6.7 已移除 || value instanceof ch.qos.logback.core.Context |
312 | | - // ) { |
313 | | - // value = value.toString(); |
314 | | - // } else { |
315 | | - // try { |
316 | | - // value = parseJSON(JSON.toJSONString(value, new PropertyFilter() { |
317 | | - // @Override |
318 | | - // public boolean apply(Object object, String name, Object value) { |
319 | | - // if (value == null) { |
320 | | - // return true; |
321 | | - // } |
322 | | -// |
323 | | - // if (value instanceof ApplicationContext |
324 | | - // || value instanceof Context |
325 | | - // || value instanceof org.apache.catalina.Context |
326 | | - // // SpringBoot 2.6.7 已移除 || value instanceof ch.qos.logback.core.Context |
327 | | - // ) { |
328 | | - // return false; |
329 | | - // } |
330 | | -// |
331 | | - // // 防止通过 UnitAuto 远程执行 getDBPassword 等方法来查到敏感信息,但如果直接调用 public String getDBUri 这里没法拦截,仍然会返回敏感信息 |
332 | | - // // if (object instanceof SQLConfig) { |
333 | | - // // // 这个类部分方法不序列化返回 |
334 | | - // // if ("dBUri".equalsIgnoreCase(name) || "dBPassword".equalsIgnoreCase(name) || "dBAccount".equalsIgnoreCase(name)) { |
335 | | - // // return false; |
336 | | - // // } |
337 | | - // // return false; // 这个类所有方法都不序列化返回 |
338 | | - // // } |
339 | | -// |
340 | | - // // 所有类中的方法只要包含关键词就不序列化返回 |
341 | | - // String n = StringUtil.toLowerCase(name); |
342 | | - // if (n.contains("database") || n.contains("schema") || n.contains("dburi") || n.contains("password") || n.contains("account")) { |
343 | | - // return false; |
344 | | - // } |
345 | | -// |
346 | | - // return Modifier.isPublic(value.getClass().getModifiers()); |
347 | | - // } |
348 | | - // })); |
349 | | - // } catch (Exception e) { |
350 | | - // Log.e(TAG, "toJSONString catch \n" + e.getMessage()); |
351 | | - // } |
352 | | - // } |
353 | | -// |
354 | | - // return jc.parseJSON(type, value); |
355 | | - // } |
356 | | -// |
357 | | - //}; |
| 275 | + final InstanceGetter ig = MethodUtil.INSTANCE_GETTER; |
| 276 | + MethodUtil.INSTANCE_GETTER = new InstanceGetter() { |
| 277 | + |
| 278 | + @Override |
| 279 | + public Object getInstance(@NotNull Class<?> clazz, List<Argument> classArgs, Boolean reuse) throws Exception { |
| 280 | + if (APPLICATION_CONTEXT != null && ApplicationContext.class.isAssignableFrom(clazz) && clazz.isAssignableFrom(APPLICATION_CONTEXT.getClass())) { |
| 281 | + return APPLICATION_CONTEXT; |
| 282 | + } |
| 283 | + |
| 284 | + if (reuse != null && reuse && (classArgs == null || classArgs.isEmpty())) { |
| 285 | + return APPLICATION_CONTEXT.getBean(clazz); |
| 286 | + } |
| 287 | + |
| 288 | + return ig.getInstance(clazz, classArgs, reuse); |
| 289 | + } |
| 290 | + }; |
| 291 | + |
| 292 | + // 排除转换 JSON 异常的类,一般是 Context 等环境相关的类 |
| 293 | + final JSONCallback jc = MethodUtil.JSON_CALLBACK; |
| 294 | + MethodUtil.JSON_CALLBACK = new JSONCallback() { |
| 295 | + |
| 296 | + @Override |
| 297 | + public JSONObject newSuccessResult() { |
| 298 | + return jc.newSuccessResult(); |
| 299 | + } |
| 300 | + |
| 301 | + @Override |
| 302 | + public JSONObject newErrorResult(Throwable e) { |
| 303 | + return jc.newErrorResult(e); |
| 304 | + } |
| 305 | + |
| 306 | + @Override |
| 307 | + public JSONObject parseJSON(String type, Object value) { |
| 308 | + if (value == null || unitauto.JSON.isBooleanOrNumberOrString(value) || value instanceof JSON || value instanceof Enum) { |
| 309 | + return jc.parseJSON(type, value); |
| 310 | + } |
| 311 | + |
| 312 | + if (value instanceof ApplicationContext |
| 313 | + || value instanceof Context |
| 314 | + || value instanceof org.apache.catalina.Context |
| 315 | + // SpringBoot 2.6.7 已移除 || value instanceof ch.qos.logback.core.Context |
| 316 | + ) { |
| 317 | + value = value.toString(); |
| 318 | + } else { |
| 319 | + try { |
| 320 | + value = com.alibaba.fastjson.JSON.parse(com.alibaba.fastjson.JSON.toJSONString(value, new PropertyFilter() { |
| 321 | + @Override |
| 322 | + public boolean apply(Object object, String name, Object value) { |
| 323 | + if (value == null) { |
| 324 | + return true; |
| 325 | + } |
| 326 | + |
| 327 | + if (value instanceof ApplicationContext |
| 328 | + || value instanceof Context |
| 329 | + || value instanceof org.apache.catalina.Context |
| 330 | + // SpringBoot 2.6.7 已移除 || value instanceof ch.qos.logback.core.Context |
| 331 | + ) { |
| 332 | + return false; |
| 333 | + } |
| 334 | + |
| 335 | + // 防止通过 UnitAuto 远程执行 getDBPassword 等方法来查到敏感信息,但如果直接调用 public String getDBUri 这里没法拦截,仍然会返回敏感信息 |
| 336 | + // if (object instanceof SQLConfig) { |
| 337 | + // // 这个类部分方法不序列化返回 |
| 338 | + // if ("dBUri".equalsIgnoreCase(name) || "dBPassword".equalsIgnoreCase(name) || "dBAccount".equalsIgnoreCase(name)) { |
| 339 | + // return false; |
| 340 | + // } |
| 341 | + // return false; // 这个类所有方法都不序列化返回 |
| 342 | + // } |
| 343 | + |
| 344 | + // 所有类中的方法只要包含关键词就不序列化返回 |
| 345 | + String n = StringUtil.toLowerCase(name); |
| 346 | + if (n.contains("database") || n.contains("schema") || n.contains("dburi") || n.contains("password") || n.contains("account")) { |
| 347 | + return false; |
| 348 | + } |
| 349 | + |
| 350 | + return Modifier.isPublic(value.getClass().getModifiers()); |
| 351 | + } |
| 352 | + })); |
| 353 | + } catch (Exception e) { |
| 354 | + Log.e(TAG, "toJSONString catch \n" + e.getMessage()); |
| 355 | + } |
| 356 | + } |
| 357 | + |
| 358 | + return jc.parseJSON(type, value); |
| 359 | + } |
| 360 | + |
| 361 | + }; |
358 | 362 |
|
359 | 363 | // UnitAuto 单元测试配置 https://github.com/TommyLemon/UnitAuto >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
360 | 364 |
|
|
0 commit comments