java 传入的请求参数过多问题

java 报错:传入的请求具有过多的参数。该服务器支持最多 2100 个参数。请减少参数的数目,然后重新发送该请求。

解决方法:

一、代码实现

@Service
public class HumanInfoServiceImpl implements HumanInfoService {

    @Autowired
    private HumanInfoMapper humanInfoMapper;

    /**
     * 查询传入的参数超过2000
     * @param humanIdList 传入的人员编号集合(人员编号集合超过2000)
     * @return
     */
    @Override
    public List<Object> findObject(List<String> humanIdList){
        //临时存放人员编号集合
        List<String> tempList = new ArrayList<>();
        //得到返回的结果
        List<Object> objectList = ParamUtil.batchParams(humanIdList,tempList,humanInfoMapper,
                "selectHumanInfo",tempList);
        return objectList;
    }

    /**
     * 新增传入的参数超过2000
     * @param humanInfoList 传入的新增对象 新增的参数超过2000
     */
    @Override
    public void insertObject(List<HumanInfo> humanInfoList){
        //临时集合
        List<HumanInfo> tempList = new ArrayList<>();
        //执行新增语句
        ParamUtil.batchInsertParams(humanIdList,tempList,humanInfoMapper,
                "insertHumanInfo",tempList);
    }

}

二、编写工具类

(1)、获取类里面对应的方法名

package com.test.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Method;
import java.util.Optional;

/**
 * 用反射获取类里面的方法名
 */
public class ReflectionUtils {
    private static final Logger logger = LoggerFactory.getLogger(ReflectionUtils.class);

    /**
     * @description 方法调用指定对象方法
     * @param object 传入反射对象
     * @param method 传入反射对象的方法名
     * @param args 反射对象的方法参数
     * @return
     */
    public static Object invokeMethod(Object object,String method,Object...args) throws Exception {
        Object result = null;
        //反射方法获取到类
        Class<? extends Object> classObj = object.getClass();
        //
        Method queryMethod = getMethod(classObj,method);
        if (Optional.ofNullable(queryMethod).isPresent()){
            result = queryMethod.invoke(object,args);
        }else {
            throw new Exception(classObj.getName() + "类中没有找到"+method+"方法。");
        }
        return result;
    }


    /**
     * 反射对象中的反射方法集合中是否存在对应的方法
     * @param classObj 反射对象
     * @param name 反射方法名
     * @return
     */
    public static Method getMethod( Class<? extends Object> classObj,String name){
        Method queryMethod = null;
        Method[] methods = classObj.getMethods();
        for (Method method : methods) {
            if (method.getName().equals(name)) {
                queryMethod = method;
                break;
            }
        }
        return queryMethod;
    }
}

(2)、分2000为一次执行

package com.test.util;

import java.util.ArrayList;
import java.util.List;

public class ParamUtil {

    private static final Integer PARAM_NUM = 2000;

    /**
     * 查询返回的结果,查询的参数超过2000
     * @param paramIdList 传入的参数集合
     * @param tempList 临时集合
     * @param mapper 对象名
     * @param queryMethod 对象对应的方法名
     * @param args 传入的参数
     * @return 查询的结果
     */
    public static List<Object> batchParams(List<Object> paramIdList,List<Object> tempList,
                                           Object mapper,String queryMethod,Object...args) throws Exception {
        List<Object> resultObject = new ArrayList<>();//存放返回对象集
        if (paramIdList == null || paramIdList.isEmpty()){
            return resultObject;
        }
        int paraIdSize = paramIdList.size();
        int a = paraIdSize / PARAM_NUM; //得到商
        int b = paraIdSize % PARAM_NUM; //得到余数
        if (b > 0){
            a = a + 1;
        }
        //循环a的次数
        for (int i = 0 ;i < a;i++){
            tempList.clear();
            for (int j = PARAM_NUM * i ; j < PARAM_NUM * (i+1) ; j++){
               if (j >= paraIdSize){
                   break;
               }
                tempList.add(paramIdList.get(j));
            }
            //得到查询集合
            Object result = ReflectionUtils.invokeMethod(mapper,queryMethod,args);
            List<Object> objectList = (List)result;
            //将查询集合加入resultObject集合中
            if (!objectList.isEmpty()){
                resultObject.addAll(objectList);
            }
        }
        return resultObject;
    }

