(四)Resquest 知识点总结 (来自那些年的笔记)
目录
先插点小插曲
URL和URI的区别
URI 是爸爸,URL 是崽 ;
URI
: 统一资源标识符
URL
: 统一资源定位符
URN
: 统一资源名称
例如 : http://www.baidu.com/1.html
URL: http://www.baidu.com/1.html (URL只是URI的具体体现,说明了这个资源在百度那)
URI: /1.html (只是说了,有一个资源在 /1.html 这里,具体在哪,没说)
这个分不清,也没啥;只要记住 URL是URI的一个具体体现,就好了 ;
获取URL、URI
getRequestURL();
getRequestURI();
主要用于过滤器,判断用户访问的资源,是否有权限访问
什么是HttpServletResquest
HttpServletRequest对象
代表客户端的请求,当客户端通过 HTTP协议
访问服务器的时候,HTTP请求头中的所有信息封装在这个对象中,开发人员可以通过这个对象的方法,获取客户端的信息 ;
获取请求头中字段的内容
getName(xxx)
与 getNames(xxx)
; 后者用于字段有重名的时候 ;
getHeader(xxx)
与 getHeaders(xxx)
; 后者用于字段有重名的时候
上述两种方法,异曲同工;s的方法,返回的都是枚举;
获取请求信息的数据
备注:名字中含有Parameter的方法,都是从请求头中获取数据,不带,则是从域中获取数据;
什么是请求信息
例如:https://mp.csdn.net/mdeditor?name=xxx&pass=yyy URL中
?
后面的user=xxx&pass=yyy
就是请求信息 ;其中请求信息中的 user是name属性、xxx是value属性 ;
向服务器提交的数据,必须要带
name属性
,否则数据不会被提交到服务器 ;如何获取请求信息
一共5个方法:
getParameter(name属性)
: 根据name属性获取对应的value ;
getParameterMap()
:返回一个Map集合,注意Map的泛型是<String,String[]>
getParameterValues(name属性)
:返回一个字符串数组,包含指定name的请求信息
getParameterNames()
:返回一个枚举类型,保存所有name属性;
getInputStream ()
:将客户端的请求变为流 ;
将客户机的请求变为一个流返回
getInputStream()
用于客户端上传文件,对于请求信息是一个文件的时候,前面的方法,就不好使了 ;
常用的方法
一些方法的说明:
getQueryString()
: 返回浏览器地址栏中的字符串,就是查询参数,?后面的参数 ;没带查询信息,就返回null ;getRemoteHost()
:如果主机在DNS上面注册过,就返回域名,否则还是返回ip地址 ;
getRemotePort()
:返回的是客户机与服务器通信的端口号,不是服务器的端口号;是客户机的端口号 ;
request乱码问题
客户端在提交数据的时候,网页是什么编码,它就会按照对应的码表对数据进行编码再提交;而网页的编码,是我们在开发网页的时候,进行设置的,这个是可控的 ;
但是提交到服务器的时候,通过request的 getParameter
方法,获取数据的数据的时候,就会出现问题了 ;getParameter
方法是老外设计的,它默认按照iso8859
的码表进行解码;而我们的网页,一般都是中文,按照 UTF-8
码表进行解码的,这样出来就乱码了 ;
因此,我们在调用这个方法之前,需要设置一下方法的编码:setCharacterEncoding(编码)
;
但是,只要说到但是;就是有事发生;上述的方法只对post提交的数据有效,简而言之,就是只有post的方法,改码表才好使;对于get方法,不好使 ;
既然对 get 方法无效,这里就要,使用到了以前学java的时候,用到的方法(老毕讲过了);就是先根据iso8859-1码表,将乱码在编回去,编成二进制数据;然后在自己手动根据对应的码表解码 ;
name = new String(name.getBytes("iso8859-1"),"utf-8") ;
对于超链接
(超链接,都是get提交)中含有中文的,只能通过手动转换编码;
我们也可以改服务器的配置,在服务器的配置文件里面 http标签,可以改服务器的默认码表;或者将一个什么属性置为true,这样setCharacterEncoding(编码)对get也同样有效了 ;但是,并不推荐改服务器配置 ; 实际开发,服务器一般都不让我们修改 ;
request域
常见方法:
setAttribute()
:将值存进域中,以键值对的形式 ;
getAttribute()
:根据键取值;
removeAttribute()
:移除具体的键值;
getAttributeNames()
:不知道,忘记了;都半夜了,还在写博客,2018年4月16日00:10:38;
请求转发的细节
forward
方法用于将请求转发到RequestDispatcher对象封装的资源 ;
如果在调用forward
之前,在servlet程序中写入的部分内容已经被真正地传送到了客户端,forward
方法将抛出 IIegalStateException
异常 ;
备注:在跳转之后,记得return ;?????????????
如果在调用forward
方法之前向servlet引擎的缓冲区(response
)中写入了内容,只要写入到缓冲区中的内容还没有被真正的输出到客户端,forward
方法就可以被正常执行,但是原来写入到response中的内容将被清空。但是,已经写入到HttpServlrtResponse对象中的响应头字段信息保持有效 ;
- Response的数据到底什么时候被封装到响应头中?
response的流,写数据,是先写到response缓冲区中,也就是response对象,只要不刷新缓冲区,这个数据就不会被封装到响应头中
;而刷新动作,通常都是服务器检查流是否关闭,没关闭,就将流关闭,关闭流之前,会刷新缓冲区 ;当然,我们也可以手动刷新;
页面包含
- include方法
requestDispatcher.include
方法用于将requestDispatcher
对象封装的资源内容作为当前响应的一部分包含进来,从而实现可编程的服务器端包含功能。
被包含的servlet程序不能改变响应信息的状态码和响应头,如果它里面存在的这样的语句,这些语句的执行结果将被忽略;
注意
:被包含的页面,不要写上全局架构标签;也就是不要出现html body等标签,这些标签写在包含页面的servlet中;不然浏览器接受到的数据,就不再是一个完整的HTML文档;而是多个 ;
利用referer防盗链
重定向 :response.sendRedirect(地址) ;
//判断是否是盗链:判断referer是否为null,再判断referer是否以自己的网站开头 ;
// 获取浏览器的referer
String referer = request.getHeader("referer");
// 判断是否是盗链
if (referer == null || !referer.startsWith("http://localhost")){
// 是盗链的,送他去首页
response.sendRedirect("/javaWeb/1.html");
return ;
}
Web工程中各类地址的写法
写任何地址都以斜杠</>
开头;
如果地址是给服务器用的,这个斜杠就代表当前web应用;
如果地址是给浏览器用的,这个斜杠就代表主机名;
服务器用 /
; 访问本地硬盘用 \\
但是有些地方,不能用斜杠,只能写相对路径,相对路径是相对谁呢?这个以后会慢慢讲;没那么简单 ;
(四)Resquest 知识点总结 (来自那些年的笔记)的更多相关文章
- (一)HTTP协议的一些知识点(来自那些年的笔记)
目录 http协议1.0.1.1两个版本的区别 访问几次服务器? Http请求行和请求方式详解 可以在超链接上传一些数据 HTTP请求头各个头字段的详解 HTTP响应和响应行状态详解 断点下载 HTT ...
- 第四个知识点 P类复杂问题
第四个知识点 P类复杂问题 原文地址:http://bristolcrypto.blogspot.com/2014/10/52-things-number-4-complexity-class-p.h ...
- 第二十四个知识点:描述一个二进制m组的滑动窗口指数算法
第二十四个知识点:描述一个二进制m组的滑动窗口指数算法 简单回顾一下我们知道的. 大量的密码学算法的大数是基于指数问题的安全性,例如RSA或者DH算法.因此,现代密码学需要大指数模幂算法的有效实现.我 ...
- 第三十四个知识点:描述攻击离散对数问题的baby-step/Giant-step方法
第三十四个知识点:描述攻击离散对数问题的baby-step/Giant-step方法 Baby-step/Giant-step是Dnaiel Shanks为解决DLP问题开发的算法.DLP问题已经是许 ...
- 第四十个知识点 一般来说SPA和DPA的区别是什么
第四十个知识点 一般来说SPA和DPA的区别是什么 原文地址:http://bristolcrypto.blogspot.com/2015/07/52-things-number-40-what-is ...
- 第四十四个知识点:在ECC密码学方案中,描述一些基本的防御方法
第四十四个知识点:在ECC密码学方案中,描述一些基本的防御方法 原文地址:http://bristolcrypto.blogspot.com/2015/08/52-things-number-44-d ...
- jvm系列(四):jvm知识点总结
原文链接:http://www.cnblogs.com/ityouknow/p/6482464.html jvm 总体梳理 jvm体系总体分四大块: 类的加载机制 jvm内存结构 GC算法 垃圾回收 ...
- 《零压力学Python》 之 第四章知识点归纳
第四章(决策和循环)知识点归纳 if condition: indented_statements [ elif condition: Indented_statements] [else: Inde ...
- Swift开发第五篇——四个知识点(Struct Mutable方法&Tuple&autoclosure&Optional Chain)
本篇分三部分: 一.Struct Mutable方法 二.多元组(Tuple) 的使用 三.autoclosure 的使用 四.Optional Chain 的使用 一.Struct Mutable方 ...
随机推荐
- mysql中Numeric类型和int类型的区别
首先记一下,Numeric数字数据只包含 数字.数字数据包括正数.负数.小数.分数和整数 例子如下: Numeric(6,2) Numeric(16,6) Numeric(16,0) 从左到右,第一个 ...
- 十一月百度杯pwnme 详细wp
目录 程序基本信息 程序溢出点 整体思路 exp脚本 成功获得flag 参考 程序基本信息 可以看到开启了栈不可执行和got表不可写保护. 程序溢出点 在函数sub_400AF7中,v8可以读入0x1 ...
- SSM整合小结
基本环境搭建 pom依赖 <dependencies> <!--Junit--> <dependency> <groupId>junit</gro ...
- ML_Homework_Porject_2_LDA_KNN
第二次机器学习的作业完成了,写一下总结. 作业要求:实现用线性判别分析(LDA,LinearDiscriminantAnalysis)的二分类,用KNN比较LDA和PCA在有监督学习下的分类区别. 开 ...
- 在phpstorm中如何对比文件呢?
有两种方法: 在phpstorm中左侧的资源管理器中,按住键盘上的CTRL键,然后鼠标右键,点击菜单中的"Compare Tow Files",就可以了,如下图 在phpstorm ...
- scope.row中属性值展示
<el-table-column align="> <template slot-scope="scope"> {{ scope.$index } ...
- 面试准备4——C++相关知识
指针和引用区别: (1)指针: 指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元: 引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已. 如: int a=1;in ...
- PorterDuffXfermode之PorterDuff.Mode.SRC_IN
package com.loaderman.customviewdemo.view; import android.content.Context; import android.graphics.B ...
- SQL SERVER SELECT语句中加锁选项的详细说明
共享锁(读锁)和排他锁(写锁) 共享锁(S锁):共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句. 如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能 ...
- Elasticsearch(ELK)集群搭建
一.前言 Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储.检索数据:本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据.Elasticsearch也使用 ...