`
luchangbin_66
  • 浏览: 23573 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring 请求参数(包装类)非法情况下的转换

 
阅读更多

参考资料:

http://jinnianshilongnian.iteye.com/blog/1723270

http://www.bubuko.com/infodetail-1428732.html

 

 

使用spring类型转换器注册器、类型转换服务:提供类型转换器注册支持,运行时类型转换API支持。

1、ConverterRegistry:类型转换器注册支持,可以注册/删除相应的类型转换器。

2、ConversionService:运行时类型转换服务接口,提供运行期类型转换的支持。

Spring提供了两个默认实现(其都实现了ConverterRegistry、ConversionService接口):

DefaultConversionService:默认的类型转换服务实现;

DefaultFormattingConversionService:带数据格式化支持的类型转换服务实现,一般使用该服务实现即可。

 

问题:

比如 参数为Integer 为空或非数字 则默认为负数,返回

条件:Integer 负数 没有任何意义或者参数非法的定义

 

查询spring  

StringToNumberConverterFactory   String----->Number(如Integer、Long等)

创建类实现Converter接口,例如返回MyStringToIntegerConverter对Integer类型进行必要的处理

 

package com.jyt.advice;

import org.springframework.core.convert.converter.Converter;

public class MyStringToIntegerConverter implements Converter<String, Integer> {

    @Override
    public Integer convert(String source) {
        System.out.println("转换前---------StringTOInteger转换:" + source);
        if (source.length() == 0) {
            return -1;
        }
        boolean isnumber = org.apache.commons.lang.StringUtils.isNumeric(source);
        source = isnumber == true ? source : "-1";
        System.out.println("转换后---------StringTOInteger转换:" + Integer.valueOf(source));
        return Integer.valueOf(source);
    }

}

 Spring 配置:

<mvc:annotation-driven conversion-service="conversionService"/>
<!-- 注册ConversionService -->  
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">  
    <property name="converters">  
       <list>  
            <bean class="com.jyt.advice.MyStringToIntegerConverter"/>  
        </list>  
    </property>  
</bean>  

 

对数字类工厂转换:

package com.jyt.advice;

import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;

public class MyStringToNumberConverterFactory implements ConverterFactory<String, Number> {

    @Override
    public <T extends Number> Converter<String, T> getConverter(Class<T> targetType) {
        return new StringToNumber<T>(targetType);
    }

    private static final class StringToNumber<T extends Number> implements Converter<String, T> {

        private final Class<T> targetType;

        public StringToNumber(Class<T> targetType) {
            this.targetType = targetType;
        }

        @Override
        public T convert(String source) {
            System.out.println("启动自定义的Integer转换类型转化器");
            if (source.length() == 0) {
                return null;
            }
            return MyNumberUtils.myParseNumber(source, this.targetType);
        }
    }

}
package com.jyt.advice;

import java.math.BigDecimal;
import java.math.BigInteger;

import org.springframework.util.Assert;
import org.springframework.util.NumberUtils;
import org.springframework.util.StringUtils;

public class MyNumberUtils extends NumberUtils {

    @SuppressWarnings("unchecked")
    public static <T extends Number> T myParseNumber(String text, Class<T> targetClass) {
        Assert.notNull(text, "Text must not be null");
        Assert.notNull(targetClass, "Target class must not be null");
        String trimmed = StringUtils.trimAllWhitespace(text);

        if (targetClass.equals(Byte.class)) {
            return (T) (isHexNumber(trimmed) ? Byte.decode(trimmed) : Byte.valueOf(trimmed));
        } else if (targetClass.equals(Short.class)) {
            return (T) (isHexNumber(trimmed) ? Short.decode(trimmed) : Short.valueOf(trimmed));
        } else if (targetClass.equals(Integer.class)) {
            System.out.println("StringTOInteger转换");
            boolean isnumber = org.apache.commons.lang.StringUtils.isNumeric(text);
            text = isnumber == true ? text : "-1";
            return (T) (isHexNumber(trimmed) ? Integer.decode(trimmed) : Integer.valueOf(trimmed));
        } else if (targetClass.equals(Long.class)) {
            System.out.println("StringTOLong转换");
            boolean isnumber = org.apache.commons.lang.StringUtils.isNumeric(text);
            text = isnumber == true ? text : "-1";
            return (T) (isHexNumber(trimmed) ? Long.decode(trimmed) : Long.valueOf(trimmed));
        } else if (targetClass.equals(BigInteger.class)) {
            System.out.println("StringTOBigInteger转换");
            boolean isnumber = org.apache.commons.lang.StringUtils.isNumeric(text);
            text = isnumber == true ? text : "-1";
            return (T) (isHexNumber(trimmed) ? decodeBigInteger(trimmed) : new BigInteger(trimmed));
        } else if (targetClass.equals(Float.class)) {
            return (T) Float.valueOf(trimmed);
        } else if (targetClass.equals(Double.class)) {
            return (T) Double.valueOf(trimmed);
        } else if (targetClass.equals(BigDecimal.class) || targetClass.equals(Number.class)) {
            return (T) new BigDecimal(trimmed);
        } else {
            throw new IllegalArgumentException("Cannot convert String [" + text + "] to target class [" + targetClass.getName() + "]");
        }
    }

    /**
     * Determine whether the given value String indicates a hex number, i.e. needs to be
     * passed into <code>Integer.decode</code> instead of <code>Integer.valueOf</code> (etc).
     */
    private static boolean isHexNumber(String value) {
        int index = (value.startsWith("-") ? 1 : 0);
        return (value.startsWith("0x", index) || value.startsWith("0X", index) || value.startsWith("#", index));
    }

    /**
     * Decode a {@link java.math.BigInteger} from a {@link String} value.
     * Supports decimal, hex and octal notation.
     * 
     * @see BigInteger#BigInteger(String, int)
     */
    private static BigInteger decodeBigInteger(String value) {
        int radix = 10;
        int index = 0;
        boolean negative = false;

        // Handle minus sign, if present.
        if (value.startsWith("-")) {
            negative = true;
            index++;
        }

        // Handle radix specifier, if present.
        if (value.startsWith("0x", index) || value.startsWith("0X", index)) {
            index += 2;
            radix = 16;
        } else if (value.startsWith("#", index)) {
            index++;
            radix = 16;
        } else if (value.startsWith("0", index) && value.length() > 1 + index) {
            index++;
            radix = 8;
        }

        BigInteger result = new BigInteger(value.substring(index), radix);
        return (negative ? result.negate() : result);
    }
}

 Spring 配置:

<mvc:annotation-driven conversion-service="conversionService"/>
<!-- 注册ConversionService -->  
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">  
    <property name="converters">  
       <list>  
            <bean class="com.jyt.advice.MyStringToNumberConverterFactory"/>  
        </list>  
    </property>  
</bean>

 

分享到:
评论

相关推荐

    Spring MVC请求参数与响应结果全局加密和解密详解

    在这种情况下,我们需要兼容这两种ContentType提交方式的请求体。 在响应结果中,我们同样需要对响应结果进行加密。为了简单起见,我们可以采用同样的AES对称秘钥为"throwable"进行加密。 在Spring MVC中,我们...

    SPRING MVC 的请求参数获取的几种方法

    SPRING MVC 请求参数获取的几种方法 SPRING MVC 框架中,获取请求参数是非常重要的一步,下面将介绍 SPRING MVC ...SPRING MVC 提供了多种方法来获取请求参数,开发者可以根据实际情况选择合适的方法来获取请求参数。

    Spring拦截器,高级参数绑定

    高级参数绑定是指在Controller方法中,Spring MVC能够自动将请求参数绑定到方法参数上,包括基本类型、复杂对象甚至自定义类型。例如,可以使用`@RequestParam`、`@PathVariable`、`@RequestHeader`、`@RequestBody`...

    spring mvc 参数绑定漏洞

    在处理HTTP请求时,Spring MVC 提供了参数绑定功能,将HTTP请求中的参数映射到控制器方法的参数上,使得开发更加便捷。然而,这个特性也可能导致安全问题,特别是参数绑定漏洞。 参数绑定漏洞通常出现在以下情况: ...

    SpringAOP禁止非法请求路径实例

    通过这种方式,Spring AOP可以帮助我们在不修改控制器代码的情况下,轻松地实现对非法请求路径的拦截和处理。这不仅提高了代码的可维护性,也使得安全策略可以集中管理和更新。记住,这只是一个基本的示例,实际应用...

    springboot 用aop打印web请求参数信息例子

    Spring AOP(面向切面编程)提供了一种优雅的方式来实现这一需求,它允许我们在不修改原有代码的情况下,插入额外的功能。本教程将通过一个具体的例子来介绍如何使用Spring AOP在Spring Boot中打印Web请求的参数信息...

    Spring MVC--3.请求参数

    当请求参数不符合预期(如类型转换失败或必须的参数缺失)时,Spring MVC会抛出异常。我们可以使用`@ExceptionHandler`注解来处理这些异常,提供自定义的错误响应。 7. **国际化** 对于多语言环境,Spring MVC...

    4中url请求方式,包括http和spring自带请求

    本文将深入探讨四种主要的URL请求方式,包括HTTP基础请求方法以及Spring框架中的请求工具类。我们将讨论它们的工作原理、优缺点以及如何在实际开发中灵活运用。 1. HTTP基础请求方法: - GET:最常用的方法,用于...

    SpringMVC后台接收请求参数的几种方式Demo

    通过`@RequestBody`注解,Spring MVC会尝试将请求体转换为相应的Java对象: ```java @PostMapping("/create") public ResponseEntity createUser(@RequestBody User user) { // ... } ``` 6. **模型和视图...

    SpringBoot+SpringSecurity处理Ajax登录请求问题(推荐)

    SpringBoot+SpringSecurity处理Ajax登录请求问题 SpringBoot+SpringSecurity处理Ajax登录请求问题是SpringBoot开发中的一個常见问题,本文将详细介绍如何使用SpringBoot+SpringSecurity处理Ajax登录请求问题。 ...

    springmvc+spring线程池处理http并发请求数据同步控制问题

    同时,Spring框架提供的线程池功能则可以帮助我们优化多线程环境下的性能,特别是处理并发请求时。在这个主题中,我们将深入探讨如何利用Spring MVC与Spring线程池来有效地管理并发请求,并解决数据同步控制问题。 ...

    SpringCloud Finchley Gateway 缓存请求Body和Form表单的实现

    同时,由于FormData和Body只能读取一次,因此在读取后,我们需要重新包装`ServerHttpRequest`和`ServerHttpResponse`以确保请求能正常传递到下游服务: ```java @Override public Mono&lt;Void&gt; filter...

    Spring MVC不能直接接收list类型参数的问题

    这种方法适用于 JSON 格式的请求体,通过 `@RequestBody` 注解,Spring MVC 可以自动将请求体中的 JSON 数据转换为 Java 对象。 #### 总结 以上介绍了三种解决 Spring MVC 无法直接接收 List 类型参数的方法。这些...

    springboot实现参数的驼峰与下划线的自动转换配置

    springboot中参数进行驼峰与下划线的自动转换配置,实现参数传入时是下划线、java后台接收变成驼峰、返回前端又转为下划线

    第12章Spring MVC参数绑定的验证

    当请求参数与控制器方法参数类型不完全匹配时,Spring MVC会尝试进行默认转换。例如,字符串"true"会被自动转换为布尔值true。如果转换失败,Spring MVC会抛出异常。 3. **POJO类型**: 对于复杂的Java对象,可以...

    使用HttpServletRequestWrapper在filter修改request参数

    `HttpServletRequestWrapper` 是Servlet API中的一个抽象类,它是`HttpServletRequest` 的包装类,可以用来扩展或修改原始请求对象的功能。 标题“使用HttpServletRequestWrapper在filter修改request参数”揭示了...

    Spring MVC请求参数接收的全面总结教程

    Spring MVC请求参数接收的全面总结教程 Spring MVC框架中,请求参数接收是一个非常重要的主题,今天我们将对Spring MVC请求参数接收进行详细的总结和介绍。 首先,Spring MVC中处理控制器参数的接口是...

    在Spring MVC或Spring Boot中使用Filter打印请求参数问题

    Spring提供了`OncePerRequestFilter`抽象类,它是对传统`Filter`的一个封装,确保每个请求只被过滤一次,避免了在多线程环境下的并发问题。然而,如果在处理JSON类型的POST请求时,直接在Filter中打印请求参数,可能...

    Spring+cxf请求webService

    在Spring+CXF的环境中,XML请求通常是通过Java对象转换得到的。CXF提供了JAXB(Java Architecture for XML Binding)支持,可以将Java对象自动转换为XML,反之亦然。因此,调用Web服务方法时,传入Java对象,CXF会...

Global site tag (gtag.js) - Google Analytics