`
jinnianshilongnian
  • 浏览: 21505669 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2418856
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:3009016
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5639634
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:259990
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1597431
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:250262
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5859141
Group-logo
跟我学Nginx+Lua开...
浏览量:702372
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:785302
社区版块
存档分类
最新评论

Spring3.2.3 绑定参数bug

 
阅读更多

今天早上看到一个问题:http://www.iteye.com/problems/95447

 

@Controller
public class ExampleController {

    @RequestMapping("/index")
    public String index(Long id) {
        System.out.println(id);
        return "index";
    }

}

  使用spring3.2.3时,在浏览器输入:http://localhost/index?id= 会报如下错误:

 

写道
HTTP ERROR 400

Problem accessing /es-web/monitor. Reason:

Required Long parameter 'userId' is not present
Powered by Jetty://

而spring3.2.3之前的版本是没有问题的。

 

spring3.2.3做了点小改变:

在其org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver的resolveArgument方法中:

                Object arg = resolveName(namedValueInfo.name, parameter, webRequest);
		if (arg == null) {
			if (namedValueInfo.defaultValue != null) {
				arg = resolveDefaultValue(namedValueInfo.defaultValue);
			}
			else if (namedValueInfo.required) {
				handleMissingValue(namedValueInfo.name, parameter);
			}
			arg = handleNullValue(namedValueInfo.name, arg, paramType);
		}
		else if ("".equals(arg) && (namedValueInfo.defaultValue != null)) {
			arg = resolveDefaultValue(namedValueInfo.defaultValue);
		}

		boolean emptyArgValue = "".equals(arg);

		if (binderFactory != null) {
			WebDataBinder binder = binderFactory.createBinder(webRequest, null, namedValueInfo.name);
			arg = binder.convertIfNecessary(arg, paramType, parameter);
		}

		if (emptyArgValue && (arg == null)) {
			handleMissingValue(namedValueInfo.name, parameter);
		}

		handleResolvedValue(arg, namedValueInfo.name, parameter, mavContainer, webRequest);

		return arg;

多添加了如下代码来处理null的情况,而handleMissingValue默认是抛异常的:

if (emptyArgValue && (arg == null)) {
   handleMissingValue(namedValueInfo.name, parameter);
}

但是如果之前版本就不处理此情况。

 

所以综上,不管你是不是有如下代码参数都是必须的。。。

@RequestParam(value="username", required=false)  

 

这是个bug。。提交了其jira

https://jira.springsource.org/browse/SPR-10592

 

8
4
分享到:
评论
24 楼 aihaozhe101 2015-05-29  
请教个问题,在spring做参数绑定的时候怎么对这些参数进行一些特殊字符处理啊?
23 楼 jettys 2013-12-24  
今年是龙年,哦不,Tao哥 -:)。
22 楼 jettys 2013-12-24  
public String[] getParameterValues(String name); 感谢龙哥了,已经找出来了。没想到Spring会调这个方法,一直局限在拿到整个请求参数的map,忽略了getParameterValues。
21 楼 jettys 2013-12-23  
注入后在Controller 里面用传进来的request获取getParameter getParameterMap 可以进入debug。不知道它的id到底是怎么获取的。
20 楼 jinnianshilongnian 2013-12-23  
jettys 写道
http://www.iteye.com/problems/99448
就是请求参数 id; 你要是替换的话 需要把替换的request传入chain

chain.doFilter(new RequestWrapper(request,func.getWrapper(),func.getCookie(),func.getInputStream()), wrapper);


我chain传入的实际上是请求的包装类,RequestWrapper里面我重写了几个Spring可能调用的方法:

public String getParameter(String name) {
		String value = super.getParameter(name);
		if(map!=null&&map.get(name)!=null){
			value = (String)map.get(name);
		}
		return value;
	}
	
	/**
	 * ParameterMap
	 */
	public Map<String, String[]> getParameterMap() {
		Map<String, String[]> map = new HashMap<String, String[]>();
		map.putAll(super.getParameterMap());
		try {
			List<String> ls = new ArrayList<String>();
			for (String str : map.keySet()) {
				String[] s = map.get(str);
				for (String v : s) {
					ls.add(new XssFilter().filter(v));
				}
				map.put(str, ls.toArray(new String[ls.size()]));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return map;
	}


目的是为了过滤XSS攻击,在Controller里面如果用SpringMvc传进来的HttpServletRequest的去取参数的话获取到都的是我包装类替换后的数据。
request.getParameter("xxx") 和 request.getParameterMap() 都是正常的获取到替换后的参数。
但是SpringMvc自动注入的参数弄死都不对,有点没招了。现在想做的就是想办法让SpringMvc拿到替换后的参数,而不是未过滤之前的。


你先debug看看走了你的代码吗?
19 楼 jettys 2013-12-23  
http://www.iteye.com/problems/99448
就是请求参数 id; 你要是替换的话 需要把替换的request传入chain

chain.doFilter(new RequestWrapper(request,func.getWrapper(),func.getCookie(),func.getInputStream()), wrapper);


我chain传入的实际上是请求的包装类,RequestWrapper里面我重写了几个Spring可能调用的方法:

public String getParameter(String name) {
		String value = super.getParameter(name);
		if(map!=null&&map.get(name)!=null){
			value = (String)map.get(name);
		}
		return value;
	}
	
	/**
	 * ParameterMap
	 */
	public Map<String, String[]> getParameterMap() {
		Map<String, String[]> map = new HashMap<String, String[]>();
		map.putAll(super.getParameterMap());
		try {
			List<String> ls = new ArrayList<String>();
			for (String str : map.keySet()) {
				String[] s = map.get(str);
				for (String v : s) {
					ls.add(new XssFilter().filter(v));
				}
				map.put(str, ls.toArray(new String[ls.size()]));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return map;
	}


目的是为了过滤XSS攻击,在Controller里面如果用SpringMvc传进来的HttpServletRequest的去取参数的话获取到都的是我包装类替换后的数据。
request.getParameter("xxx") 和 request.getParameterMap() 都是正常的获取到替换后的参数。
但是SpringMvc自动注入的参数弄死都不对,有点没招了。现在想做的就是想办法让SpringMvc拿到替换后的参数,而不是未过滤之前的。

18 楼 jinnianshilongnian 2013-12-23  
jettys 写道
请教下:
@Controller
public class ExampleController {

    @RequestMapping("/index")
    public String index(Long id) {
        System.out.println(id);
        return "index";
    }

}


这个id是怎样注入的?Spring是怎么从请求中取出这个id并注入的?

我在Spring的上一层做了一个Filter,尝试替换了getParameterMap、getParameter的内容,但是SpringMVC拿到的内容依旧是替换之前的。

request.getParameterMap()、request.getParameter();、request.getReader()都不是,求解。

刚提了一个问题,就看到老大的这文章。http://www.iteye.com/problems/99448

就是请求参数 id; 你要是替换的话 需要把替换的request传入chain
17 楼 jettys 2013-12-23  
请教下:
@Controller
public class ExampleController {

    @RequestMapping("/index")
    public String index(Long id) {
        System.out.println(id);
        return "index";
    }

}


这个id是怎样注入的?Spring是怎么从请求中取出这个id并注入的?

我在Spring的上一层做了一个Filter,尝试替换了getParameterMap、getParameter的内容,但是SpringMVC拿到的内容依旧是替换之前的。

request.getParameterMap()、request.getParameter();、request.getReader()都不是,求解。

刚提了一个问题,就看到老大的这文章。http://www.iteye.com/problems/99448
16 楼 sgq0085 2013-08-22  
遇到了相同问题,解决的方法是用String去接该数据
15 楼 jinnianshilongnian 2013-05-28  
lanhuidong 写道
jinnianshilongnian 写道
lanhuidong 写道
我还有个spring mvc testframework的问题,能否帮忙看下,http://www.iteye.com/problems/95405

我没用过 springmvc + freemarker的测试
如果方便 可否把代码发我 我跟踪下问题

代码我发消息个给你了,麻烦看下,谢谢

maven 多module时测试springmvc+freemarker的问题总结

搞定
14 楼 lanhuidong 2013-05-28  
jinnianshilongnian 写道
之前就有人提交了bug。 3.2.4会修复。
https://jira.springsource.org/browse/SPR-10578

这个我上午看到过
13 楼 jinnianshilongnian 2013-05-28  
之前就有人提交了bug。 3.2.4会修复。
https://jira.springsource.org/browse/SPR-10578
12 楼 lanhuidong 2013-05-28  
jinnianshilongnian 写道
lanhuidong 写道
我还有个spring mvc testframework的问题,能否帮忙看下,http://www.iteye.com/problems/95405

我没用过 springmvc + freemarker的测试
如果方便 可否把代码发我 我跟踪下问题

代码我发消息个给你了,麻烦看下,谢谢
11 楼 jinnianshilongnian 2013-05-28  
还一个类似的,不过是相同的bug
https://jira.springsource.org/browse/SPR-10404
10 楼 jinnianshilongnian 2013-05-28  
lanhuidong 写道
我还有个spring mvc testframework的问题,能否帮忙看下,http://www.iteye.com/problems/95405

我没用过 springmvc + freemarker的测试
如果方便 可否把代码发我 我跟踪下问题
9 楼 jinnianshilongnian 2013-05-28  
Saro 写道
boolean emptyArgValue = "".equals(arg); 
if (emptyArgValue && (arg == null)) {
}
//
这代码怎么这么怪异?
arg为""并且为null???

下边执行类型转换了
arg = binder.convertIfNecessary(arg, paramType, parameter); 
8 楼 Saro 2013-05-28  
boolean emptyArgValue = "".equals(arg); 
if (emptyArgValue && (arg == null)) {
}
//
这代码怎么这么怪异?
arg为""并且为null???
7 楼 lanhuidong 2013-05-28  
我还有个spring mvc testframework的问题,能否帮忙看下,http://www.iteye.com/problems/95405
6 楼 lanhuidong 2013-05-28  
jinnianshilongnian 写道
lanhuidong 写道
你测试过@RequestParam(value="username", required=false)吗?我这边怎么还是一样的错误?

先换到3.2.1吧(3.2.2的我没看) 我看了下这个版的没事

我觉得这个改变不合理,还是以前的版本比较适合。比如用jQuery:$(elem).find('form').serialize();这样获取表单数据就回出现id=这种参数。也就是说3.2.3不能这么干了,得自己获取参数。
5 楼 jinnianshilongnian 2013-05-28  
lanhuidong 写道
你测试过@RequestParam(value="username", required=false)吗?我这边怎么还是一样的错误?

先换到3.2.1吧(3.2.2的我没看) 我看了下这个版的没事

相关推荐

    spring mvc + spring3.2.3 + mybatis3.2.3 + oracle

    SSM框架是Spring MVC、Spring 3.2.3和MyBatis 3.2.3集成的常用Java Web开发框架,它为开发者提供了一种高效、灵活的后端架构解决方案。下面将详细介绍这些组件以及如何在Oracle数据库环境下进行集成。 **Spring MVC...

    spring-3.2.3.RELEASE.rar

    8. **性能和稳定性提升**:Spring 3.2.3对许多内部组件进行了优化,提高了整体性能,同时修复了大量的bug,增强了系统的稳定性和可靠性。 9. **注解驱动的开发**:3.2.3版本进一步推广了注解的使用,如@Component、...

    Spring3.2.3+Quartz2.2 整合配置

    本篇文章将详细介绍如何将Spring 3.2.3版本与Quartz 2.2版本进行整合配置,以便在Spring应用中实现灵活的定时任务管理。 首先,集成Quartz到Spring项目中,我们需要在项目的`pom.xml`或`build.gradle`文件中添加...

    Jersey2.13+spring3.2.3入门实例

    ** Jersey2.13 + Spring3.2.3入门实例详解** 本文将深入探讨如何结合Jersey 2.13和Spring 3.2.3框架构建一个入门级的Web服务应用。首先,我们来了解这两个关键组件的核心功能。 **Jersey** 是Java语言中最流行的...

    Spring3.2.3基础类包

    Spring3.2.3基础类包是专门为初学者设计的,它包含了Spring框架最基本、最核心的部分,不包括额外的模块如AOP(面向切面编程)等高级功能。这样的设计使得学习者能够更专注于理解和掌握Spring的核心概念,避免在学习...

    spring配置sessionFactory(spring3.2.3+hibernate4.2.2)

    本文将详细讲解如何在Spring 3.2.3版本中配置SessionFactory,以便整合Hibernate 4.2.2,实现对数据库操作的高效管理。SessionFactory是Hibernate的核心组件,它负责创建Session对象,而Session则是与数据库交互的...

    三、Spring3.2.3+Hibernate4.2项目框架搭建.pdf

    【Spring3.2.3+Hibernate4.2项目框架搭建】是关于构建基于Spring和Hibernate的Web应用程序的教程。在该框架中,Spring作为依赖注入容器和应用上下文管理工具,而Hibernate则作为对象关系映射(ORM)框架,负责数据库...

    hibernate3.3 struts-2.3.20 spring3.2.3 整合框架

    这个"hibernate3.3 struts-2.3.20 spring3.2.3 整合框架"压缩包包含了这三个框架的特定版本,适用于旧项目的开发或者学习。开发者只需将所有库文件复制到项目的lib目录下,然后按照SSH的整合教程配置相应的XML文件,...

    这是第一个专门针对SSH框架的课程设计,使用Struts 2.3.4.1+Spring 3.2.3+Hib

    这是第一个专门针对SSH框架的课程设计,使用Struts 2.3.4.1+Spring 3.2.3+Hibernate4.1.9做这个小实验,主要偏向于对layui这个前端界面控件的利用。用上去很

    spring-framework-3.2.3.RELEASE

    《Spring Framework 3.2.3.RELEASE:深入解析与应用》 Spring Framework,作为Java开发中的核心框架,以其强大的依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)功能,极...

    LIBSVM3.2.3(修改Bug)

    包括libsvm包,官方指南和编译器 LIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了...

    spring-framework-3.2.3.RELEASE-dist.zip

    《Spring Framework 3.2.3.RELEASE:深入解析与应用》 Spring Framework,作为Java开发中的核心框架,以其强大的依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)特性,极...

    Struts2 2.3.15 + Hibernate 3.x.x + Spring 3.2.3整合JAR包

    Spring 3.2.3版本增强了对JSR-330标准的支持,提供了更强大的事务管理,以及对其他框架如Hibernate的更好集成。在SSH整合中,Spring主要负责管理Bean的生命周期,实现服务和数据访问对象的依赖注入。 **SSH整合过程...

    spring3.2源码包

    Spring 框架是Java开发领域中的一个基石,它的出现极大地简化了企业级应用的构建。Spring 3.2 版本是该框架的一个重要里程碑,它在前几个版本的基础上进行了许多改进和优化,旨在提高开发效率、可维护性和性能。下面...

    spring mvc3.2.3+ myibatis3.2.2

    spring mvc3.2.3+ myibatis3.2.2 分 dao service pojo mapper controllor等层,有敢于网上下载多不适用,故作一层次分明功能较全面(列表,登录验证,增加)的功能验证性web程序以为分享,因程序为功能验证性程序,...

    spring-web-3.2.3.RELEASE.jar

    spring-web-3.2.3.RELEASE.jar。。。。。。。。。。。

    spring-framework-3.2.3.RELEASE 源码

    再者,Spring MVC是用于构建Web应用程序的模块,3.2.3.RELEASE版的MVC框架在处理HTTP请求、视图渲染和数据绑定等方面都有卓越的表现。源码分析可以帮助我们了解请求是如何被路由的,以及模型-视图-控制器模式如何在...

    java Spring.jar包3.2.3

    在这个特定的场景中,提到的是Spring.jar包的3.2.3版本,这是一个较旧但仍然广泛使用的版本。 Spring框架主要由以下几个核心模块组成: 1. **IoC(Inversion of Control,控制反转)**:这是Spring最基础的概念,...

Global site tag (gtag.js) - Google Analytics