笔记-为什么采用html而不采用jsp,跨域请求模式

首先Jsp功能有哪些呢(九大内置对象四大作用域)

1. 作用域

  • page : 代表变量只能在当前页面上生效。
  • request: 代表变量能在一次请求中生效(包含请求转发)。
  • session : 代表在一次会话过程中都生效(session的默认有效时间为30分钟)。
  • application: 代表着作为Web的全局变量,对每一个servlet都生效。

- 九大内置对象

  • request对象:是 javax.servlet.httpServletRequest类型的对象(实现了父类GenericServlet的抽象方法service 把servletRequest强转成HttpServletRequest)
  • response对象:只有在jsp中有效(实现了父类GenericServlet的抽象方法service 把servletResponse强转成HttpservletResponse)
  • session对象:服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。
  • application对象: application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。
  • out 对象:用于输出信息。
  • pageContext对象:pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。
  • config对象:config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。
  • page对象:page 对象代表JSP本身,只能应用在jsp页面。
  • exception对象:exception 对象的作用是显示异常信息,只有在包含 isErrorPage=”true” 的页面中才可以被使用

首先明确一下当我们在浏览器上个输入一个网址内部发生了什么(粗略的说)

1.浏览器查找域名的IP地址(DNS(Domain Name System,域名系统),万维网上作为域名 和IP地址相互映射的一个分布式数据库)
2.在DNS查找过程中,会走四种缓存
——-浏览器缓存:浏览器会缓存DNS记录一段时间,不同的浏览器会储存各自固定的缓存时间(2分钟到30分钟不等)
——-系统缓存: 如果在浏览器缓存中没有找到需要的记录,那么就去到系统查找缓存记录
——-路由器缓存:路由器一般会有自己的DNS缓存
——-ISP中的DNS缓存 : 如果前面的缓存中都没有得到需要的数据,一般都会在这里找到相应的缓存记录
之后DNS采用递归查询+迭代查询。
3.在tcp3次握手之后,通过tcp协议开始访问你的web服务器
4.你的web服务器得到请求后,开始提供服务,接收请求,之后通过response返回你的应答给浏览器。

jsp功能这么强大为什么慢慢在开发中废弃了

  1. 动态资源和静态资源全部耦合在一起。服务器会收到各种http请求,例如CSS的,JS的,图片的等等……
  2. 第一次请求jsp页面,必须要在web服务器中编译成servlet,所以第一次运行会较慢。如果jsp内容大的话,就会等待很长时间,因为jsp是同步加载。
  3. 每次请求jsp都是访问servlet再用输出流输出的html页面,效率没有直接使用html高。
  4. JSP内可以使用小脚本语言(<% java代码%>)或者JSTL标签库,有很强大的功能,可以运行java的内容起不到前后端分离。
  5. 还一点很重要的就是JSP必须运行在web服务器中,不可以使用nginx!nginx是一个高性能的HTTP和反向代理服务,轻量级的web服务器。能够支持高达 50,000 个并发连接数的响应

所以根据上面所叙述,我们在开发中使用html,这样可以实现真正的前后端分离。
在SpringBoot项目中,都是html的页面,如果想使用jsp,还要在pom中引入支持jsp的依赖。这也可以看出jsp不适合实际开发与维护。 ————(仅个人观点欢迎指点不对的地方)


个人理解: 跨域请求

通过AJAX实现的跨域请求

    <!DOCTYPE html> 
    <html>
        <head>CORS Test</head>
        <body>
            <div id="img_Div"></div>
        <script type="text/javascript">  
            //XmlHttpRequest对象  
            function createXmlHttpRequest(){  
                if(window.ActiveXObject){ //如果是IE浏览器  
                    return new ActiveXObject("Microsoft.XMLHTTP");  
                }else if(window.XMLHttpRequest){ //非IE浏览器  
                    return new XMLHttpRequest();  
                }  
            }  

            function Message() {
                var img_Container = document.getElementById("img_Div");
                var Xreq= createXmlHttpRequest();
                Xreq.open('GET', 'http://oss.corsTest.com/1.jpg', true);
                Xreq.setRequestHeader('Content-Type', 'image/jpeg');
                Xreq.responseType = "blob";
                Xreq.onload = function() {
                    if (this.status == 200) {
                        var blob = this.response;
                        var img = document.createElement("img");
                        img.onload = function(e) {
                            window.URL.revokeObjectURL(img.src); 
                        };
                        img.src = window.URL.createObjectURL(blob);
                        img_Container.appendChild(img);    
                    }
                }
                Xreq.send(null);
            }
        </script>
        <div >
            <input type="button" onclick="Message()" value="Get" />
        </div>
        </body>
    </html>

虽然Ajax能实现跨域请求,提高了页面呈现速度,和用户体验。但是带了极大的安全隐患。
最主要的就是CSRF(Cross-site request forgery)跨站请求伪造

什么是CSRF(Cross-site request forgery)跨站请求伪造

1.用户通过浏览器,访问正常网站A,通过用户的身份认证成功A网站。
2.网站A产生Cookie信息并返回给用户的浏览器; 
3.用户保持A网站页面登录状态,在同一浏览器中,打开一个新的网页访问恶意网站B;
4.网站B接收到用户请求后,返回一些攻击性代码,请求A网站的资源;
5.浏览器执行恶意代码,在用户不知情的情况下携带Cookie信息,向网站A发出请求。
6.网站A根据用户的Cookie信息核实用户身份,A网站会处理该请求,导致来自网站B的恶意请求被执行。

所以出于安全原因,浏览器限制从脚本中发起的跨域HTTP请求。默认的安全限制为同源策略, 即JavaScript或Cookie只能访问同源下的内容。
这也就产生了CORS(Cross-Origin Resource Sharing 跨源资源共享)

说一下什么是CORS(Cross-Origin Resource Sharing 跨源资源共享)

CORS是一个w3c标准(一种验证访问机制),全称是”跨域资源共享”(Cross-origin resource sharing),但是一个请求url的协议,域名,端口三者之间任意与当前页面地址不同,这种请求得方式就叫做跨域请求。它允许浏览器向跨源服务器发送XMLHttpRequest请求,从而客户端AJAX却有同源使用的限制即协议,域名,端口必须相同。而且CORS这种验证访问机制是需要客户端和服务端协同处理。

另一种方式:JSONP–什么是JSONP?

JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的

<!DOCTYPE">
//实现JSONP的代码   (JosnP是异步请求,不支持同步)
<html>
<head>
     <title>Untitled Page</title>
      <script type="text/javascript" src=jquery.min.js"></script>//引入jquery支持文件
      <script type="text/javascript">
     jQuery(document).ready(function(){ 
        $.ajax({
             type: "get", //JSONP只支持get方式提交...JSONP的实现原理就是创建一个script标签, 再把需要请求的api地址放到src里. 这个请求只能用GET方法, 
             async: false,
             url: "http://xxxxxxxx.com/jsonp/crodMessage.do?code=xxxxxx",
             dataType: "jsonp",
             jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
             jsonpCallback:"xxxx",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
             success: function(json){
                 alert('查询到的cord:'+json.cord);
             },
             error: function(){
                 alert('失败');
             }
         });
     });
     </script>
     </head>
  <body>
  </body>
</html>

猜你喜欢

转载自blog.csdn.net/qq_36028557/article/details/82667351