JavaWeb项目的中文乱码的原因以及Servlet中处理GET请求和POST请求编码过滤器

本文详细介绍了Web开发中常见的乱码问题及其原因,并提供了解决方案,包括手动设置编码及使用过滤器实现自动编码转换。

一、乱码原因

①传输方和接收方采用的编码不一致。传输方对参数采用的是UTF-8编码而接收方却用GBK进行解析,当然是乱码。

②Tomcat服务器默认采用的ISO8859-1编码得到参数值。虽然①中采用了同样的编码方式,但经过tomcat一处理,也会出现乱码(GET方式)


二、解决办法


方法一 每次传输都手动设置编码(GET方式传输数据)

传输方
String name = URLEncoder.encode("徐越","UTF-8");
String path = "
http://localhost:8008/xyWeb/xyServlet?name=" + name;

接收方
String name = new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");


若传输方默认采用UTF-8编码就没有必要每次写,但接收方每次都写太烦,可考虑过滤器。

方法二(过滤器)

/**
 * 编码过滤器
 * 
 * @author 徐越
 * 
 */
public class EncodingFilter implements Filter
{
	private String encoding;

	public void init(FilterConfig fConfig) throws ServletException
	{
		encoding = fConfig.getInitParameter("encoding");
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws Exception
	{
		HttpServletRequest httprequest = (HttpServletRequest) request;
		if ("GET".equals(httprequest.getMethod()))
		{
			// 将httpRequest进行包装
			EncodingHttpServletRequest wrapper = new EncodingHttpServletRequest(httprequest, encoding); 
			chain.doFilter(wrapper, response);
		}
		else
		{
			request.setCharacterEncoding(encoding);
			response.setContentType("text/html;charset=" + encoding);
			chain.doFilter(request, response);
		}
	}

	public void destroy()
	{

	}

}


/**
 * httpRequest进行包装类
 * 
 * @author 徐越
 * 
 */
public class EncodingHttpServletRequest extends HttpServletRequestWrapper
{
	private HttpServletRequest request;
	private String encoding;

	public EncodingHttpServletRequest(HttpServletRequest request)
	{
		super(request);
		this.request = request;
	}

	public EncodingHttpServletRequest(HttpServletRequest request,String encoding)
	{
		super(request);
		this.request = request;
		this.encoding = encoding;
		
	}
	@Override
	public String getParameter(String name)
	{
		String value = request.getParameter(name);
		if (null != value)
		{
			try
			{
				// tomcat默认以ISO8859-1处理GET传来的参数。把tomcat上的值用ISO8859-1获取字节流,再转换成UTF-8字符串
				value = new String(value.getBytes("ISO8859-1"), encoding);
			}
			catch (UnsupportedEncodingException e)
			{
				e.printStackTrace();
			}
		}
		return value;
	}

}
  <filter>
    <display-name>EncodingFilter</display-name>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>cn.xy.filter.EncodingFilter</filter-class>
    <init-param>
      <description></description>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
从您提供的信息来看,在安装或更新PHP及其相关模块的过程中遇到了依赖关系的问题。以下是可能导致该问题的原因及解决方案: ### 原因分析 1. **未满足的依赖项**:某些软件包可能需要其他特定版本的库才能正常运行,而当前系统中缺少这些必要的库。 2. **损坏的部分安装过程**:如果之前的操作中断了(例如断电、网络不稳定等),可能会导致部分文件未能成功下载或配置完成。 3. **APT缓存过期或冲突**:APT管理工具的本地索引与实际可用资源之间可能存在差异。 ### 解决方案 #### 步骤一:刷新APT源并修复破损包 ```bash sudo apt-get update # 更新APT仓库列表 sudo apt --fix-broken install # 尝试自动解决已知损坏的情况 ``` #### 步骤二:手动清理残留数据后再尝试重新安装失败组件 ```bash sudo dpkg --remove --force-remove-reinstreq php8.4-common libapache2-mod-php8.4 libapache2-mod-php php8.4 php8.4-opcache php8.4-cli php php8.4-readline # 强制删除那些状态标记异常但仍存在于系统的旧版残余内容... sudo apt autoremove && sudo apt autoclean # 清理不再使用的依赖以及陈旧的deb归档副本 ``` 接着可以按照官方文档指引逐步添加正确的PPA地址来源,并再次触发完整部署程: ```bash sudo add-apt-repository ppa:ondrej/php # 添加受支持最新的PHP系列存储池 sudo apt-get update # 再次同步新加入的数据集合到本地映射表内 sudo apt-get install php8.4 php8.4-mysql php8.4-curl ...etc # 根据需求选择性的补全缺失的功能块 ``` #### 步骤三:验证环境完整性 检查所有关联服务是否均能正常启动并且相互协作无误。 ```bash php -v # 确认CLI下能够识别所期望加载的核心引擎实例化形式 a2enmod php8.4 # 开启Apache对于指定解释器的支持模式切换选项开关 service apache2 restart # 触发webserver容器整体重启生效修改后的设定规则集应用范围覆盖程度调整情况反馈结果展示环节呈现出来的视觉效果直观感受上有所改进提升空间巨大潜力无限明前景未来可期! ``` --- 如果您完成了上述步骤仍存在问题,则建议进一步查阅日志记录以获得更详细的调试线索路径位置所在之处具体方位明确清晰准确无误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值