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解码)

总结

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

相关文章

  • Java日常练习题,每天进步一点点(44)

    Java日常练习题,每天进步一点点(44)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • Spring BeanPostProcessor(后置处理器)的用法

    Spring BeanPostProcessor(后置处理器)的用法

    这篇文章主要介绍了Spring BeanPostProcessor(后置处理器)的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Springboot常用注解及配置文件加载顺序详解

    Springboot常用注解及配置文件加载顺序详解

    这篇文章主要介绍了Springboot常用注解及配置文件加载顺序,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • java如何根据时间戳生成有序ID

    java如何根据时间戳生成有序ID

    这篇文章主要介绍了java如何根据时间戳生成有序ID问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • servlet生命周期_动力节点Java学院整理

    servlet生命周期_动力节点Java学院整理

    这篇文章主要为大家详细介绍了servlet生命周期的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • 搭建JavaWeb服务器步骤详解

    搭建JavaWeb服务器步骤详解

    本篇文章主要给大家详细分享了搭建JavaWeb服务器的详细步骤以及用到的代码,对此有需要的朋友可以跟着学习下。
    2018-02-02
  • Java接口定义与实现方法分析

    Java接口定义与实现方法分析

    这篇文章主要介绍了Java接口定义与实现方法,简单说明了接口的概念、功能,并结合实例形式分析了接口的相关定义与使用技巧,需要的朋友可以参考下
    2017-11-11
  • JAVA统计字符串中某个字符出现次数的方法实现

    JAVA统计字符串中某个字符出现次数的方法实现

    本文主要介绍了JAVA统计字符串中某个字符出现次数的方法实现,可以循环使用String的charAt(int index)函数,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • SpringBoot使用MockMvc测试get和post接口的示例代码

    SpringBoot使用MockMvc测试get和post接口的示例代码

    Spring Boot MockMvc是一个用于单元测试的模块,它是Spring框架的一部分,专注于简化Web应用程序的测试,MockMvc主要用来模拟一个完整的HTTP请求-响应生命周期,本文给大家介绍了SpringBoot使用MockMvc测试get和post接口,需要的朋友可以参考下
    2024-06-06
  • java 多线程交通信号灯模拟过程详解

    java 多线程交通信号灯模拟过程详解

    这篇文章主要介绍了java 多线程交通信号灯模拟过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07

最新评论