MENU

[泛微EC9] api/ec/dev/table/getxml拦截后解决方案

• 2024 年 08 月 24 日 • 阅读: 1114 • 泛微OA

AI辅助制作标识

该文章由丸子引导AI辅助制作生成,如有改进意见,欢迎评论区留言。

引言

泛微近期发布最新ec9安全包,其中 /api/ec/dev/table/getxml?dataKey=xxx 接口被安全包拦截,故推出以下jsp方案,用于展示接口执行SQL记录。为了便于调试和记录查询操作,本文介绍了一种通过JSP展示接口执行SQL记录的方案。

实现展示.png

完整代码

<%@ 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>

食用方法

  1. 将以上完整的代码新建为一个jsp文件,看心情命名,如:DataKeyLookup.jsp
  2. 放置在ecology主目录下,我的目录是:/WEAVER/ecology,我直接放里面
  3. 现在你可以访问:你的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语句执行情况的场景。建议后续可以进一步优化数据提取逻辑,提升页面渲染效率。

最后编辑于: 2024 年 09 月 18 日
返回文章列表 打赏
本页链接的二维码
打赏二维码
添加新评论

已有 3 条评论
  1. 吴彦祖 吴彦祖

    666

  2. wintsa wintsa

    这个和sysadmin里面直接看缓存的sql记录有啥区别@(乖)

    1. @wintsa我感觉会相对便捷一些,还有就是 配合我写的油猴脚本"泛微ecology9-IT助手"直接跳转来查看sql会便捷不少