Http协议&缓存&转发重定向&反盗链
一、http协议:
1、什么是http协议:
http协议: 对浏览器客户端 和 服务器端 之间数据传输的格式规范
2、查看http协议的工具
1)使用火狐的firebug插件(右键->firebug->网络)
2)使用谷歌的“审查元素”
3、http协议内容
请求(浏览器---->服务器)
GET /day09/hello HTTP/1.1 Host: localhost:8080 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Connection: keep-alive |
响应(服务器------>浏览器)
HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Length: 24 Date: Fri, 30 Jan 2015 01:54:57 GMT |
4、http请求
1)请求图解:
2)http协议版本:
http1.0:(仅有且默认短连接)当前浏览器客户端与服务器端建立连接之后,只能发送一次请求,一次请求之后连接关闭。
http1.1:(保留短连接,新增长连接,默认长连接)当前浏览器客户端与服务器端建立连接之后,可以在一次连接中发送多次请求。(基本都使用1.1)
3)请求资源:
URL: 统一资源定位符。http://localhost:8080/day09/testImg.html。只能定位互联网资源。是URI 的子集。
URI: 统一资源标记符。/day09/hello。用于标记任何资源。可以是本地文件系统,局域网的资源(//192.168.14.10/myweb/index.html), 可以是互联网。
4)请求方式:
常见的请求方式: GET 、 POST、 HEAD、 TRACE、 PUT、 CONNECT 、DELETE
常用的请求方式: GET 和 POST
5)http请求分析:
6)HttpServletRequest对象:
HttpServletRequest对象作用是用于获取请求数据。
核心的API:
请求行:
request.getMethod(); 请求方式
request.getRequetURI() / request.getRequetURL() 请求资源
request.getProtocol() 请求http协议版本
请求头:
request.getHeader("名称") 根据请求头获取请求值
request.getHeaderNames() 获取所有的请求头名称
实体内容:
request.getInputStream() 获取实体内容数据
二、使用时间戳解决浏览器缓存问题
1、介绍:
当我们第一次访问某网站的时候,浏览器要缓存页面的图片、js、CSS等文件,故变得忙,当你第二次再次访问该网站的时候就会变得快速,这是因为浏览器缓存了页面的信息所以不需要再次向服务器发送请求,直接访问本地缓存的信息返回304状态码。
2、案例:自己后台新建一个简单的web项目,默认页面加载项目的一张图片。
第一次请求:
第二次请求:
总结:如果你把浏览器缓存清除,再次访问就会从服务器获取,状态码就是200。
3、请求路径加上时间戳解决缓存问题:
介绍:在一些公司每次项目发版的时候都会在页面的img、JavaScript、css中加上具体的时间戳用来解决本地浏览器缓存问题,这样用户在访问该网站的时候就会拉取最新的资源不会再读取本地的资源,亲自看了一下BAT公司的网络源码发现并没有这样的设置,所以该功能根据公司项目需求选取。
三、网站资源防盗链
1、介绍:
反盗链是指保护本网站资源(主要是图片、视频、JavaScript、css等)不被其他网站非法引用。
2、解决方法:
Java后台新建过滤器对访问资源的请求进行过滤,主要是通过请求的referer和serverName比对来进行过滤。
3、案例介绍:
Javaweb项目a有一个图片资源在其首页上,Javaweb项目b想要通过分析页面图片来源信息来获取图片url路径从而直接在其页面引入该图片,a项目过滤该网站请求。
1)过滤器核心代码
// 新建一个类
public class ImgFilter implements Filter{
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化过滤器...");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("doFilter coming .....");
// 将ServletRequest强转成HttpRequest
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
// 获取请求的refer
String referer = req.getHeader("referer");
String serverName = req.getServerName();
System.out.println("referer:"+referer+"=="+"serverName"+serverName);
if(referer == null||!(referer.contains(serverName))){
req.getRequestDispatcher("error.png").forward(req, res);
return ;
}
// 放行
chain.doFilter(req, res);
}
public void destroy() {
System.out.println("销毁方法....");
}
}
// web.xml配置过滤器
<filter>
<filter-name>ImgFilter</filter-name>
<filter-class>com.simpo.ImgFilter</filter-class>
</filter>
<filter-mapping>
<!-- 过滤访问图片请求 -->
<filter-name>ImgFilter</filter-name>
<url-pattern>/imgs/*</url-pattern>
</filter-mapping>
a项目自己访问图片资源是可以正常访问的:
b项目访问a项目图片资源报错:
直接访问a项目图片资源报错:
控制台结果输出:
总结:
1、访问a,b的时候都在本地的host文件中进行了地址DNS解析配置。
2、防盗链主要根据自己公司项目进行选择。
3、访问的时候多清空浏览器缓存,免得页面直接访问本地缓存的图片从而不进入后台过滤器。
四、转发和重定向
1、http响应:
常见的响应头
2、响应状态码:
200 : 表示请求处理完成并完美返回
302: 表示请求需要进一步细化(重定向)。
304: 读取本地缓存
403: 参数错误
404: 表示客户访问的资源找不到(URL地址错误)。
500: 表示服务器的资源发送错误。(服务器内部错误)
502: 项目正在服务器发布
3、HttpServletResponse对象
HttpServletResponse对象修改响应信息:
响应行:
response.setStatus() 设置状态码
响应头:
response.setHeader("name","value") //设置响应头
实体内容:
response.getWriter().writer(); //发送字符实体内容
response.getOutputStream().writer() //发送字节实体内容
3、请求重定向
1)原理分析:客户端访问A接口,A接口返回302状态码并在返回头中设置新的地址,客户端读取返回头信息中的地址再次访问新地址。
2)图解:
具体案例介绍:
3)代码和效果:
// 第一个接口
@WebServlet("/ResServlet")
public class ResServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重定向到该接口
resp.sendRedirect("/a/LocationServlet");
}
}
// 第二个接口
@WebServlet("/LocationServlet")
public class LocationServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().print("LocationServlet");
}
}
请求地址:
返回结果:
第一个请求返回结果分析图:
4)代码修改:
//resp.sendRedirect("/a/LocationServlet");
resp.setStatus(302);
resp.setHeader("Location", "/a/LocationServlet");
4、重定向和请求转发区别:
1)形象比喻:
重定向:学生A去找老师T1解决问题,T1老师说这个问题我解决不了,这样你去找T2老师,他会解决的!这样学生A就去T2老师了,学生A拿到T2老师的结果。
请求转发:学生A去找老师T1解决问题,T1老师说他不会解决,我知道T2老师会解决,我去找他,后来T1老师就把结果告诉了学生A。
2)区别:
请求次数不同:重定向请求两次,请求转发只请求一次。
地址Url变化不同:重定向请求地址修改,请求转发请求地址未修改。
行为不同:重定向是客户端行为,请求转发是服务端行为。
效率不同:重定向请求两次效率较请求转发低。