(四)Resquest 知识点总结 (来自那些年的笔记)

原创 2018年04月16日 18:40:42

目录


先插点小插曲

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应用;

如果地址是给浏览器用的,这个斜杠就代表主机名;

服务器用 / ; 访问本地硬盘用 \\
但是有些地方,不能用斜杠,只能写相对路径,相对路径是相对谁呢?这个以后会慢慢讲;没那么简单 ;

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/youngyouth/article/details/79954821

JAVASE总结笔记

day11:面向对象(理解) (1)面向对象是相对应面向过程而言的一种编程思想,是基于面向过程的。 (2)思想特点: A:是一种更符合我们思考习惯的思想。 ...
  • sinat_25926481
  • sinat_25926481
  • 2016-07-05 10:34:51
  • 3192

基金从业相关笔记

注意事项     看清题干和选项 规范 报告披露:     年度( 90日,前10名持有人,审计);半年报(60日);季报(15日);重大事件(2),巨额赎回(3) 基金募集流程: ...
  • dananhai381
  • dananhai381
  • 2015-12-20 22:36:49
  • 533

Javase 笔记知识点概要

概要
  • opopopwqwqwq
  • opopopwqwqwq
  • 2016-04-05 23:22:49
  • 1956

超全面 struts2 复习总结笔记

前言What ? 最近怎么开始写后端的博客了? 从去年开始就经常看到别人提“移动开发寒冬”,而年初投简历的时候更是亲身体会,不写3年经验连面试机会都没有,那么没有经验或经验少的人能怎么办呢,从一开就...
  • qq_35064774
  • qq_35064774
  • 2017-03-22 21:02:32
  • 1855

Python核心知识点总结

  • 2016年04月09日 12:01
  • 942KB
  • 下载

oracle数据库基础知识学习笔记

一、SQL语言分类: 1.DDL(数据定义语言):  create(创建)    alter(修改)  drop(删除)------------主要是对表操作。   2.DML(数据操作...
  • u011955534
  • u011955534
  • 2013-11-04 18:52:44
  • 6927

数据结构——线性表——知识点总结

自己看的书,对书上的内容进行总结。 线性表的定义:线性表是具有相同数据类型的n个数据元素的有限序列。n为表长,当n = 0时,为空表。 线性表的公式表示:L = (a1,a2,a3.........
  • misayaaaaa
  • misayaaaaa
  • 2017-05-12 10:02:38
  • 979

JS知识一:系统知识笔记总结

这些是JS的相知识,包括它的基础与语法、函数讲解、运算符、对象方法、各种事件、DOM与XML复杂处理、页面系列方法、正则操作、浏览器与操作系统有关、表单相关操作、JQry框架相关、主流函数等相关知识...
  • u010227447
  • u010227447
  • 2015-07-31 14:24:10
  • 386

PHP知识点学习总结

PHP学习总结
  • liujie19901217
  • liujie19901217
  • 2016-05-19 18:20:02
  • 910

springMVC知识点学习笔记

一、 springMVC开发框架原理图 其中的组件: 1,前端控制器DispatcherServlet(不需要程序员开发) 作用是接收请求,响应结果,相当于转发器 2,处理器映...
  • jaryle
  • jaryle
  • 2016-05-07 20:36:17
  • 2138
收藏助手
不良信息举报
您举报文章:(四)Resquest 知识点总结 (来自那些年的笔记)
举报原因:
原因补充:

(最多只允许输入30个字)