SCWCD(Servlet&Jsp learning)第一问-------HttpServletRequestWrapper应用

解决请求参数中文乱码(post和get) 出现乱码的原因就是编码不一致,解决的思想就是把任意码(乱码)都转换为字节码,再把字节码转换为我们能读懂的UTF-8就好了。PS:这个代码给post使用有效果,同样给get用也是一样的。因为都是把乱码转为字节码,再转为UTF-8。在我们发送请求参数输入中文的时候,可能会出现乱码问题,因为我们输入的中文,浏览器是解读不了的,要转成。那我们要添加编码解码这些给这些数据进行转码处理。其他知识:如果遇到了乱码?这个代码要放在请求代码的上面才可以。二、get乱码问题的解决。这个注释或者删除试试看。 阅读详情

应用一:解决tomcat下(先来个简单的) 

在tomcat下,我们通常这样来解决中文乱码问题:

 

过滤器代码:

package filter;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import wrapper.GetHttpServletRequestWrapper;

public class ContentTypeFilter implements Filter {

	private String charset = "UTF-8";
	private FilterConfig config;
	
	public void destroy() {
        System.out.println(config.getFilterName()+"被销毁");
		charset = null;
		config = null;
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
        //设置请求响应字符编码
		request.setCharacterEncoding(charset);
		response.setCharacterEncoding(charset);
		
        HttpServletRequest req = (HttpServletRequest)request;
		
		
		System.out.println("----请求被"+config.getFilterName()+"过滤");
		//执行下一个过滤器(如果有的话,否则执行目标servlet)
		chain.doFilter(req, response);
		
		System.out.println("----响应被"+config.getFilterName()+"过滤");

	}

	public void init(FilterConfig config) throws ServletException {
		    this.config = config;
            String charset = config.getServletContext().getInitParameter("charset");  
            if( charset != null && charset.trim().length() != 0)
            {
            	this.charset = charset;
            }
	}

}

web.xml中过滤器配置:

<!--将采用的字符编码配置成应用初始化参数而不是过滤器私有的初始化参数是因为在JSP和其他地方也可能需要使用-->
	<context-param>
			<param-name>charset</param-name>
			<param-value>UTF-8</param-value>
	</context-param>

	<filter>
		<filter-name>ContentTypeFilter</filter-name>
		<filter-class>filter.ContentTypeFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>ContentTypeFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

request.setCharacterEncoding(charset); 必须写在第一次使用request.getParameter()之前,这样才能保证参数是按照已经设置的字符编码来获取。
response.setCharacterEncoding(charset);必须写在PrintWriter out = request.getWriter()之前,这样才能保证out按照已经设置的字符编码来进行字符输出。

 

通过过滤器,我们可以保证在Servlet或JSP执行之前就设置好了请求和响应的字符编码。

 

但是这样并不能完全解决中文乱码问题:

对于post请求,无论是“获取参数环节”还是“输出环节"都是没问题的;

对于get请求,"输出环节"没有问题,但是"获取参数环节"依然出现中文乱码,所以在输出时直接将乱码输出了。

 

原因是post请求和get请求存放参数位置是不同的:

post方式参数存放在请求数据包的消息体中。get方式参数存放在请求数据包的请求行的URI字段中,以?开始以param=value&parame2=value2的形式附加在URI字段之后。而request.setCharacterEncoding(charset); 只对消息体中的数据起作用,对于URI字段中的参数不起作用,我们通常通过下面的代码来完成编码转换:

String paramValue = request.getParameter("paramName");
paramValue = new String(paramValue.trim().getBytes("ISO-8859-1"), charset);

但是每次进行这样的转换实在是很麻烦,有没有统一的解决方案呢?

 

解决方案1: 在tomcat_home\conf\server.xml 中的Connector元素中设置URIEncoding属性为合适的字符编码

    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" 
               URIEncoding="UTF-8"
     />

解决方案2:自定义请求包装器包装请求,将字符编码转换的工作添加到getParameter()方法中

