Request对象 --web浏览器向web服务端的请求
参考文档:http://blog.csdn.net/u012986057/article/details/50570325
一】Request对象常用方法
1)StringBuffer getRequestURL()
url表示访问web应用的完整路径
2)String getRequestURI()
uri表示访问web应用的资源路径
3)String getQueryString()
queryString表示:?开头的参数;
4)getPathInfo()
pathInfo方法:表示路径之外的信息,如果没有返回null
5)关于IP
取得客户端IP:String getRemoteAddr();
取得服务端IP:String getLocalAddr();
6)关于主机名
取得客户端主机名:String getRemoteHost();
取得服务端主机名:String getLocalName();
7)关于通信端口
取得客户端使用的通信端口:String getRemotePort();
取得服务端使用的通信端口:String getLocalPort();
code:
//获取请求的全路径
String url = request.getRequestURL().toString();
//获取请求的资源路径
String uri = request.getRequestURI();
//获取请求的参数
String query = request.getQueryString();
//获取其它信息
String pathInfo = request.getPathInfo();
System.out.println("-----------------------");
System.out.println("url:" + url);
System.out.println("uri:" + uri);
System.out.println("query:" + query);
System.out.println("pathinfo:" + pathInfo);
System.out.println("-----------------------");
//获取本机信息
System.out.println("IP"+request.getLocalAddr());
System.out.println("主机名"+request.getLocalName());
System.out.println("端口"+request.getLocalPort());
System.out.println("-----------------------");
//获取客户端信息
System.out.println("IP"+request.getRemoteAddr());
System.out.println("主机名"+request.getRemoteHost());
System.out.println("端口"+request.getRemotePort());
System.out.println("-----------------------");
}
/*
输出结果:
-----------------------
url:http://localhost:8080/day07/Demo1
uri:/day07/Demo1
query:name=jack
pathinfo:null
-----------------------
IP127.0.0.1
主机名localhost
端口8080
-----------------------
IP127.0.0.1
主机名127.0.0.1
端口3037
-----------------------
*/
8)取得请求头相关的信息
1》获取单个请求头的唯一值
String getHeader("请求头名称");
2》获取单个请求头的多个值(有些请求头不不止一个值)
Enumeration getHeaders("请求头名称");
3》获取全部请求头的名称
Enumeration getHeaderNames();
9)取得请求体的相关信息
1》当一个参数仅有一个值的时候
String getParamter(String param-name);
2》当一个参数有多个值的时候
String[] getParamterValues(String param-name);
注意:如果是GET的请求方式,如果找不到参数对应的值,就返回一个null
10)取得请求行的类型。
String getMethod();
二】BeanUtils框架 + getParamterNames()的方式
优点:
1》无需理会参数的类型,个数,Beanutils框架能自动将String参数设置到JavaBean对象中
2》String <-> 8种基本类型自动转换,非8种基本类型可以注册转换器
3》String和String[]类型的参数自动感知装配
code:
Enumeration<String> paramNames = request.getParameterNames();
User user = new User();
BeanUtils beanUtils = new BeanUtils();
while(paramNames.hasMoreElements()) {
String key = paramNames.nextElement();
String[] value = request.getParameterValues(key);
try {
beanUtils.setProperty(user, key, value);
} catch (Exception e) {
e.printStackTrace();
}
}
三】request常见应用 -----防盗链(下载文件,必须从指定网站进入,否则不允许下载文件)
原理:判断某个请求来自于哪个网页,使用referer请求头
code:
//取得浏览器来自于何方
String referer = request.getHeader("referer");
//判段
if(referer!=null && referer.equals("http://localhost/day07/index.html")){
//转发到download.html页面
this
.getServletContext()
.getRequestDispatcher("/down.html")
.forward(request,response);
}else{
//转发到ad.html页面
this
.getServletContext()
.getRequestDispatcher("/ad.html")
.forward(request,response);
}
}
注意:在获取用户名等信息的时候必须要加一句判断
if(username != null || username.trim().length()>0)
四】获取表单提取的信息
重点方法:
void setCharacterEncoding(String env);//将请求体的编码方式进行更改
原理:
利用getparameter()和getparameterNames()方法
五】POST方式请求体中参数的中文乱码
原因:
1》POST方式的表单请求参数放在请求体中
2》浏览器的默认编码方式是utf-8,与tomcat中Request对象的默认的编码方式是ISO8859-1不一样
解决办法:
通过void setCharacterEncoding(String env);方法设置response对象在对中文字符进行编码和解码的时候使用指定的编码方式
注意:该方法只能解决请求体中的乱码问题。其它部分不能解决。
code:
六】GET方式请求参数的中文乱码问题
原因:
1》POST方式的表单请求参数放在请求行中
2》浏览器的默认编码方式是utf-8,与tomcat中Request对象的默认的编码方式是ISO8859-1不一样
解决办法:
客户端:进行中文编码,防止服务端进行解码的时候产生不可逆的错误
1》使用URLEncoder类的encode()方法
2》在客户端将中文字符进行编码,再将已经经过编码的数据发送给服务器
思考:
先进行编码的原因:
1》中文字符通过ISO8859-1直接解码会导致不可逆的解码错误
2》而先经过编码后的中文字符变成了ISO8859-1编码和解码支持的字符。
3》所以需要先进行一次编码。
服务器:
1》当服务器收到数据的时候,先要经过一次解码,此解码方式采用ISO8859-1(相当于再包装)
2》所以要获取到中文字符,需要先对外面一层通过服务器自动解码产生的数据进行一次编码
3》最后再对里面的一层进行一次和客户端一样方式的解码
code:
jsp页面:
<a href="/day07/DemoServlet?username=<%=URLEncoder.encode("小强", "utf-8") %>">GET方式传递中文</a>
Servlet:
String isoUsername = request.getParameter("username");
byte[] buf = isoUsername.getBytes("ISO8859-1");
String username = new String(buf, "utf-8");
System.out.println("username = " + username);
补充:
405状态码:如果客户端本身的请求是Get请求,但是在Servlet类中却为提供对应的doGet()方法时,
Post也是出现此种错误。
总结:
1》转发是通过RequestDispatcher对象方法forward(request,response)方法完成。
获取RequestDispatcher的两个方法:
this.getServletContext().getRequestDispatcher();
request.getRequestDispatcher();
2》forward()方法 的输出,如果是输出到缓冲区,再转发到其它Servlet,那么原缓冲区的数据忽略不计;
forward()方法之前的输出,如果真正输出到浏览器,再转发到其它Servlet,则转发到的Servlet的输出便忽略不计了。
但是,已经写入到了response对象中的响应头还是保留,因为响应头的内容并不属于流的内容,不需要缓冲。
转载于:https://www.cnblogs.com/lhwblog/p/6670311.html
Request对象 --web浏览器向web服务端的请求相关推荐
- SignalR 实现web浏览器客户端与服务端的推送功能
SignalR 是一个集成的客户端与服务器库,基于浏览器的客户端和基于 ASP.NET 的服务器组件可以借助它来进行双向多步对话. 换句话说,该对话可不受限制地进行单个无状态请求/响应数据交换:它将继 ...
- JSON Web Token (JWT),服务端信息传输安全解决方案
转载自 JSON Web Token (JWT),服务端信息传输安全解决方案 JWT介绍 JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑独立的基于JSON对 ...
- 浏览器及时感知服务端数据变化的方式
需求 在公司,有一个需求,是浏览器实时获取服务端数据变化,然后根据变化做相应的动作.需求场景如下:手机端扫描二维码,然后获取待取件订单列表,点击取件,进行取件,同时远端打印机打印出取件小票. 技术难点 ...
- android service前台服务器,Android网络前台向服务端页面请求数据
这是一个android前台向服务端网站请求少量数据的小例子. 首先设计好服务端,再来写安卓前端. 一:服务端 新建动态网站,在java包下新建一个类继承HttpServlet父类,重写doGet()方 ...
- org.apache.dubbo 2.7.7 服务端处理请求及时间轮(失败重试)
本文主要针对 dubbo-spring-boot-starter 2.7.7版本, 对应的 org.apache.dubbo 2.7.7 版本的源码. 本文主要从以下几个点来分析: 服务端处理请求 ...
- 3.菜鸟教你一步一步开发 web service 之 axis 服务端创建
转自:https://blog.csdn.net/shfqbluestone/article/details/37610601 第一步,新建一个工程,如图: 选 Java 写一个工程名,选择好工程路径 ...
- request对象_java学习之web基础(2):Request
request ServletRequest --(继承)--> HttpServletRequest --(实现)--> org.apache.catalina.connector.Re ...
- [Axis2与Eclipse整合开发Web Service系列之三] 服务端返回值
前言 在前面的三篇中 [Axis2与Eclipse整合开发Web Service系列之一] 生成Web Service Client(将WSDl 转化成 Java代码) [Axis2与Eclipse整 ...
- 传统Web应用案例(采用服务端渲染)
一.准备静态页面 https://www.expressjs.com.cn/resources/middleware/errorhandler.html 静态页面: https://github.co ...
最新文章
- CentOS_7 MongoDb安装使用
- 我与 美国作家 21天精通C++ 作者 Rao的对话:
- RHEL7切换Firewall为iptables
- 服务器e5系列和e5v4系列,“芯”力量:四款至强E5 v4双路服务器横评
- jsp接收 input文本输入框中,无法正确显示单引号和双引号的问题
- mysql 恢复root用户_mysql误删root用户恢复方案
- CentOS上安装Docker (图解)
- 网络游戏:为什么失败
- 万能电商Banner素材模板,一切产品为王
- 获取当前日期是本年的第几周java与mysql获取值不一致
- Determining IP information for eth0...failed
- python中max函数用法_python奇技淫巧——max/min函数的用法
- cmake构建NNIE工程
- Spring核心——MessageSource实现国际化
- 微信机器人,微信聊天机器人搭建教程附源代码
- 费曼先生 找数学家“麻烦”
- matlab误码率理论,PSK理论误码率与实际误码率MATLAB仿真程序
- 欧几里德结构数据(Euclidean Structure Data) 以及非欧几里德结构数据(Non-Euclidean Structure Data)
- Boolean初始值是什么?
- 山沟沟里的技术脱贫:阿里工程师助平武蜂农物联网养蜂
热门文章
- JDBC连接SQLserver2008,使用jdk为1.7 [个人新浪微博]
- Android 开发入门学习
- chapter_2 索引优先队列
- __FUNCTION__, __LINE__ 有助于debug的宏定义
- 这样的“牛”人,绝佳客户最好能多碰上上几个是我们当程序员的好运
- iOS用户设计指南 - 平台特征
- 国际:什么是程序员的优秀品质
- android studio 首字母提示 设置 大小写敏感
- 安卓开发小知识 - 3
- 第十三周项目二-动物这样叫(1)