HttpServletRequest的getParameter()的坑及解决

 更新时间:2023年07月29日 16:44:29   作者:我想问问天  
这篇文章主要介绍了HttpServletRequest的getParameter()的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

HttpServletRequest的getParameter()的坑

问题

最近做项目的时候和对接方联调的时候,对接方会传入一个url给我们,然后经过一系列的操作之后,我们会将一些参数返回到该url上,回调给对接方。

然而当使用了getParameter获取传入的url的时候发现,获取的url并不是对接方传入的完整的url。

例子:对接方传入url=http://abc.com/#/result/success这样类似的url

我们原本要返回的是(a=1&b=2是我方添加的参数):

http://abc.com/#/result/success?a=1&b=2

结果返回的是:

http://abc.com/?a=1&b=2

导致无法达到预期的效果

原因

首先直接贴出来原因,是因为使用了HttpServletRequest下面的getParameter()方法去获取对接方的参数,(类似这样:http://localhost:8090/testGetParam?url=http://abc.com),getParameter(“url”)获取到的url会将"#“后面的内容全部忽略。

因为”#"后的参数已经被忽略了,所以最后返回的时候就只有http://abc.com/?a=1&b=2。

没有了#/result/success这个路径,就使得跳转的页面不正确。

验证过程

我们将通过有没有"#“的对比试验来证明,getParameter()会忽略”#"后面的内容。

1.getParameter()不存在#号的实验:

url: http://localhost:8090/testGetParam?url=http://abc.com

结果:

这里写图片描述

2.getParameter()存在#号的实验

url: http://localhost:8090/testGetParam?url=http://abc.com/#/index.html

结果:

这里写图片描述

结论和解决方式

1.有#号和没有#号的结果返回一模一样,因为getParameter()底层把遇到以后#后面的(包括#号自身),全部给忽略掉了,所以导致getParameter时,带有#的内容显示不出来(具体原理后面加文章分析)

2.解决的方式就是采用urlencode,现将url中的#号传入的时候,进行转码,要使用的时候在进行urldecode,就可以了。

HttpServletRequest getParameter为null

HttpServletRequest 提供了 getParameter 方法,可以非常方便获取请求行/请求体中key/value形式的数据(x-www-form-urlencoded、multipart/form-data,其都是key/value形式,只是对数据编码方式有差别),对于application/json 之类的数据只能使用流的方式读取。

创建web 项目工程

1.TestServlet.java

package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Servlet implementation class TestServlet
 */
@WebServlet("/test")
public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name = request.getParameter("name");
		System.out.println("name:" + name);
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//request.setCharacterEncoding  只能解决post 乱码问题
		request.setCharacterEncoding("utf-8");
		doGet(request, response);
	}
}

2.test.jsp 请求核心

fetch('http://localhost:8080/web-test/test?',{
    method:'post',
     body:'name=vincent',
     headers:{
       'Content-Type':'application/json',
     }
   }).then(resp=>{
     return resp.text();
   }).then(resp=>{
     console.log(resp);
});

3.效果如下:

在这里插入图片描述

4.test.jsp headers Content-Type 修改为:application/x-www-form-urlencoded:

在这里插入图片描述

注意

HttpServletRequest getParameter 获取参数有如下条件:

1.request.getParameter() 方法获取的参数是形如key/value 形式的数据(x-www-form-urlencoded、multipart/form-data、及请求行中的key1=value1&key2=value2),与数据所在位置(请求体)和请求方法(GET、POST)无关。

2.request.setCharacterEncoding 只能解决post 乱码问题,对于get 方式只能获取到参数值再使用String 相关的转码方式(ISO-8859-1解码)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot自动装配原理及分析

    SpringBoot自动装配原理及分析

    SpringBoot通过@SpringBootApplication注解启动自动装配,其中@EnableAutoConfiguration导入AutoConfigurationImportSelect类,读取META-INF下的配置文件,根据@Conditional条件筛选并注入符合条件的Bean到IOC容器
    2025-09-09
  • Java Math.round函数详解

    Java Math.round函数详解

    这篇文章主要介绍了Java Math.round函数详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • SpringBoot Redis用注释实现接口限流详解

    SpringBoot Redis用注释实现接口限流详解

    Redis 除了做缓存,还能干很多很多事情:分布式锁、限流、处理请求接口幂等性。。。太多太多了~今天想和小伙伴们聊聊用 Redis 处理接口限流,这也是最近的 项目涉及到这个知识点了,我就拎出来和大家聊聊这个话题
    2022-07-07
  • Java代码缺陷的自动化检测与跟踪的管理指南

    Java代码缺陷的自动化检测与跟踪的管理指南

    本文系统解析Java代码缺陷类型及危害,涵盖静态分析工具检测方法,动态监控技术(异常处理、性能指标),缺陷跟踪系统与CI/CD自动化集成方案,助力提升代码质量与安全防护,需要的朋友可以参考下
    2025-07-07
  • 使用Netty解码自定义通信协议方式

    使用Netty解码自定义通信协议方式

    这篇文章主要介绍了使用Netty解码自定义通信协议方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • 深入理解Java中的接口

    深入理解Java中的接口

    下面小编就为大家带来一篇深入理解Java中的接口。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • Mybatis XML文件中使用CDATA标签的实现

    Mybatis XML文件中使用CDATA标签的实现

    本文主要介绍了Mybatis XML文件中使用CDATA标签,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03
  • Mybatis通用Mapper(tk.mybatis)的使用

    Mybatis通用Mapper(tk.mybatis)的使用

    本文主要介绍了Mybatis通用Mapper(tk.mybatis)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Java线程的调度与优先级详解

    Java线程的调度与优先级详解

    这篇文章主要为大家详细介绍了Java线程的调度与优先级,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • JVM 体系结构详解

    JVM 体系结构详解

    本文主要介绍了JVM体系结构的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03

最新评论