package wrapper;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class GetHttpServletRequestWrapper extends HttpServletRequestWrapper {

	private String charset = "UTF-8";

	public GetHttpServletRequestWrapper(HttpServletRequest request) {
		super(request);
	}

	/**
	 * 获得被装饰对象的引用和采用的字符编码
	 * @param request
	 * @param charset
	 */
	public GetHttpServletRequestWrapper(HttpServletRequest request,
			String charset) {
		super(request);
		this.charset = charset;
	}

	/**
	 * 实际上就是调用被包装的请求对象的getParameter方法获得参数,然后再进行编码转换
	 */
	public String getParameter(String name) {
		String value = super.getParameter(name);
		value = value == null ? null : convert(value);
		return value;
	}

	public String convert(String target) {
		System.out.println("编码转换之前:" + target);
		try {
			return new String(target.trim().getBytes("ISO-8859-1"), charset);
		} catch (UnsupportedEncodingException e) {
			return target;
		}
	}

}

修改过滤器的doFilter方法 代码如下:

public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
        //设置请求响应字符编码
		request.setCharacterEncoding(charset);
		response.setCharacterEncoding(charset);
        //新增加的代码		
        HttpServletRequest req = (HttpServletRequest)request;
		
        if(req.getMethod().equalsIgnoreCase("get"))
        {
        	req = new GetHttpServletRequestWrapper(req,charset);
        }
		
		System.out.println("----请求被"+config.getFilterName()+"过滤");
		//传递给目标servlet或jsp的实际上时包装器对象的引用,而不是原始的HttpServletRequest对象
		chain.doFilter(req, response);
		
		System.out.println("----响应被"+config.getFilterName()+"过滤");

	}

这样一来,在servlet中调用包装器的getParameters方法来获取参数,就已经完成了字符编码的转换过程,我们就不需要在每次获取参数时来进行字符编码转换了。

数字IC/FPGA笔试题收集讨论-华为2022硬件逻辑题题解 华为2022届硬件逻辑 时间2021.7.28 习题题解,收集自网络。 阅读详情

相关推荐

Linux下用SquareLine Studio开发LVGL界面:从安装到实战的完整避坑指南

本文提供了一份在Linux系统下使用SquareLine Studio开发LVGL图形界面的完整实战指南。内容涵盖从SDL库安装、SquareLine Studio环境配置、界面可视化设计,到工程导出、源码编译及常见错误排查的全流程。重点解析了如何将设计界面无缝集成到Linux开发流程中,并针对嵌入式设备移植提供了关键步骤,旨在帮助开发者高效避坑,快速上手LVGL界面开发。

egg99的博客 908

通过HttpServletRequestWrapper(装饰模式的应用)增强HttpServletRequest的功能

应用一:解决tomcat下中文乱码问题(先来个简单的)  在tomcat下,我们通常这样来解决中文乱码问题:   过滤器代码: package filter; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import wrapper.GetHttpServletRequestWra...

万里征程初试马,百年伟业乐为牛! 500

数学建模美赛O奖论文研读启示录——从模仿开始

数学建模美赛O奖论文哪些地方比较出彩?我们可以从中学到什么东西?可以从哪些地方进行模仿?我总结了一些O奖论文里我认为比较好的地方,跟大家一起学习交流!

小宇的修炼之路 5429

get 请求中文乱码问题

get请求中文乱码问题   对于浏览器发出的HTTP请求: tomcat 默认是ISO-8859-1 解码    URI: xxxxx.action?key="+encodeURIComponent(“中文”)    在服务器获取 到key的值是tomcat使用 ISO-8859-1编码进行解码的字符,会出现乱码的问题。目前有两种方式可以解决该问题。     1:通过转成编码为ISO-8...

qq_24184997的博客 1649

Windows11 升级到24H2后,原本的protel99se软件的DDB图纸文件打不开解决办法

Windows11更新后无法打开DDB文件

xingchen2837的博客 425

实战!在 AMD RX 9070 XT (16G) 上使用原生 Windows ROCm 7.1 部署 ComfyUI + Z-Image-Turbo

本文详细介绍了如何在Windows系统下为AMD Radeon RX 9070 XT显卡配置Z-Image-Turbo AI绘图环境。主要内容包括:安装VS Build Tools和最新显卡驱动,配置Conda Python 3.12环境,安装ROCm 7.1.1 SDK及PyTorch适配版本,部署ComfyUI可视化界面。重点解决了AMD显卡在AI绘图中的适配问题,通过--use-split-cross-attention参数优化显存使用,最终成功搭建了可在消费级16G显存设备上运行的AI绘图环境