    /**
     * 新增的参数超过2000
     * @param paramIdList 传入的参数集合
     * @param tempList 临时集合
     * @param mapper 对象名
     * @param queryMethod 对象对应的方法名
     * @param args 传入的参数
     * @return 查询的结果
     */
    public static void batchInsertParams(List<Object> paramIdList,List<Object> tempList,
                                           Object mapper,String queryMethod,Object...args) throws Exception {
        if (paramIdList == null || paramIdList.isEmpty()){
            return ;
        }
        int paraIdSize = paramIdList.size();
        int a = paraIdSize / PARAM_NUM; //得到商
        int b = paraIdSize % PARAM_NUM; //得到余数
        if (b > 0){
            a = a + 1;
        }
        //循环a的次数
        for (int i = 0 ;i < a;i++){
            tempList.clear();
            for (int j = PARAM_NUM * i ; j < PARAM_NUM * (i+1) ; j++ ){
               if (j >= paraIdSize){
                  break;
               }
                tempList.add(paramIdList.get(j));
            }
            ReflectionUtils.invokeMethod(mapper,queryMethod,args);
        }
    }

}

### Java 安全问题总结 #### 一、常见漏洞 1. **SQL注入** SQL注入是一种通过将恶意SQL代码插入到查询字符串中来操纵数据库的行为。为了防止这种情况发生,应该始终使用预编译语句和参数化查询[^3]。 2. **跨站脚本(XSS)** XSS攻击允许攻击者向网页中注入客户端脚本,当其他用户浏览该页面时就会执行这些脚本。为了避免XSS风险,在处理任何来自用户的输入之前都应对其进行严格的过滤和转义操作[^4]。 3. **跨站点请求伪造(CSRF)** CSRF利用已认证用户的浏览器发送未经许可的操作给目标网站。可以通过实现同步令牌模式或其他形式的身份验证机制来抵御此类攻击[^1]。 4. **路径遍历(Path Traversal)** 当应用程序未能正确地清理文件路径中的特殊字符(如`..//`),就可能导致访问受限资源的情况。应当严格控制上传下载功能,并对所有涉及文件系统的交互加以审查。 5. **不安全的对象反序列化(Insecure Deserialization)** 如果对象被不当反序列化,则可能使远程代码得以执行。建议禁用不必要的反序列化逻辑;如果确实需要此特性,则要确保只接受预期类型的对象实例。 6. **敏感数据泄露(Sensitive Data Exposure)** 敏感信息不应明文存储于日志文件内或传输过程中未加密。采用强密码策略以及HTTPS协议可以有效减少这类隐患的发生概率[^2]。 7. **弱身份验证(Weak Authentication)** 使用默认账户名/口令组合容易让黑客轻易突破防线。强制设置复杂度较高的登录凭证,并启用多因子认证(MFA),有助于提升整体防护水平。 8. **缓冲区溢出(Buffer Overflow)** 尽管Java本身具有自动内存管理能力从而降低了这种错误发生的可能性,但在JNI调用外部C/C++库的情况下仍需警惕潜在的风险。遵循良好的编程习惯可降低遭遇此类问题的概率。 9. **命令注入(Command Injection)** 若程序直接拼接用户提交的数据作为操作系统指令的一部分运行,则会带来严重的安全隐患。务必先经过充分校验再将其纳入最终构建好的命令串里去执行。 --- #### 二、最佳实践与防护措施 - **输入验证(Input Validation)** 对所有的外部输入都要进行全面细致的检查,包括但不限于表单字段、URL 参数等位置传入的内容。这不仅限于格式上的合规性判断,还涉及到范围限定等方面的要求。 - **最小权限原则(Principle of Least Privilege, POLP)** 应尽可能缩小服务端进程所持有的特权级别,仅授予完成特定任务所需的最低限度权利即可满足需求的同时也减少了因误操作而引发事故的可能性。 - **依赖组件更新(Dependency Updates)** 及时跟踪第三方库版本变更情况并尽快迁移到最新稳定版上,因为旧版本可能存在已被公开披露过的缺陷等待修补。 - **异常处理(Exception Handling)** 设计合理的错误恢复流程,避免暴露过多内部结构细节给外界造成误导甚至进一步渗透的机会。同时记录下必要的调试线索以便后续分析定位问题所在之处。 - **定期审计(Audit Regularly)** 组织专业的团队成员按照既定标准周期性地复查现有源码质量状况,查找隐藏较深不易察觉的技术债务点位,进而采取针对性整改措施优化整个项目架构体系。 - **教育员工(Educate Employees)** 加强相关人员的信息安全保障意识培训工作力度,使其能够自觉遵守相关规定要求,共同维护企业资产价值不受侵害威胁的影响。 ```java // 示例:防止SQL注入的最佳做法之一——使用PreparedStatement代替Statement String query = "SELECT * FROM users WHERE username=? AND password=?"; try (Connection conn = DriverManager.getConnection(url); PreparedStatement pstmt = conn.prepareStatement(query)) { pstmt.setString(1, userInputUsername); pstmt.setString(2, hashPassword(userInputPassword)); } catch (SQLException e) { logger.error("Database error", e); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值