09 Request/Response
|
HttpServletResponse
* 响应行
* 状态码
* void setStatus(int sc)
* 响应头
* 一般情况下,一个key对应一个value,特殊一个key对应多个value
* void setHeader(String name, String value) (经常使用的)
* void setIntHeader(String name, int value)
* void setDateHeader(String name, long date) // 毫秒数
setHeader("aa","bb");
setHeader("aa","cc");
结果:aa:cc
* void addHeader(String name, String value)
* void addIntHeader(String name, int value)
* void addDateHeader(String name, long date)
addHeader("aa","bb");
addHeader("aa","cc");
结果:aa:bb,cc
* 响应体
* ServletOutputStream getOutputStream() 字节
* PrintWriter getWriter() 字符
* 状态码:302
* 作用?
* 编写html,完成登陆的操作。(用户名和密码)
* 提交到后台Servlet,获取用户输入的数据。
* 判断用户名和密码都是admin,登陆成功,如果有一个不是,重定向登陆页面。
response.setStatus(302);
response.setHeader("location", "/day09/response/demo1/login.html");
*** void sendRedirect(String location) :等于前面两句话,一样可以完成重定向的操作。
* 读秒操作
* response.setHeader("refresh","5;url=/...");
// 向页面输出内容
response.getWriter().write("<h1>页面将在5秒后跳转</h1>");
// 设置头信息
response.setHeader("refresh", "5;url=/day09/response/demo1/login.html");
var x = 5;
function run(){
var span = document.getElementById("spanId");
span.innerHTML = x;
x--;
setTimeout("run()", 1000);
}
* 页面数据是一直变化,网银。
* 三个响应头
* Cache-Control no-cache
* Expires 时间
* Pragma no-cache
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", -1);
* 向页面输出中文
* 字节:getOutputStream();
使用字节流输出中文
* * 把中文输出到页面上,是否乱码呢?
* * 后台子节点的编码和浏览器默认打开文件的编码不一致。
* * 解决
* * 设置浏览器默认打开文件时的编码
* * response.setHeader("Content-Type", "text/html;charset=UTF-8");
* * 获取字节数组是编码和打开文件时一致
* os.write("中文".getBytes("UTF-8"));
* 字符:getWriter();
字符输出中文
* * 使用字符,一定乱码。
* * 缓冲区,自己的编码,ISO-8859-1
* * 设置缓冲区的编码
* * response.setCharacterEncoding("UTF-8");
* * 设置浏览器默认打开文件的编码
* * response.setHeader("Content-Type","text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type", "text/html;charset=UTF-8");
// 等于上面两句
response.setContentType("text/html;charset=UTF-8");
* 总结:
* 始终保持编码一致就ok了。
* 字节:
* 设置浏览器默认打开文件的编码。
* response.setHeader("Content-Type","text/html;charset=UTF-8");
* 获取字节数组设置编码
* os.write("中文".getBytes("UTF-8"));
* 字符:
* 设置浏览器默认打开文件的编码。
* response.setHeader("Content-Type","text/html;charset=UTF-8");
* 设置字符缓冲区的编码
* response.setCharacterEncoding("UTF-8");
错误的:
response.getWriter().write("abc");
response.getOutputStream().write("css".getBytes());
* 超链接
* 自己文件下载的代码
* 设置头信息
* response.setHeader("Content-Disposition","attachment;filename=文件的名称.扩展名");
* 准备一个文件
// 获取图片的绝对磁盘路径
String path = getServletContext().getRealPath("/img/外国美女.jpg");
// C:\apache-tomcat-6.0.14\webapps\day09\img\girl.jpg
//System.out.println(path);
String filename = "";
int index = path.lastIndexOf("\\");
if(index != -1){
filename = path.substring(index+1);
}
// Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; MAAU; .NET4.0C)
String agent = request.getHeader("User-Agent");
//System.out.println(agent);
if(agent.contains("MSIE")){
filename = URLEncoder.encode(filename, "UTF-8");
}
// 设置头信息
// 以附件打开
response.setHeader("Content-Disposition", "attachment;filename="+filename);
// 输入流
InputStream in = new FileInputStream(path);
// 输出流
OutputStream os = response.getOutputStream();
// 流的拷贝
byte [] b = new byte[1024];
int len = 0;
while((len = in.read(b)) != -1){
os.write(b, 0, len);
}
in.close();
请求
ServletRequest
|
HttpServletRequest
* 获取客户机信息
* getRemoteAddr方法返回发出请求的客户机的IP地址
* getContextPath 获取项目名称(获取虚拟路径名称)
* 获取请求头的信息
* String agent = request.getHeader("User-Agent");
* String referer = request.getHeader("referer"); 记录当前网页的来源。
****** 获取请求参数
***** String getParameter(String name) 一个key对应一个value(文本框、密码框)
***** String[] getParameterValues(String name) 一个key对应多个value(复选框)
*** Map getParameterMap()
* Enumeration getParameterNames()
POST请求乱码 :request.setCharacterEncoding("utf-8");
GET请求乱码
解决方案一:修改server.xml
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8"/>
* 必须有修改tomcat服务器配置文件权限
解决方案二:逆向编解码
username = URLEncoder.encode(username, "ISO-8859-1");
username = URLDecoder.decode(username, "utf-8");
解决方案三 简单方式(推荐使用)
username = new String(username.getBytes("ISO-8859-1"),"utf-8");
* request对象获取请求参数乱码
* post
* 设置缓冲区的编码
* request.setCharacterEncoding("utf-8");
* get
* username = new String(username.getBytes("ISO-8859-1"),"utf-8");
* 转发(和重定向可以比较):
* setAttribute("","");
* getAttribute("");
* removeAttribute("");
利用referer防盗链
09 Request/Response的更多相关文章
- request response
request 和 response 这两个对象是出现在service方法中.service方法是用来接收请求处理请求,完成响应的. 接受请求指的就是request对象 完成响应指的就 ...
- request \response 总结
request&response request 1.获得信息的方法 1> 获得请求首行信息的方法 *getMethod *getContextP ...
- track message forwards, avoiding request loops, and identifying the protocol capabilities of all senders along the request/response chain
https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html The TRACE method is used to invoke a remote, ...
- Ng Http Request/response格式转换
angular作为Single Page Application推荐的交互方式当然是基于json的ajax调用.但今天要说的是当你不幸工作在一个遗留或者不可控制的服务上,而这服务是基于非json提交方 ...
- 过滤器中的chain.doFilter(request,response)
Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码.做一些业务逻辑判断等.其工作原理是,只要你在web.xml文件配置好要 ...
- 对chain.doFilter(request,response)的理解
他的作用是将请求转发给过滤器链上下一个对象.这里的“下”指的是哪里 ? 指的是下一个filter,如果没有filter那就是你请求的资源. 一般filter都是一个链,web.xml 里面配置了几个就 ...
- chain.doFilter(request,response)含义
过滤器的生命周期一般都要经过下面三个阶段: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Config 对象的引用.我们的过滤器实际上并 ...
- controlling the variance of request response times and not just worrying about maximizing queries per second
http://highscalability.com/blog/2010/11/4/facebook-at-13-million-queries-per-second-recommends-minim ...
- ZeroMQ之Request/Response (Java)
自己最开始是在cloud foundry中接触过消息服务器(nats),或者说是消息中间件,也算是初步知道了一个消息服务器对于分布式的网络系统的重要性,后来自己也曾想过在一些项目中使用它,尤其是在一些 ...
随机推荐
- Codeforces Round #238 (Div. 2) D. Toy Sum(想法题)
传送门 Description Little Chris is very keen on his toy blocks. His teacher, however, wants Chris to s ...
- yii2 session的使用方法
yii2打开session use yii\web\Session; $session = Yii::$app->session; // check if a session is alread ...
- 10月24日上午PHP面向对象
面向对象 程序分为两种,一种是面向过程的,另一种是面向对象的.之前的学的都是面向过程的,按部就班的一步一步的按照顺序往下走. 面向对象: 1.什么叫做对象 一切皆为对象(一个对象由一组属性和有权对这些 ...
- 前端进阶试题css(来自js高级前端开发---豪情)既然被发现了HOHO,那我就置顶了嘿嘿!觉得自己技术OK的可以把这套题目做完哦,然后加入高级前端的社区咯
http://www.cnblogs.com/jikey/p/4426105.html js高级前端开发加群方法(此群很难进,里面纯技术,严禁广告,水群) 完整题目做完发邮箱(jikeytang@16 ...
- JAVA对MySQL数据库的操作
一.导包: 使用JDBC连接MySQL数据库时,首先需要导入一个第三方的JAR包(点击下载),下载解压得到一个JAR包,并导入到JAVA项目中,如下图: 二.DBHelper类: 代码如下: impo ...
- windows7安装GitBash和GitGui
安装很简单,搜索安装就行. 配置: 1.$ ssh-keygen -t rsa -C "your_email@youremail.com" 将"your_email@yo ...
- Linux进程间通信(八):流套接字 socket()、bind()、listen()、accept()、connect()、read()、write()、close()
前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程.通常我们使用socket进行网络编 ...
- python 内置&&递归
lambda 优点: 1:可以简单使用一个脚本来替代我们的函数 2:不用考虑命名的问题 3:简化代码的可读性,不用跳转到def了,省去这样的步骤 内置函数:bif filter:过滤器 map:映射 ...
- oracle查询以当前年份为准的近些年数据
今天在工作中遇到了一个查询近几年数据的问题,oracle学的比较渣渣,学习了一下. 举个例子: 比如说员工入职,我想看这个公司的员工入职情况,然后做一个趋势统计表. 以当前年份为准,查看近5年的情况趋 ...
- Python基础四
1. 集合 主要作用: 去重 关系测试, 交集\差集\并集\反向(对称)差集 2. 元组 只读列表,只有count, index 2 个方法 作用:如果一些数据不想被人修改, 可以存成元组,比如身 ...