qq_33614778的博客 4701

c# winform httplistener监听get和Post请求并处理参数解决中文乱码

通过winform启动后台监听接口,用来接收前端请传递的参数

qq_41218006的博客 4760

【论文阅读1】机理引导的残差学习用于电池全生命周期状态监测 | Nature Communications

本文提出了一种机理引导的残差学习框架,用于提升电池全生命周期内荷电状态(SOC)和健康状态(SOH)的监测精度。该方法融合等效电路模型的先验知识与机器学习,设计了修正模型和补偿模型两种通用框架。实验验证表明,该方法在三种不同类型电池数据集上均表现出色,SOC和SOH估计误差较传统方法降低50%以上,且在未见工况下仍保持良好外推能力。模型具有强鲁棒性,在减少训练数据量和降低采样频率时性能稳定,并兼具物理可解释性。该框架无需离线测试和运行中校准,为电池安全监测提供了有效解决方案。

qq_21843433的博客 617

curl 控制台请求,参数带中文,返回中文乱码问题小结

1.cURL简介 cURL (CommandLine Uniform Resource Locator) 是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl。 cURL支持的通信协议有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、G...

coco的专栏 1万+

电子取证之服务器取证思路

服务器取证是一个技术性很强的领域,涉及到多个环节,包括网站重构、网站代码分析、容器分析等。数据库密码的获取通常通过查看配置文件、日志文件、备份等途径,同时可以通过一些绕过技术如禁用身份验证来获取权限。对于不同的数据库,需要根据其特性采取相应的应对方法和命令。

2401_84830066的博客 2491

Open3D 基于法线的双边滤波

基于法线的双边滤波是一种用于点云平滑的技术,它结合了点与其邻域点之间的几何距离和法线方向的相似性,从而在去除噪声的同时保留几何特征。这种滤波方法广泛应用于点云处理领域,尤其是在需要保留表面细节和边缘的场景中。

纵马踏花向自由 2500

HttpGet请求与Post请求中参数乱码原因剖析与解决方案

以上分析可知,导致乱码的情况可以归纳成输入的字符集与输出的字符集不一致的情况,为了解决乱码的问题,需要将前后的字符集设置成一致。

contact97的博客 1万+

【全局路径规划模块运动学算法】无人机Kinodynamic A*算法、Kinodynamic RRT*算法(附C++代码)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对Kinodynamic A*算法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容啃这个Kinodynamic A_star算法,建议先啃一啃高飞fast_planner那篇论文,把理论打好,如果还是比较迷,就先看Dijksta、再看A_star、再看hybrid A_star 三个的流程,因为往上资料比较多,再看这个Kinodynamic A_star算法,流程已经很相像了。如果。

qq_35635374的博客 2604

request.getParameter()在get和post方法中文乱码问题

乱码原因:Http请求传输时将url以ISO-8859-1编码,服务器收到字节流后默认会以ISO-8859-1编码来解码成字符流(造成中文乱码) post请求: 假设提交请求的jsp页面是UTF-8编码     pageEncoding="UTF-8"%> 解决方法1:在服务端获取参数前,先设置解码方式。 //设置解码方式,对于简体中文,使用UTF-8解码 request.set

乐在其中 2万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SpringMVC中如何解决POST请求中文乱码问题

解决 post 请求乱码问题:在 web.xml 中配置一个 CharacterEncodingFilter字符集过滤器,设置编码方式为 utf-8。

桂林电子科技大学 -芳 302

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

HttpServletRequestWrapper替代HttpServletRequest

本文解析以下两个方面 1.HttpServletRequestWrapper的作用 HttpServletRequest采用装饰者模式包装了HttpServletRequest,客户端发送请求后,容器实例化了一个org.apache.catalina.connector.RequestFacade对象并赋值给了HttpServletRequest RequestFacade采用外观模式包装了...

zlc147的博客 3550

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

GET请求中关于中文的编码与解码

