AI辅助制作标识
该文章由丸子引导AI辅助制作生成,如有改进意见,欢迎评论区留言。引言
泛微近期发布最新ec9安全包,其中 /api/ec/dev/table/getxml?dataKey=xxx 接口被安全包拦截,故推出以下jsp方案,用于展示接口执行SQL记录。为了便于调试和记录查询操作,本文介绍了一种通过JSP展示接口执行SQL记录的方案。
完整代码
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ page import="com.alibaba.fastjson.JSONObject, com.alibaba.fastjson.JSON, com.alibaba.fastjson.JSONException"%>
<%@ page import="com.cloudstore.dev.api.util.Util_TableMap"%>
<%@ page import="weaver.hrm.User"%>
<%@ page import="weaver.hrm.HrmUserVarify"%>
<%@ page import="weaver.general.Util"%>
<%@ page import="cn.hutool.http.HtmlUtil"%>
<%@ page import="cn.hutool.core.util.StrUtil"%>
<body>
<%
User user = HrmUserVarify.getUser(request, response);
if (user == null) {
response.sendRedirect("/login/Login.jsp");
return;
}
String dataKey = Util.null2String(request.getParameter("dataKey"));
if (dataKey.isEmpty()) {
JSONObject result = new JSONObject();
result.put("status", "error");
result.put("message", "dataKey参数不能为空");
out.print(result.toJSONString());
return;
}
String cachedData = Util_TableMap.getVal(dataKey);
if (cachedData == null) {
JSONObject result = new JSONObject();
result.put("status", "error");
result.put("message", "无法找到对应的缓存数据");
out.print(result.toJSONString());
} else {
try {
String sqlTag = cachedData.replaceAll(".*(<sql .*?/?>).*", "$1");
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("(\\w+)\\s*=\\s*\"([^\"]*)\"");
java.util.regex.Matcher matcher = pattern.matcher(sqlTag);
out.print("<h2>接口执行SQL记录</h2>");
out.print("<table border='1'>");
out.print("<tr><th>属性名</th><th>属性值</th></tr>");
while (matcher.find()) {
String attributeName = matcher.group(1);
String attributeValue = matcher.group(2);
out.print("<tr>");
out.print("<td>" + HtmlUtil.escape(attributeName) + "</td>");
out.print("<td>" + HtmlUtil.escape(attributeValue) + "</td>");
out.print("</tr>");
}
out.print("</table>");
} catch (Exception e) {
JSONObject result = new JSONObject();
result.put("status", "error");
result.put("message", "解析 <sql> 标签时出错:" + e.getMessage());
out.print(result.toJSONString());
}
}
%>
</body>
食用方法
- 将以上完整的代码新建为一个jsp文件,看心情命名,如:
DataKeyLookup.jsp
- 放置在ecology主目录下,我的目录是:
/WEAVER/ecology
,我直接放里面 - 现在你可以访问:
你的OA地址/DataKeyLookup.jsp?dataKey=xxxxxx
方案详解
用户验证
首先,我们需要确保只有合法的用户才能访问该JSP页面。使用HrmUserVarify.getUser(request, response)
方法来验证用户的登录状态,如果用户未登录,则重定向到登录页面。
参数获取与验证
获取接口传递的dataKey
参数,并确保该参数不为空。否则,返回错误信息并终止执行。
数据缓存获取
通过Util_TableMap.getVal(dataKey)
方法获取与dataKey
对应的缓存数据。如果未找到缓存数据,则返回错误信息。
SQL记录提取与展示
我们通过正则表达式提取缓存数据中的<sql>
标签,然后解析该标签内的属性及其值,并以表格形式展示在页面上。此过程涉及字符串操作和正则表达式匹配。
代码解析
JSP页面导入的库
<%@ page import="com.alibaba.fastjson.JSONObject, com.alibaba.fastjson.JSON, com.alibaba.fastjson.JSONException"%>
<%@ page import="com.cloudstore.dev.api.util.Util_TableMap"%>
<%@ page import="weaver.hrm.User"%>
<%@ page import="weaver.hrm.HrmUserVarify"%>
<%@ page import="weaver.general.Util"%>
<%@ page import="cn.hutool.http.HtmlUtil"%>
<%@ page import="cn.hutool.core.util.StrUtil"%>
上述代码导入了多个库,其中fastjson
用于处理JSON,HrmUserVarify
用于用户验证,HtmlUtil
用于HTML转义。
用户验证逻辑
User user = HrmUserVarify.getUser(request, response);
if (user == null) {
response.sendRedirect("/login/Login.jsp");
return;
}
此部分代码用于验证用户是否登录,如果未登录则重定向到登录页面。
SQL标签解析与数据展示逻辑
String sqlTag = cachedData.replaceAll(".*(<sql .*?/?>).*", "$1");
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("(\\w+)\\s*=\\s*\"([^\"]*)\"");
java.util.regex.Matcher matcher = pattern.matcher(sqlTag);
通过正则表达式,我们从缓存数据中提取出<sql>
标签,并解析出标签内的属性名和属性值,最后以表格形式展示出来。
常见问题与调试
如何处理未找到缓存数据的问题
如果Util_TableMap.getVal(dataKey)
返回为空,表示没有找到对应的缓存数据,此时返回错误提示,避免页面空白或误导性的信息展示。
解析标签时的异常处理
解析过程中可能会遇到异常,为了避免页面崩溃,使用try-catch
块捕获异常,并返回相应的错误信息以帮助调试。
结论
该方案通过JSP有效地展示了接口执行的SQL记录,特别适用于需要快速调试SQL语句执行情况的场景。建议后续可以进一步优化数据提取逻辑,提升页面渲染效率。
[泛微EC9] api/ec/dev/table/getxml拦截后解决方案 by https://oneszhang.com/archives/97.html
666
这个和sysadmin里面直接看缓存的sql记录有啥区别@(乖)
我感觉会相对便捷一些,还有就是 配合我写的油猴脚本"泛微ecology9-IT助手"直接跳转来查看sql会便捷不少