一、GET & POST
相同
都是HTTP请求方式
差异
1、安全性
get 请求数据会以键值对的形式被 “?” 或 “&” 符号键隔开,且直接追加URL显示在地址栏,安全性差,还有可能造成Cross-site request frogery攻击,同时URL编码格式采用ASCII码,而非uniclde,即所有的非ASCII字符都要编码之后再传输;
post 请求数据不直接展示在地址栏,会把请求的数据放置在HTTP请求包的包体中,但也不是绝对安全,在浏览器调试工具 - 网络 仍可以看见解析度请求数据
2、传输大小
在HTTP规范中,没有对URL的长度和传输的数据大小进行限制。
但是在实际开发过程中,对于 get 请求,特定的浏览器和服务器对URL的长度有限制
post 请求由于不是URL传值,理论上不会受限,但实际各服务器会规定对其提交的数据大小进行限制,Apache、IIS都有各自的配置。
补充
1) 设置编码格式
get:1、String s=new String(变量名.getBytes("ISO-8859-1"),"UTF-8");
( 不常用 )
2、在 tomcat8.0 后自动设置 \conf\server.xml 的 <Connection / > 标签 URIEncoding 属性
post:在接收数据前,设置req.setCharacterEncoding("utf-8");
【tips】 后续通过过滤器(Filter)设置所有请求的编码格式,在servlet执行前后都会进行过滤
2) 数据提交方式
get:表单提交 / <a>标签 / 地址栏直接拼接 / JS
post:表单提交
二、转发 (getRequestDispatcher) & 重定向 (setRedirect)
转发
- 由request 请求对象调用
- 一次请求,一次响应,数据会保存
- 可以获取到
request.setAttribute()
的数据 - 地址栏不会改变,仍是发生请求的地址(若是表单提交,会变成action属性值)
重定向
- 由response 响应调用
- 两次请求,两次响应,所以数据会丢失,即重定向的页面不会接收到原先页面传递的数据。采用JS的 location.href 强制跳转页面的方式传输数据,同样会丢失数据
- 无法获取到
request.setAttribute()
的数据 - 地址栏改变,为跳转到的页面地址
三、补充
参考:getParameter和getAttribute区别(超详细分析)
两者都是 request 对象关于数据获取的方法,区别在于:
getParameter()
- 得到的是浏览器请求给服务器端的数据,像表单提交,按钮点击等
- 不能获取 req.setAttribute() 数据(且没有setParameter() 方法)
- 数据类型永远为字符串
getAttribute()
- 得到的是服务器内部传输的数据,像跳转页面等
- 可获取 req.setAttribute() 的数据
- 数据类型可以是任意类型