对阿里开源插件Durid Monitor的一些简单改造

背景

项目中有个需求,要对所有的请求进行监控,包括内部请求和第三方软件的请求,想到Durid Monitor可以对数据库进行监测,也可以对内部的uri进行监测。而且有现成的界面。因此,初步想法是用现成的Druid Monitor,稍加改造,完成这个需求。

改造

要改造,肯定需要追源码,这里就不赘述如何找到的关键代码了。找源码用的方法就是点开druid的jar包,看每个包名,猜测哪个是相关代码,然后打断点,运行项目,验证猜测,分析其执行过程。
因为这里的需求是对Druid Monitor的界面进行改造。所以,重点看Druid Monitor提供的界面,是怎么访问到的。
关键代码如下:
StatViewServlet类:

public StatViewServlet(){
        super("support/http/resources");
    }

这里定义了页面的路径位置。找到对应的位置查看:
在这里插入图片描述
可以看到,有这些页面。
第二个核心类:
ResourceServlet:

public void service(HttpServletRequest request
                , HttpServletResponse response
                , String servletPath
                , ProcessCallback processCallback
        ) throws ServletException, IOException {
            String contextPath = request.getContextPath();
            String requestURI = request.getRequestURI();

            response.setCharacterEncoding("utf-8");

            if (contextPath == null) { // root context
                contextPath = "";
            }
            String uri = contextPath + servletPath;
            String path = requestURI.substring(contextPath.length() + servletPath.length());

            if (!isPermittedRequest(request)) {
                path = "/nopermit.html";
                returnResourceFile(path, uri, response);
                return;
            }

            if ("/submitLogin".equals(path)) {
                String usernameParam = request.getParameter(PARAM_NAME_USERNAME);
                String passwordParam = request.getParameter(PARAM_NAME_PASSWORD);
                if (username.equals(usernameParam) && password.equals(passwordParam)) {
                    request.getSession().setAttribute(SESSION_USER_KEY, username);
                    response.getWriter().print("success");
                } else {
                    response.getWriter().print("error");
                }
                return;
            }

            if (isRequireAuth() //
                    && !containsUser(request)//
                    && !checkLoginParam(request)//
                    && !("/login.html".equals(path) //
                    || path.startsWith("/css")//
                    || path.startsWith("/js") //
                    || path.startsWith("/img"))) {
                if (contextPath.equals("") || contextPath.equals("/")) {
                    response.sendRedirect("/druid/login.html");
                } else {
                    if ("".equals(path)) {
                        response.sendRedirect("druid/login.html");
                    } else {
                        response.sendRedirect("login.html");
                    }
                }
                return;
            }

            if ("".equals(path) || "/".equals(path)) {
                returnResourceFile("/index.html", uri, response);
                return;
            }

            if (path.contains(".json")) {
                String fullUrl = path;
                if (request.getQueryString() != null && request.getQueryString().length() > 0) {
                    fullUrl += "?" + request.getQueryString();
                }
                response.getWriter().print(processCallback.process(fullUrl));
                return;
            }

            // find file in resources path

            returnResourceFile(path, uri, response);
        }

这是一个servlet,上面代码是service方法。其对/druod开头的请求做了处理,如json格式的请求如何处理等。下面方法是对html文件,jpg,css等静态文件的请求做的处理的代码:

protected void returnResourceFile(String fileName, String uri, HttpServletResponse response)
                throws ServletException,
                IOException {

            String filePath = getFilePath(fileName);

            if (filePath.endsWith(".html")) {
                response.setContentType("text/html; charset=utf-8");
            }
            if (fileName.endsWith(".jpg")) {
                byte[] bytes = Utils.readByteArrayFromResource(filePath);
                if (bytes != null) {
                    response.getOutputStream().write(bytes);
                }

                return;
            }

            String text = Utils.readFromResource(filePath);
            if (text == null) {
                return;
            }

            if (fileName.endsWith(".css")) {
                response.setContentType("text/css;charset=utf-8");
            } else if (fileName.endsWith(".js")) {
                response.setContentType("text/javascript;charset=utf-8");
            }
            response.getWriter().write(text);
        }

这样,就解释了为啥/druid的请求,为何跳转到相关页面了。剩下的,就是根据这个跳转规则,进行页面的改造即可。
改造后的界面如下:
在这里插入图片描述
其中,新加的功能的后台逻辑,在项目中实现即可。相关界面的请求写项目中的请求即可。无需在Druid的jar包里写代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Revit是一款由Autodesk开发的建筑设计软件,其功能强大且广泛应用于建筑行业。对于开源插件代码,目前并没有官方提供的开源版本,但是Revit的API提供了强大的功能,允许开发者使用开发语言如C#或Python等编写插件来扩展Revit的功能。 开发者可以通过Revit API获取和操作Revit模型的各个元素,如墙体、楼板、窗户等,还可以获取和修改元素的属性和参数,进行创建、编辑和删除操作。Revit API还提供了丰富的事件和委托机制,允许开发者对Revit模型的变化做出响应,以实现自定义的功能和工具。 开发插件的过程需要使用Visual Studio等开发环境,首先需要引用Revit相关的API库,然后编写代码来实现所需的功能。开发插件可以用于自动化任务,提高设计效率,也可以添加一些特殊的设计功能,以满足具体的需求。 除了使用Revit API,开发者还可以利用Revit的扩展工具包(Revit SDK)来创建插件。Revit SDK提供了一些示例代码和开发工具,帮助开发者更好地理解和使用Revit API,以及创建自己的插件。 当然,也有一些第三方开源项目提供了一些Revit插件开源代码,开发者可以参考和使用这些项目来进行插件开发,加快开发进度。这些开源项目通常提供了更多的功能和定制选项,满足不同用户的需求。 总之,虽然Revit本身没有提供开源插件代码,但是Revit API提供了丰富的功能和开发工具,开发者可以利用它来创建自己的插件,满足不同的设计需求。同时,第三方开源项目也为开发者提供了一些开源插件代码和示例,可以作为参考和学习的资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码的小小酥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值