地址栏(get方式)传值不能不说的秘密-当传递的值中含某些特殊字符的情况

地址栏(get方式)传值不能不说的秘密-当传递的值中含某些特殊字符的情况

HTTP标准的两种请求方式:Post和Get,关于这两种请求方式的区别相关资料云集,这里不做阐述。然而,你是否注意到:
我们通过get方式从浏览器的地址栏传递数据给服务器,当参数的值中含有某些特殊转义字符的时候,没经过些许处理将得不到预期的结果。第一种解决方案不解释也能明白,现在解释下第二种方法的处理:
JavaScript escape() 函数的功能是把其中某些字符替换成了十六进制的转义序列。该方法不会对ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。其他所有的字符都会被转义序列替换。具体参考:http://www.w3school.com.cn/js/jsref_escape.asp.
这样来就不会出现自动截断或者其他意想不到的效果。

例如:
当我们的请求的url为:
http:
// localhost:8080/index.jsp?parameter=kalman03#kalman#1
或许你预期在服务器端获得的parameter的结果为kalman03#kalman# 1 ,错!!!实际上得到parameter的值为kalman03。
这究竟是为什么呢?
原因:
parameter的值含有特殊字符#,浏览器自动截断#字符和其后面的值,这样得到的值就为kalman03。
推广:
当参数值中含有特殊字符 
?!= ()# %&  的时候,获得的值同样也会出现与预期结果不一致的情况。
解决方案:
方法1:通过post方式传递数据;
方法2:对参数进行一次编码parameter
= escape(parameter);

 

### Java Web 应用中 URL 参数传递与 JavaBean 接收 在构建基于Java EE平台的应用程序时,通常会利用现有的Web服务器来处理TCP连接以及HTTP协议解析等工作[^1]。对于通过URL传递参数并在后台使用JavaBean接收的需求,主要涉及两个方面的工作:一是前端如何构造带有查询字符串的URL;二是后端怎样配置Servlet或者Spring MVC控制器以映射请求并将参数绑定至JavaBean。 #### 前端构造带参数URL 当希望向服务端发送数据而不采用表单提交的方式时,可以通过修改链接中的查询部分来附加键对形式的数据。例如: ``` http://example.com/app?paramName=paramValue ``` 这里`paramName`即为参数名而`paramValue`则是对应的。多个参数之间需用`&`分隔开。 #### 后台配置 Servlet 或者 Spring 控制器 ##### 使用原生Servlet API 如果项目直接依赖于Servlet技术,则可以在doGet/doPost方法内部获取HttpServletRequest对象,并从中读取GET/POST方式来的参数。下面是一个简单的例子展示如何创建一个能够接受名为`username`参数的Servlet类: ```java protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); } ``` 此时若想进一步简化开发流程,可考虑引入框架支持自动完成从请求到实体之间的转换过程。 ##### 利用Spring MVC 实现更优雅的解决方案 相比于统的Servlet编程模型,借助Spring Framework下的MVC模块可以让开发者更加专注于业务逻辑本身而非繁琐的基础架构细节。具体来说就是定义处理器函数签名时声明形参列表里包目标类型的实例作为入参之一即可触发内置机制尝试填充该对象属性的过程——这便是所谓的“命令模式”。 假设存在如下所示的一个POJO(Plain Old Java Object),用于表示用户登录所需的信息结构体: ```java public class UserLoginForm { private String email; public String getEmail() {return this.email;} public void setEmail(String email) {this.email = email;} // ... other getters and setters ... } ``` 那么相应的控制层组件应当如此编码: ```java @Controller @RequestMapping("/login") public class LoginController { @RequestMapping(method = RequestMethod.GET) public ModelAndView showForm(UserLoginForm form){ return new ModelAndView("login", "form", form); } @RequestMapping(method = RequestMethod.POST) public String processSubmit(@ModelAttribute("user") UserLoginForm user, BindingResult result) { if (result.hasErrors()) { return "error"; } // handle valid submission... return "success"; } } ``` 上述代码片段展示了如何让Spring容器负责将来自客户端浏览器地址栏内的输入项赋给`UserLoginForm`实例各字段的操作。得注意的是,除了基本类型外还允许指定复杂对象作为方法参数的一部分参与进来,只要确保它们遵循一定的命名约定就能顺利达成预期效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值