nacos /derby接口

@GetMapping(value = "/derby")
    public RestResult<Object> derbyOps(@RequestParam(value = "sql") String sql) {
        String selectSign = "select";
        String limitSign = "ROWS FETCH NEXT";
        String limit = " OFFSET 0 ROWS FETCH NEXT 1000 ROWS ONLY";
        try {
            if (PropertyUtil.isEmbeddedStorage()) {
                LocalDataSourceServiceImpl dataSourceService = (LocalDataSourceServiceImpl) DynamicDataSource
                        .getInstance().getDataSource();
                if (StringUtils.startsWithIgnoreCase(sql, selectSign)) {
                    if (!StringUtils.containsIgnoreCase(sql, limitSign)) {
                        sql += limit;
                    }
                    JdbcTemplate template = dataSourceService.getJdbcTemplate();
                    List<Map<String, Object>> result = template.queryForList(sql);
                    return RestResultUtils.success(result);
                }
                return RestResultUtils.failed("Only query statements are allowed to be executed");
            }
            return RestResultUtils.failed("The current storage mode is not Derby");
        } catch (Exception e) {
            return RestResultUtils.failed(e.getMessage());
        }

这段代码定义了一个名为 derbyOps 的方法,该方法用于处理对 Derby 数据库的 SQL 查询操作。以下是详细解释:

  1. 方法签名

    @GetMapping(value = "/derby")
    public RestResult<Object> derbyOps(@RequestParam(value = "sql") String sql)
    
    

    该方法通过 @GetMapping 注解映射到 /derby URL 路径。它接受一个 String 类型的参数 sql,这是客户端传递过来的 SQL 查询语句。返回类型是 RestResult<Object>,表示操作结果。

  2. 定义常量

    String selectSign = "select";
    String limitSign = "ROWS FETCH NEXT";
    String limit = " OFFSET 0 ROWS FETCH NEXT 1000 ROWS ONLY";
    
    

    定义了三个字符串常量:selectSign 表示 SQL 查询语句的前缀;limitSign 表示分页查询的标识;limit 表示默认的分页查询语句,限制返回的记录条数。

  3. 开始 try 块

    try {
    
    

    开始一个 try 块,用于捕获和处理可能发生的异常。

  4. 检查存储模式

    if (PropertyUtil.isEmbeddedStorage()) {
    
    

    检查当前是否处于嵌入式存储模式。如果是,则继续执行后续操作。

  5. 获取数据源服务实例

    LocalDataSourceServiceImpl dataSourceService = (LocalDataSourceServiceImpl) DynamicDataSource.getInstance().getDataSource();
    
    

    使用 DynamicDataSource.getInstance().getDataSource() 方法获取数据源服务实例,并将其转换为 LocalDataSourceServiceImpl 类型。

  6. 检查 SQL 查询语句

    if (StringUtils.startsWithIgnoreCase(sql, selectSign)) {
    
    

    检查传递的 SQL 语句是否以 select 开头(忽略大小写)。如果是,则继续执行后续操作。

  7. 添加分页查询语句

    if (!StringUtils.containsIgnoreCase(sql, limitSign)) {
        sql += limit;
    }
    
    

    如果 SQL 语句中不包含分页查询的标识 limitSign,则将默认的分页查询语句 limit 添加到 SQL 语句的末尾,以限制返回的记录条数。

  8. 执行 SQL 查询

    JdbcTemplate template = dataSourceService.getJdbcTemplate();
    List<Map<String, Object>> result = template.queryForList(sql);
    return RestResultUtils.success(result);
    
    

    获取 JdbcTemplate 实例,使用 queryForList 方法执行 SQL 查询,并将查询结果存储在 result 列表中。然后,返回一个包含查询结果的成功 RestResult 对象。

  9. 处理非查询语句

    return RestResultUtils.failed("Only query statements are allowed to be executed");
    
    

    如果传递的 SQL 语句不是查询语句,则返回一个失败的 RestResult 对象,并包含错误信息 “Only query statements are allowed to be executed”。

  10. 处理非 Derby 存储模式

    return RestResultUtils.failed("The current storage mode is not Derby");
    
    

    如果当前存储模式不是 Derby,则返回一个失败的 RestResult 对象,并包含错误信息 “The current storage mode is not Derby”。

  11. 捕获异常

    } catch (Exception e) {
        return RestResultUtils.failed(e.getMessage());
    }
    
    

    如果在执行过程中发生异常,捕获异常并返回一个失败的 RestResult 对象,包含异常的错误信息。

未开启鉴权或者1.4.0之前的nacos可以未认证直接访问/derby接口查询数据
在这里插入图片描述
issue链接:https://github.com/alibaba/nacos/issues/4463
修复链接:https://github.com/alibaba/nacos/pull/4517/files

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个用于生成并启动Nacos容器的Docker命令。命令如下: ``` docker run -d -p 8848:8848 -e MODE=standalone -e PREFER_HOST_MODE=hostname -v /root/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties -v /root/nacos/logs:/home/nacos/logs --restart always --name nacos nacos/nacos-server ``` 解释一下这个命令的各个部分: - `docker run`:运行一个新的容器。 - `-d`:以后台守护进程模式运行容器。 - `-p 8848:8848`:将主机的8848端口映射到容器的8848端口,这样可以通过主机的8848端口访问Nacos服务。 - `-e MODE=standalone`:设置Nacos的运行模式为standalone,即单机模式。 - `-e PREFER_HOST_MODE=hostname`:设置Nacos的主机模式为hostname,这样在集群环境下,Nacos将使用主机名作为节点标识。 - `-v /root/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties`:将主机上的`custom.properties`文件挂载到容器内的相应位置,可以根据需要进行自定义配置。 - `-v /root/nacos/logs:/home/nacos/logs`:将主机上的日志目录挂载到容器内的相应位置,方便查看和管理日志文件。 - `--restart always`:设置容器始终自动重启。 - `--name nacos`:给容器指定一个名称为nacos。 - `nacos/nacos-server`:使用Nacos官方提供的镜像。 执行此命令后,Docker将下载并运行Nacos镜像,并将主机的8848端口映射到容器的8848端口。你可以通过访问`http://localhost:8848/nacos`来验证Nacos是否成功启动。 请注意,如果你已经有一个名为nacos的容器运行中,你需要先停止并删除它,然后再运行上述命令。可以使用以下命令停止和删除容器: ``` docker stop nacos docker rm nacos ``` 这样就可以生成并启动Nacos容器了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值