目录


先插点小插曲

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 知识点总结 (来自那些年的笔记)的更多相关文章

  1. (一)HTTP协议的一些知识点(来自那些年的笔记)

    目录 http协议1.0.1.1两个版本的区别 访问几次服务器? Http请求行和请求方式详解 可以在超链接上传一些数据 HTTP请求头各个头字段的详解 HTTP响应和响应行状态详解 断点下载 HTT ...

  2. 第四个知识点 P类复杂问题

    第四个知识点 P类复杂问题 原文地址:http://bristolcrypto.blogspot.com/2014/10/52-things-number-4-complexity-class-p.h ...

  3. 第二十四个知识点:描述一个二进制m组的滑动窗口指数算法

    第二十四个知识点:描述一个二进制m组的滑动窗口指数算法 简单回顾一下我们知道的. 大量的密码学算法的大数是基于指数问题的安全性,例如RSA或者DH算法.因此,现代密码学需要大指数模幂算法的有效实现.我 ...

  4. 第三十四个知识点:描述攻击离散对数问题的baby-step/Giant-step方法

    第三十四个知识点:描述攻击离散对数问题的baby-step/Giant-step方法 Baby-step/Giant-step是Dnaiel Shanks为解决DLP问题开发的算法.DLP问题已经是许 ...

  5. 第四十个知识点 一般来说SPA和DPA的区别是什么

    第四十个知识点 一般来说SPA和DPA的区别是什么 原文地址:http://bristolcrypto.blogspot.com/2015/07/52-things-number-40-what-is ...

  6. 第四十四个知识点:在ECC密码学方案中,描述一些基本的防御方法

    第四十四个知识点:在ECC密码学方案中,描述一些基本的防御方法 原文地址:http://bristolcrypto.blogspot.com/2015/08/52-things-number-44-d ...

  7. jvm系列(四):jvm知识点总结

    原文链接:http://www.cnblogs.com/ityouknow/p/6482464.html jvm 总体梳理 jvm体系总体分四大块: 类的加载机制 jvm内存结构 GC算法 垃圾回收 ...

  8. 《零压力学Python》 之 第四章知识点归纳

    第四章(决策和循环)知识点归纳 if condition: indented_statements [ elif condition: Indented_statements] [else: Inde ...

  9. Swift开发第五篇——四个知识点(Struct Mutable方法&Tuple&autoclosure&Optional Chain)

    本篇分三部分: 一.Struct Mutable方法 二.多元组(Tuple) 的使用 三.autoclosure 的使用 四.Optional Chain 的使用 一.Struct Mutable方 ...

随机推荐

  1. FOI 冬令营 Day6

    目录 T1.堆(heap) 传送门 Code T2.密文(secret) 传送门 Code T3.树(tree) 传送门 Code 别问Day5到底去哪里了,咕咕咕 T1.堆(heap) 传送门 Co ...

  2. [bzoj 3534][Sdoi2014] 重建

    传送门 Description  T国有N个城市,用若干双向道路连接.一对城市之间至多存在一条道路. 在一次洪水之后,一些道路受损无法通行.虽然已经有人开始调查道路的损毁情况,但直到现在几乎没有消息传 ...

  3. 获取Linux系统运行时间

    uptime |sed 's/^.*up//' |sed 's/users.*//g'|awk '{for(i=1;i<NF;++i) printf $i "\t";prin ...

  4. python3编程基础之一:量的表示

    计算机的操作最终表现是数据的操纵,为了表示和存储数据,都需要对数据进行引用,计算机可以直接从内存地址实现一步访问数据,但是编程的人却没有这种能力.就像人可能够不到在高处的氢气球,但是可以拉动邦在氢气球 ...

  5. 迭代器Iterator、for循环遍历、泛型

    java.util.Collection接口 是集合的最顶层的接口,定义了集合共性的方法 接口无法直接创建对象,使用多态的方式创建对象 Collection<集合中的数据类型(泛型)> c ...

  6. ORACLE数据库误删恢复

    一.表的恢复 对误删的表,只要没有使用PURGE永久删除选项,那么从flash back区恢复回来希望是挺大的.一般步骤有: 1.从flash back里查询被删除的表 select * from r ...

  7. AndroidStudio制作Nine-Patch【.9】图片

    使用AndroidStudio制作Nine-Patch[.9]图片,以及为什么要制作Nine-Patch[.9]图片[以聊天气泡为例]   本文链接:https://blog.csdn.net/She ...

  8. String,StringBuilder 和StringBuffer区别

    1. String 和字符串缓冲区的区别是: String 是一个不可变的字符序列 , 而字符串缓冲区是可变的 2. StringBuffer 是一个线程安全的可变字符序列 ; 线程安全对应的效率低 ...

  9. osg qt 三维模型加载

    osg::ref_ptr<osg::Node> OSG_Qt_::operateMatrix() { osg::ref_ptr<osg::Group> group = new ...

  10. IDEA同一项目启动多个实例

    为了验证负载均衡,服务提供者(EurekaClientServiceProviderApplication)需要启动多个实例,当前已启动了一个实例,端口号8762: -- :: --- [ main] ...