get参数通过request.getparameter()获取,需url正确编码且服务器uriencoding配置正确;post需在读取请求体前调用setcharacterencoding();json等非表单格式需用getinputstream()读取。

GET请求里怎么取参数,为什么request.getParameter()有时拿不到值
GET请求的参数在URL里,request.getParameter()能直接取,但前提是URL编码正确、且没被中间件(比如反向代理或网关)截断或转义。常见错误是前端拼接URL时没用encodeURIComponent(),比如传中文“张三”变成?name=张三,服务端收到的就是乱码或空值。
实操建议:
- 确保前端用
encodeURIComponent()编码每个参数值,而不是整个URL - Tomcat 8.5+ 默认用UTF-8解析GET参数,但旧版本(如7.x)默认ISO-8859-1,需在
server.xml的Connector里加URIEncoding="UTF-8" - 不要依赖
request.getQueryString()手动解码——它不处理+号变空格、%20等细节,getParameter()才是标准入口
POST表单提交后getParameter()返回null或乱码的典型原因
POST乱码不是因为“没设编码”,而是request.setCharacterEncoding()调用时机错了。这个方法只对后续的getParameter()生效,且必须在第一次读取请求体前调用。一旦你先调用了getParameter()或getInputStream(),再设编码就无效了。
实操建议:
- 在
doPost()开头第一行就写request.setCharacterEncoding("UTF-8") - 如果用了过滤器(Filter),确保它在Servlet之前执行,并且
chain.doFilter()前完成编码设置 - 注意Content-Type:表单提交必须是
application/x-www-form-urlencoded;如果是text/plain或application/json,getParameter()根本不会解析,得用getInputStream()自己读
为什么POST用JSON传参时getParameter()永远是null
getParameter()只解析application/x-www-form-urlencoded和multipart/form-data两类请求体。JSON是application/json,Servlet容器根本不拆包,所有参数都在原始流里,getParameter()自然返回null。
实操建议:
- 别硬套
getParameter(),改用request.getInputStream()或request.getReader()读原始数据 - 读完流后不能重复读——Servlet规范规定输入流只能消费一次,后续再调
getParameter()也不会自动解析 - 如果必须兼容表单和JSON,建议统一用
getInputStream()读,再根据Content-Type分支处理,避免混合调用
filter里统一处理编码,但中文还是乱码怎么办
过滤器看似万能,但容易踩两个坑:一是request.setCharacterEncoding()对GET请求完全无效(GET参数在URL里,跟请求体编码无关);二是filter没覆盖所有路径,比如静态资源或错误页跳转绕过了filter。
实操建议:
- GET乱码必须靠
URIEncoding(Tomcat)或useBodyEncodingForURI="true"(旧版)解决,filter做不了 - 检查filter的
<url-pattern></url-pattern>是否匹配实际请求路径,比如/api/*不会拦截/login - 在filter里加日志,打印
request.getCharacterEncoding()和request.getContentType(),确认编码真被设上了
最麻烦的是混合场景:同一个接口既要支持表单提交又要支持JSON,还要兼容GET查询参数。这时候别指望一个配置打天下,得在代码里按getMethod()和getContentType()分情况处理,而且每种路径都要单独验证编码行为。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