问:有时候在特殊情况下,需要使用GET请求来传递参数,而传递的参数中有中文字符。如何直接传递过去,会导致乱码问题,针对这个情况如何解决? 原因:在使用get请求传递参数时,需要依赖浏览器环境,由于我们在javascript中没有做任何操作,完全依赖浏览器进行编码后传递到后台,一旦于后台编码格式不一样,就会出现乱码。 答: 1 在javascript中使用encodeURI()方法进行编码。 ...

zhangpeng123_的博客 2559

.net后台怎么取得sessionstorage里面的值_get请求URL传中文参数后台接收乱码的解决之道...

现在需求是在浏览器里面直接发请求,浏览器发请求,默认发的是get请求,然后带参数,参数包含中文汉字。麻烦就在这里,参数里面的汉字,在后台接收的时候,是乱码。这么简单的传递参数的方式,是不OK的。下面看详情。这个就是简单的在URL里面带中文汉字参数,然后,就在后台乱码了,哦。这就悲剧啦。1,有的人说:(结果:失败)后台解码的时候,如下,String setMetricText = URLDecode...

weixin_39887546的博客 603

Get请求和Post请求解决中文乱码问题

URLEncoding.encoder("要编码的字符串","字符集")URLdecode("要解码的字符串","字符集")此方法Post和Get请求都适用。Post请求中中文乱码的原因。

m0_57218914的博客 1740

使用HttpServletRequestWrapper后中文乱码解决方案

继承HttpServletRequestWrapper的类: public class MyRequestWrapper extends HttpServletRequestWrapper { private final String body; public MyRequestWrapper(HttpServletRequest request) throws Exception { super(request); this.body = Http

Y_jay的博客 1863

关于jsp乱码问题的解决

[b]1 最基本的乱码问题[/b]。 这个乱码问题是最简单的乱码问题。一般新会出现。就是页面编码不一致导致的乱码。 [code="html"] 中文问题 我是个好人 [/code] 三个地方的编码。 第一个地方的编码格式为jsp文件的存储格式。Eclipse会根据这个编码格式保存文件。并编译jsp...

Sid雨小烛的空间 469

浏览器get提交URL包含中文怎么处理

get方式提交的参数编码,只支持iso8859-1编码。 因此,如果里面有中文。 在后台就需要转换编码,如下:     整个项目使用utf-8 编码 String itemName = new String(itemName.getBytes("iso8859-1"), "UTF-8");

踏歌行的专栏 1628

url里含有中文参数,已get方式提交到接口,中文编码后有乱码问题的一种解决

spring mvc接收中文参数乱码问题 我的博客:www.while0.com 今天测试spring mvc  ,中文乱码。根据网上的建议,更改过滤器,在web.xml中加上 1 filter> 2 filter-name>CharacterEncodingFilterfilter-name> 3 filter-cl

b452608的专栏 3827

GET请求URL中带中文参数的方法

url参数中带中文参数通常会产生乱码,比如 http://8520.15.35:8003/getbranchs?Sub_bank_select=朝阳 再view函数中可以通过转码来解决该问题: def getbranchs(request): request.encoding='gb2312' par1=request.GET['Sub_bank_select'] print(par1) ... return ... print之后可以得到中文参数:朝阳。

akuxia的博客 1892

如何解决get请求URL地址的中文参数问题

首先我们要明白为什么在get请求URL地址出现中文参数会乱码,这是因为页面发出请求的编码和tomcat获取数据的编码不一致造成的。 在解决这个问题之前,我们得先了解一些知识: 1.request.setCharacterEncoding("utf-8")方法只对post请求有效。 2.get、post请求的url编码由标签,设定,标签表示页面实现的编码。 3.了解js的encodeURI(

u012017645的专栏 3264

linux curl 中文参数,linux curl http get 请求中带有中文参数或者特殊字符处理

在使用c++去请求http服务的时候,使用的是著名的curl工具提供的类库 libcurl,但是在使用的过程中发现,如果请求的参数值带了空格或者是参数是中文,会导致响应的回调函数没有被执行,虽然curl_easy_perform 返回的CURLcode 为 CURLE_OK,但是实际上是没有数据的。考虑到可能需要转义,于是研究了下官方文档,具体参考如下链接: http://curl.haxx.se...

weixin_39997957的博客 1260
上一篇: Spket IDE 插件安装和设置
下一篇: SCWCD(Servlet&Jsp learning)第二问-------cookie和session的区别和联系
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值