当前位置: 首页 > news >正文

Web:Url 编码 -13

URL编码概述

HTTP协议只支持iso8859-1字符集。

而此字符集中只有英文数字常见符号。

所以HTTP原生是无法传输非iso8859-1字符的。

为了解决这个问题,提出了一种称之为URL编码的解决方案。

URL编解码详解

将非iso8859-1字符,进行转换

先将字符按照指定码表(utf-8)转换为二进制

再将二进制转为十六进制

再在每个十六进制字节前拼接百分号,得到字符的URL编码形式

注意,只对非iso8859-1的字符进行这样的处理

向去掉十六进制字节前的百分号

将十六进制转为二进制

再按照指定码表(utf-8)将二进制转换为字符

 

正常情况下浏览器和服务器会自动进行URL编解码操作,不需要开发人员关心。

但某些开发过程中,开发人员直接操作HTTP协议相关内容(发送Cookie、设置响应头等等),需要开发人员手动编解码处理非iso8859-1数据。

static String

encode(String s, String enc)

          使用指定的编码机制将字符串转换为 application/x-www-form-urlencoded 格式。

static String

decode(String s, String enc)

          使用指定的编码机制对 application/x-www-form-urlencoded 字符串解码。

  • 发送Cookie时用户名需要进行URL编码

if("true".equals(remname)){

    //用户勾选了记住用户名,发送cookie保存用户名

    Cookie remnamec = new Cookie("remnamec", URLEncoder.encode(username,"utf-8"));

    remnamec.setMaxAge(60 * 60 * 24 * 30);//保存30

    remnamec.setPath(request.getContextPath());//访问当前应用路径及其子孙路径都要带回来

    response.addCookie(remnamec);

}

  • 在登录页面URL解码显示用户名

<%

    //Cookie中获取记住的用户名

    Cookie [] cs = request.getCookies();

    Cookie findC = null;

    if(cs!=null){

        for(Cookie c : cs){

            if("remnamec".equals(c.getName())){

                findC = c;

                break;

            }

        }

    }

    String uname = "";

    if(findC!=null){

        String v = findC.getValue();

        uname = URLDecoder.decode(v,"utf-8");

    }

%>

<td><input type="text" name="username" value="<%=uname%>"/></td>

Url编码注意事项

  1. 保留字符的编码:URL 中某些字符具有特殊含义或者不能直接在 URL 中使用,比如空格、问号、井号等。这些字符需要被正确编码以确保 URL 的有效性和可靠性。

  2. 编码规范:URL 编码一般使用 UTF-8 编码,这样可以涵盖广泛的字符集。确保在编码之前明确使用的字符集,以避免因编码不一致而导致的问题。

  3. 路径和查询参数的区别:对于 URL 中的路径部分和查询参数部分,编码的方式有所不同。路径部分的编码与整体 URL 编码相同,而查询参数中的空格、问号等应该使用特定的编码方式(比如空格用 %20 替代)。

  4. 特殊字符的处理:一些字符在 URL 编码时会有不同的表示方法,比如空格可以用 %20+ 表示,根据具体的需求和标准进行选择。

  5. 安全字符的处理:除了保留字符外,大部分 ASCII 字符都是安全的,不需要额外编码。但为了避免混淆和提高可读性,可以对所有字符进行统一的编码处理。

  6. URL 长度限制:某些环境下对 URL 长度有限制,因此应该尽量减少不必要的编码或者尝试使用更短的编码方式。

http://www.lryc.cn/news/409683.html

相关文章:

  • typescript 引用数据类型
  • OpenCV库学习之cv2.Sobel函数
  • 上传Git 仓库 勤勉git (超详细教程)
  • C/C++基础:宏
  • 「豆包Marscode体验官」AI加持的云端IDE——三种方法高效开发前后端聊天交互功能
  • 一文带你掌握C++虚函数·和多态
  • OpenCV 4.10 + OpenCV_contrib配置教程 仅供参考
  • ClkLog:开源用户行为分析框架,让数据分析更轻松
  • Spring源码学习笔记之@Async源码
  • 面试题:如何验证代码的可靠性
  • 前端开发的十字路口,薪的出口会是AI吗?
  • pdf太大怎么压缩大小?这几种压缩方法操作起来很简单!
  • leetcode-148. 排序链表
  • 16 html网页服务和nginx服务
  • C语言:扫雷游戏实现
  • 算法入门:Java实现排序、查找算法
  • 【初阶数据结构篇】顺序表的实现(赋源码)
  • 移动式气象站:便携科技的天气守望者
  • 软件测试必备 - 14个接口与自动化测试练习网站
  • 基于 HTML+ECharts 实现的数据可视化大屏案例(含源码)
  • vardaccico前端私有库
  • 先用先发!小样本故障诊断新思路!Transformer-SVM组合模型多特征分类预测/故障诊断(Matlab)
  • 学习大数据DAY26 简单数据清洗练习和 Shell 脚本中的数据库编程
  • 开发业务(3)——swoole和聊天室入门开发
  • Linux系统服务——【web,http协议,apache服务和nginx服务】(sixteen day)
  • 100、Python 关于时间日期的一些操作
  • 【精通Redis】Redis命令详解
  • 项目经理的开源工具指南:优化您的选择过程
  • 如何防御IP劫持
  • C++绝对值