我目前的目标是从客户端删除所有有价值的业务代码并将其放在服务器上。但我正在努力隐藏以下逻辑,其中涉及AutoIt。你知道解决方案吗?
我不明白是否可以将AutoIt的control
对象传递给REST资源,以便验证服务器端的某些条件,然后返回true / false。我知道POJO可以通过,但控制?例如,我的客户端代码有这个方法,如果当前活动窗口里面包含某些“秘密文本”,则返回true。
...
AutoItX control;
private boolean foundCorrectInnerText() {
return control.winGetText("Secret Title").contains("Secret Text");
}
...
我想隐藏用户不知道的标题字符串"Secret Title"
以及"Secret Text"
。我怎么想保护这个逻辑?
由于AutoIt方法winGetText
返回boolean
,我认为最好的方法是通过control
将org.codehaus.jackson.map.ObjectMapper
对象转换为JSON字符串然后执行验证服务器端,仅返回true或false。如果只能通过JSON传递POJO,那么我如何保护如此重要的代码?这是一个模型:
演示客户:
ObjectMapper mapper = new ObjectMapper();
AutoItX control = new AutoItX();
try {
String jsonInString = mapper.writeValueAsString(control); // Really dumb?
ResteasyClient client = new ResteasyClientBuilder().build();
client.register(new CustomRestHeaderFilter("Content-Type", "application/json"));
ResteasyWebTarget target = client.target("http://localhost:8080/MyApp/rest/autoit/control");
Response response = target.request().post(Entity.json(jsonInString));
String value = response.readEntity(String.class);
response.close();
} catch (IOException e) {
e.printStackTrace();
}
ServerSide.java:
@Path("autoit")
public class ServerDemo {
@POST
@Path("control")
@Produces("application/json")
@Consumes(MediaType.APPLICATION_JSON)
public Response buildSendString(AutoIt control) {
AutoItX control;
String WindowTitle = "[REGEXPTITLE:(?i)(Notepad\\b.*)]";
boolean titleFound = false;
logger.info("HERE1");
control = new ObjectMapper().readValue(jsonString, AutoItX.class);
logger.info("HERE2");
titleFound = control.winExists(WindowTitle);
return Response.status(200).entity(titleFound).build();
}
}
我已经更新了上面的ServerSide.java代码。它返回“false”,即使它应该返回true。所以我查看了我的服务器日志,它给出了以下错误。请注意它是如何打印"HERE1"
但由于此行"HERE2"
而未达到control = new ObjectMapper().readValue(jsonString, AutoItX.class);
。
我的客户端代码中的jsonString
I引用打印此JSON: {"version":"3.3.14.2","admin":true,"error":0}
,这似乎是一个有限的JSON对象。
下面是一些错误,完整堆栈为here。
15:56:53,867 INFO [com.serv.rest.ServerSide](默认任务-1) HERE1
15:56:54,150 ERROR [stderr](默认任务-1) com.fasterxml.jackson.databind.exc。 UnrecognizedPropertyException: 无法识别的字段“version”(类com.myproject.AutoItX),未标记 as ignorable(0已知属性:])
15:56:54,166 ERROR [stderr](默认任务-1)在[来源: { “版本”: “3.3.14.2”, “管理”:真正的 “错误”:0}; line:1,column:13] (通过参考链:com.myproject.AutoItX [“version”])
15:56:54,166 ERROR [stderr](默认任务-1)at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:62)
15:56:54,166 ERROR [stderr](默认任务-1)at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:851)
15:56:54,166 ERROR [stderr](默认任务-1)at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1085)
15:56:54,166 ERROR [stderr](默认任务-1)at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1389)
注意这一行:UnrecognizedPropertyException: Unrecognized field "version" (class com.myproject.AutoItX), not marked as ignorable (0 known properties: ])
。这是否可以表示可串行性?