




已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
IT资讯交流网WWW.IT315.ORG,张孝祥IT课堂深入体验JavaWeb开发内幕,IT资讯交流网WWW.IT315.ORG,第6讲HttpServletRequest的应用,HttpServletRequest简介获取请求行的相关信息获取网络连接信息获取请求头信息浏览器传递参数信息的细节获取请求参数获取请求消息的实体内容利用请求域属性传递信息请求参数的中文读取问题,IT资讯交流网WWW.IT315.ORG,HttpServletRequest简介,WEB客户端发送给WEB服务器的HTTP请求消息分为三个部分:请求行请求消息头消息正文(也叫实体内容)ServletAPI中定义的ServletRequest接口类用于封装请求消息。HttpServletRequest是专用于HTTP协议的ServletRequest子接口,它用于封装HTTP请求消息。在service()方法内部调用HttpServletRequest对象的各种方法来获取请求消息。,IT资讯交流网WWW.IT315.ORG,获取请求行的相关信息,HTTP请求消息的请求行包括请求方式、资源路径和HTTP协议版本:GET/it315/servlet/RequestURI?param1=awhile(headerNames.hasMoreElements()StringheaderName=(String)headerNames.nextElement();out.print(headerName+:+request.getHeader(headerName)+);/*如果要考虑同一个请求头名可能出现多次,那么应该用下面的代码段代替上面一行程序代码*/*Enumerationvalues=request.getHeaders(headerName);while(values.hasMoreElements()out.print(headerName+:+(String)values.nextElement()+);*/,动手体验:获取请求消息中的所有请求头信息,IT资讯交流网WWW.IT315.ORG,利用Referer请求头阻止“盗链”,Stringreferrer=request.getHeader(referer);StringsitePart=http:/+request.getServerName();if(referrer!=null,动手体验:利用Referer请求头阻止“盗链”,IT资讯交流网WWW.IT315.ORG,利用Referer请求头隐藏JavaScript源码,Stringreferrer=request.getHeader(referer);StringsitePart=http:/+request.getServerName();if(referrer!=null,动手体验:利用Referer请求头隐藏JavaScript源码,IT资讯交流网WWW.IT315.ORG,客户端身份认证,当客户端访问WEB服务器时,WEB服务器可以发送401(Unauthorized)响应状态码和WWW-Authenticate响应头来要求客户端进行身份认证。客户端可以再次发出请求,并通过Authorization请求头来提供用户名和密码信息。服务器对Authorization请求头中的身份信息进行认证,并根据认证结果来决定是否提供服务。WWW-Authenticate响应头中可以指定两种认证方式:BASIC和DIGEST。对于BASIC验证方式,客户端需要把用冒号(:)分隔的用户名和密码进行Base64编码之后传送给WEB服务器。举例:用户名为“zxx”和密码为“123456”的认证头信息Authorization:Basicenh4OjEyMzQ1Ng=,IT资讯交流网WWW.IT315.ORG,BASE64编码,BASE64编码规则将一组连续的字节数据按6个bit位进行分组,然后对每组数据用一个ASCII字符来表示。6个bit位最多能表示2664个数值,因此可以使用64个ASCII字符来对应这64个数值,这64个ASCII字符为:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/计算0110,00010110,00100110,0011的BASE64编码0110,00010110,00100110,00110110,0001,0110,0010,0110,00110110,0001,0110,0010,0110,0011241022109103510241022109103510YWJjBASE64编码要求把3个8位字节(即24个bit)的数据转化为4个6位字节(也是24个bit)的数据,如果原来的8位字节数据的字节个数不能被3整除,那么如何对余下的1个或2个8位字节数据进行处理呢?仍然按6个bit位对剩余的字节进行分组,在最后不够6个bit位的内容后面添加几个为0的bit位来凑成6个bit位,例如,0110,00010110,0001,0000如果编码后的整个结果文本的字符个数不是4的整数倍,那么需要在最后填充“=”字符来凑成4的倍数。经过BASE64编码后的结果所占用的字节个数大约是原始内容的4/3倍,计算公式为:编码后的大小=(原始大小+2)/3)*4。,IT资讯交流网WWW.IT315.ORG,客户端身份认证实践,SUN公司在JDK的核心包中提供两个分别用于进行BASE64编码和解码的类:sun.misc.BASE64Encoder和sun.misc.BASE64DecoderBASE64Decoderdecoder=newBASE64Decoder();bytedecodedBytes=decoder.decodeBuffer(encodedAuth.substring(6);StringdecodedInfo=newString(decodedBytes);intidx=decodedInfo.indexOf(:);Stringuser=decodedInfo.substring(0,idx);Stringpassword=decodedInfo.substring(idx+1);,动手体验:了解BASIC验证的全部过程,StringencodedAuth=request.getHeader(Authorization);/要求客户端发送身份认证信息,并且只能是BASIC认证方式中if(encodedAuth=null|!encodedAuth.toUpperCase().startsWith(BASIC)response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);response.setHeader(WWW-Authenticate,BASICrealm=it315);/当用户单击登录框中的“取消”按钮时,将输出下面的内容out.println(没有传递用户身份!);return;,IT资讯交流网WWW.IT315.ORG,浏览器传递参数信息的细节,使用GET方式传递参数使用POST方式传递参数提交、重置、普通按钮如何传送参数单行与多行文本输入框如何传送参数单选按钮与复选框如何传送参数隐藏表单字段与图像字段如何传送参数列表框如何传送参数使用Javascript防止重复提交表单,IT资讯交流网WWW.IT315.ORG,使用GET方式传递参数,在浏览器地址栏中输入某个URL地址或单击网页上的一个超链接时,浏览器发出的HTTP请求消息的请求方式为GET。如果网页中的表单元素的method属性被设置为了“GET”,浏览器提交这个FORM表单时生成的HTTP请求消息的请求方式也为GET。使用GET请求方式给WEB服务器传递参数的格式:/counter.jsp?name=zhangsanfunctioncheckPost()if(!isCommitted)isCommitted=true;returntrue;elsealert(不能重复提交表单);returnfalse;.,动手体验:使用Javascript防止重复表单提交,IT资讯交流网WWW.IT315.ORG,获取请求参数,getParameter方法getParameterValues方法getParameterNames方法getParameterMap方法,IT资讯交流网WWW.IT315.ORG,获取请求参数的编程实例,EnumerationparamNames=request.getParameterNames();while(paramNames.hasMoreElements()StringparamName=(String)paramNames.nextElement();out.print(paramName+:+request.getParameter(paramName)+);/*如果要考虑同一个请求头名可能出现多次,那么应该用下面的代码段代替上面一行程序代码*/*StringparamValues=request.getParameterValues(paramName);/良好的编程习惯,在使用对象和数组之前先判断其是否为nullif(paramValues!=null)for(inti=0;i);*/,动手体验:获取请求消息中的所有参数,IT资讯交流网WWW.IT315.ORG,一次性处理多个列表项的实用案例,动手体验:一次性处理多个列表项,IT资讯交流网WWW.IT315.ORG,单选列表框的处理经验,前台的网页代码:-不选-javac+jsp,服务器端的程序处理代码:Stringsubject=request.getParameter(subject);/如果没有选择或是选择了“不选-”项if(subject=null|.equals(subject)/这里是用户没有选择时的处理语句else/这里是用户进行了选择时的处理语句,IT资讯交流网WWW.IT315.ORG,获取请求消息的实体内容,getInputStream与getReader方法分析文件上传的请求消息结构,IT资讯交流网WWW.IT315.ORG,getInputStream与getReader方法,getInputStream方法用于返回的一个代表实体内容的输入流对象,其类型为javax.servlet.ServletInputStream。getReader方法用于返回的一个代表实体内容的BufferedReader对象,返回的BufferedReader对象将实体内容中的字节数据按照请求消息中指定的字符集编码转换成文本字符串。在调用getReader方法之前,可以调用ServletRequest的setCharacterEncoding方法指定其返回的BufferedReader对象所使用的字符集编码。,多学两招:使用ServletInputStream对象读取文本格式的实体内容,IT资讯交流网WWW.IT315.ORG,分析文件上传的请求消息结构,ServletInputStreamsis=request.getInputStream();StringfilePath=getServletContext().getRealPath(/body.out);FileOutputStreamfos=newFileOutputStream(filePath);bytebuf=newbyte1024;intlen=sis.read(buf,0,1024);while(len!=-1)fos.write(buf,0,len);len=sis.read(buf,0,1024);fos.close();sis.close();,动手体验:分析文件上传的请求消息结构,IT资讯交流网WWW.IT315.ORG,文件上传的请求消息,IT资讯交流网WWW.IT315.ORG,读取实体内容时可能出错的一种代码,ServletInputStreamsis=request.getInputStream();StringfilePath=getServletContext().getRealPath(/body.out);FileOutputStreamfos=newFileOutputStream(filePath);inttotal_len=request.getContentLength();bytebuf=newbytetotal_len;for(intread_len=0,reading_len=0;read_lentotal_len;read_len+=reading_len)reading_len=sis.read(buf,read_len,total_len-read_len);fos.write(buf,0,total_len);fos.close();sis.close();,IT资讯交流网WWW.IT315.ORG,请求域属性,存储在ServletRequest对象中的对象称之为请求域属性,属于同一个请求的多个处理模块之间可以通过请求域属性来传递对象数据。与请求域属性相关的方法:setAttribute方法getAttribute方法removeAttribute方法getAttributeNames方法,IT资讯交流网WWW.IT315.ORG,请求域属性的典型应用,MVC设计模式将一次请求的响应过程分成三个功能模块(一般称之为层)来协同完成,这三个模块分别是Model(模型层)、View(视图层)、Controller(控制层)。Model是可作为JavaBean使用的业务对象;View是负责创建显示界面的JSP页面;Controller通常是一个接收用户请求的Servlet程序,它根据请求创建相应的model对象和调用model对象的业务方法,最后再选择一个View去创建网页文档内容并回送给客户端。Controller调用RequestDispatcher.forward方法将请求转发给作为View的JSP页面,同时将Model对象作为请求域属性传递过去,作为View的JSP页面再从请求域中检索出Model对象。,IT资讯交流网WWW.IT315.ORG,请求域属性的编程实例,采用MVC设计模式实现一个简单示例程序:UserRegister.html是一个包含有让用户填写注册信息的FORM表单的HTML页面;User.java是一个代表用户注册信息的普通Java类;ActionServlet.java是一个用于处理FORM表单信息的Servlet程序,它根据表单提交的信息创建一个User类的实例对象,并把这个User实例对象存储到请求域中,然后将请求转发给另外一个用于显示用户注册信息的Servlet程序;JspResultServlet.java是一个用于显示用户注册信息的Servlet程序,JspResultServlet从请求域中取出User实例对象,并显示出这个User实例对象的信息。,动手体验:了解请求域属性的作用,多想一想:比较请求域属性与URL参数的作用,IT资讯交流网WWW.IT315.ORG,请求参数的中文读取问题,了解中文字符的URL编码浏览器怎样进行URL编码getCharacterEncoding方法setCharacterEncoding方法getParameter方法的中文问题一些参考经验,IT资讯交流网WWW.IT315.ORG,了解中文字符的URL编码,对Java中的某个字符串进行URL编码,其实是在对它的某种字符集编码(非Unicode码)数据进行URL编码,而Java中的字符串是以Unicode字符集编码存在的,所以,在对Java中的字符串进行URL编码时,必须指定是对这个字符串的哪种非Unicode的字符集编码进行URL编码。JDK的包中有两个类:URLEncoder和URLDecoder,URLEncoder类中定义了一个encode静态方法来完成URL编码,URLDecoder类中定义了一个decode静态方法来完成URL解码。publicstaticStringencode(Strings,Stringenc)throwsUnsupportedEncodingExceptionpublicstaticStringdecode(Strings,Stringenc)throwsUnsupportedEncodingException,动手体验:了解中文字符的URL编码和解码,IT资讯交流网WWW.IT315.ORG,浏览器怎样进行URL编码,浏览器对FORM表单中输入的中文字符都会进行URL编码后再传送给WEB服务器。对于页面中的FORM表单中输入的内容,浏览器将按照当前显示页面时所采用的字符集编码来进行URL编码。,动手体验:了解浏览器怎样对FORM表单进行URL编码,IT资讯交流网WWW.IT315.ORG,与请求参数的字符集编码相关的方法,getCharacterEncoding方法setCharacterEncoding方法,IT资讯交流网WWW.IT315.ORG,getParameter方法的中文问题,getParameter等方法在读取的参数信息时,需要进行URL解码。对于HTTP请求消息的请求行中的URL地址后的参数,getParameter等方法进行URL解码时所采用的字符集编码在Servlet规范中没有明确规定Tomcat中的ServletRequest对象的getParameter等方法默认采用ISO8859-1字符集编码进行URL解码,因此无法返回正确的中文参数信息。对于POST方式下的“application/x-www-form-urlencoded”编码格式的实体内容,getParameter等方法以ServletRequest对象的getCharacterEncoding()方法返回的字符集编码对其进行URL解码。getCharacterEncoding()方法的返回值通常为null,对于这种情况,ServletRequest对象的getParameter等方法将使用默认的ISO8859-1字符集编码对实体内容中的参数进行URL解码,因此也将无法返回正确的中文参数信息。ServletRequest接口中定义了一个setCharacterEncoding方法来设置请求消息中的实体内容的字符集编码名称,getParameter方法将以该方法设置的字符集编码对实体内容进行URL解码。setCharacterEncoding方法设置的是请求消息中的实体内容的字符集编码名称,它只影响getParameter方法对POST方式下的“application/x-www-form-urlencoded”编码格式的实体内容进行URL解码的结果,而不能影响getParameter方法对HTTP请求消息的请求行中的URL地址后的参数进行URL解码的结果。,IT资讯交流网WWW.IT315.ORG,getParameter方法的中文问题实践,要点:解决getParameter方法读取POST方式下的“application/x-www-form-urlencoded”编码格式的实体内容中的参数时的乱码。解决getParameter方法读取URL地址后面的参数时的乱码。了解Servlet之间进行调用时传递参数的乱码问题。,动手体验:了解使用getParameter方法读取请求参数时的中文乱码问题,IT资讯交流网WWW.IT315.ORG,字符乱码与解决办法的原理分析,IT资讯交流网WWW.IT315.ORG,一些参考经验,如果提交FORM表单的页面与处理表单请求的Servlet程序都是由同一个人或同一个项目组开发的,那么只要在处理表单提交的Servlet程序中将传递给setCharacterEncoding方法的字符集编码设置为该表单所在页面的字符集编码即可。如果Servlet程序可以接收来自多个其他站点的FORM表单提交的数据,而每个其他站点的页面所采用的字符集编码可能各不一样,要想让Servlet程序知道FORM表单内容的字符集编码,可以在FORM表单中增加一个隐藏字段来传递当前FORM内容的字符集编码名称。只要超链接、FORM表单的action属性设置、请求转发和重定向的URL等任何一种请求路径中要包含参数,就必须对参数部分进行URL编码。对参数进行URL编码时所选择的字符集编码应尽量与当前页面的字符集编码保持一致,也可以用一个参数来指定URL编码内容的字符集编码名称。所有标准的浏览器和客户机终端都支持UTF-8编码,如果WEB服务器要能兼容处理各个国家和地区版本的浏览器所传递的FORM表单信息,网页文档应当使用UTF-8编码格式。在编写应用程序时应该注意一些隐性的字符编码错误。有些程序在输出时有编码转换错误,在读取输入时返回的字符串也有转换错误,当该程序输出它所读取到的有问题的字符串时,显示的结果可能是正常的中文字符。,IT资讯交流网WWW.IT315.ORG,思考与实践(1),
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 青岛旅游元宇宙项目可行性研究报告
- 钢水增氮技术项目可行性研究报告
- 防汛知识培训粮库课件
- 智慧城管数某省市管理系统建设方案
- 人教版(2024)八年级上册Unit 2 Home Sweet Home Section A (1a-pronunciation)课件(内嵌视频)
- 行业标准合作协议
- 金融证券行业发展前景预测
- 人力资源代理合同6篇
- 合同范本之牛羊肉销售合同7篇
- HR数据分析应用-洞察及研究
- 全球低空经济2025年技术规范与实施白皮书
- 贵阳市2026届高三年级摸底考试英语试卷(含答案)
- 2025年城市燃气储气罐采购安装与运营维护服务合同范本
- 病房消毒及卫生管理课件
- 2025年国家公务员考录《行测》真题及参考答案
- 2025年城市管理笔试高频考点
- 艾滋病科普宣传课件
- 水泵房巡检流程培训课件
- 吊装专项施工方案
- 基本药物制度补助资金管理办法
- 无人机培训招生宣讲
评论
0/150
提交评论