美文网首页
Java Web部分(重要)

Java Web部分(重要)

作者: 久伴_不离 | 来源:发表于2019-05-27 11:43 被阅读0次

    1.jsp和 servlet 有什么区别?

    答:

    jsp经编译后就成了Servlet(Jsp的本质就是Servlet,JVM只能识别Java类,不能识别Jsp代码,Web容器将Jsp的代码编译成JVM能够识别的java类)

    jsp更擅长表现于页面显示,servlet更擅长于逻辑控制

    Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到


    2.session 和 cookie 有什么区别?

    答:

    存储位置不同:session 存储在服务器端;cookie 存储在浏览器端。

    安全性不同:cookie 安全性一般,在浏览器存储,可以被伪造和修改。

    容量和个数限制:cookie 有容量限制,每个站点下的 cookie 也有个数限制。

    存储的多样性:session 可以存储在 Redis 中、数据库中、应用程序中;而 cookie 只能存储在浏览器中


    3.说一下 session 的工作原理?

    答:session 的工作原理是客户端登录完成之后,服务器会创建对应的 session,session 创建完之后,会把 session 的 id 发送给客户端,客户端再存储到浏览器中。这样客户端每次访问服务器时,都会带着 sessionid,服务器拿到 sessionid 之后,在内存找到与之对应的 session 这样就可以正常工作了


    4.如果客户端禁止 cookie 能实现 session 还能用吗?

    答:可以用,session 只是依赖 cookie 存储 sessionid,如果 cookie 被禁用了,可以使用 url 中添加 sessionid 的方式保证 session 能正常使用


    5.spring mvc 和 struts 的区别是什么?

    答:

    拦截级别:struts2 是类级别的拦截;spring mvc 是方法级别的拦截。

    数据独立性:spring mvc 的方法之间基本上独立的,独享 request 和 response 数据,请求数据通过参数获取,处理结果通过 ModelMap 交回给框架,方法之间不共享变量;而 struts2 虽然方法之间也是独立的,但其所有 action 变量是共享的,这不会影响程序运行,却给我们编码和读程序时带来了一定的麻烦。

    拦截机制:struts2 有以自己的 interceptor 机制,spring mvc 用的是独立的 aop 方式,这样导致struts2 的配置文件量比 spring mvc 大。

    对 ajax 的支持:spring mvc 集成了ajax,所有 ajax 使用很方便,只需要一个注解 @ResponseBody 就可以实现了;而 struts2 一般需要安装插件或者自己写代码才行。


    6.如何避免 sql 注入?

    答:

    使用预处理 PreparedStatement。

    使用正则表达式过滤掉字符中的特殊字符。


    7.什么是 XSS 攻击,如何避免?

    答:

    XSS 攻击:即跨站脚本攻击,它是 Web 程序中常见的漏洞。原理是攻击者往 Web 页面里插入恶意的脚本代码(css 代码、Javascript 代码等),当用户浏览该页面时,嵌入其中的脚本代码会被执行,从而达到恶意攻击用户的目的,如盗取用户 cookie、破坏页面结构、重定向到其他网站等。

    预防 XSS 的核心是必须对输入的数据做过滤处理。


    8.什么是 CSRF 攻击,如何避免?

    答:

    CSRF:Cross-Site Request Forgery(中文:跨站请求伪造),可以理解为攻击者盗用了你的身份,以你的名义发送恶意请求,比如:以你名义发送邮件、发消息、购买商品,虚拟货币转账等。

    防御手段:

    验证请求来源地址;

    关键操作添加验证码;

    在请求地址添加 token 并验证


    9.转发(Forward)和重定向(Redirect)的区别

    转发是服务器行为,重定向是客户端行为。

    转发(Forword)

    通过RequestDispatcher对象的forward(HttpServletRequest request,HttpServletResponse response)方法实现的。RequestDispatcher可以通过HttpServletRequest 的getRequestDispatcher()方法获得。例如下面的代码就是跳转到login_success.jsp页面。

    request.getRequestDispatcher("login_success.jsp").forward(request,response);

    重定向(Redirect) 是利用服务器返回的状态吗来实现的。客户端浏览器请求服务器的时候,服务器会返回一个状态码。服务器通过HttpServletRequestResponse的setStatus(int status)方法设置状态码。如果服务器返回301或者302,则浏览器会到新的网址重新请求该资源。

    从地址栏显示来说

    forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.

    redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.

    从数据共享来说

    forward:转发页面和转发到的页面可以共享request里面的数据.

    redirect:不能共享数据.

    从运用地方来说

    forward:一般用于用户登陆的时候,根据角色转发到相应的模块.

    redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等

    从效率来说

    forward:高.

    redirect:低.


    10.JSP的内置对象及方法?

    request表示HttpServletRequest对象。

    它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。

    response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等)

    out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。

    pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。

    session表示一个请求的javax.servlet.http.HttpSession对象。 Session可以存贮用户的状态信息

    applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息

    config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。

    page表示从该页面产生的一个servlet实例

    exception 表示异常对象


    11.说一说Servlet的生命周期?

    Servlet有良好的生存期的定义,

    包括加载和实例化、初始化、处理请求以及服务结束。

    这个生存期由 javax.servlet.Servlet接口的init(), service ()和destroy方法表达。

    Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法 自动派 遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destr oy方 web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。

    通过 调用 service()方法实现,根据请求的不同调用不同的do*()方法。结束服务,web容器调用servlet的 destroy ()方法。


    12.HTTPS和HTTP的区别

    http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议

    https协议需要到ca申请证书,一般免费证书很少,需要交费。

    http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。

    http的连接很简单,是无状态的

    HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全


    13.Get和Post的区别

    get是从服务器上获取数据(Http与服务器交互的查),post是向服务器传送数据(Http与服务器交互的改),

    get传送的数据量较小,不能大于2KB。

    post传送的数据量较大,一般被默认为不受限制。

    【Http Get方法提交的数据大小长度并没有限制,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。】

    之前我们有一个项目开发,遇到了在其他人的电脑上访问是正常的,但是到了他的电脑上就返回400的错误,这个就很奇怪了,之后我们采用了用 fiddler 抓包,发现url超长,他用的是IE浏览器,会对超长的url进行截取,所以会返回400的错误,所以我们表单提交的时候必须用post请求。

    get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

    在进行文件上传时只能使用post而不能是get。

    .表单提交默认是用get.


    14.sevlet过滤器是什么?

    filter是一个过滤器,用来在请求前和响应后进行数据的处理。 filter的生命周期是:

    实例化--->初始化(init)-->进行过滤(doFilter)--->销毁(destroy)-->释放资源

    一个Filter必须实现javax.servlet.Filter接口 在项目中我们通常通过filter进行编码转换, 进行安全验证,

    进行重复提交的判断。


    15.web.xml 中的listener、filter、servlet 加载顺序

    真正的加载顺序为:context-param -> listener -> filter -> servlet


    16.JSP 标准标签库(JSTL)

    1. 1. <c:out>    用于在JSP中显示数据,就像<%= ... >

    1. 1. <c:set>    用于保存数据

    1. 1. <c:remove>    用于删除数据

    1. 1. <c:catch>    用来处理产生错误的异常状况,并且将错误信息储存起来

    1. 1. <c:if>    与我们在一般程序中用的if一样

    1. 1. <c:choose>    本身只当做<c:when>和<c:otherwise>的父标签

    1. 1. <c:when>    <c:choose>的子标签,用来判断条件是否成立

    1. 1. <c:otherwise>    <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行

    1. 1. <c:import>    检索一个绝对或相对 URL,然后将其内容暴露给页面

    1. 1. <c:forEach>    基础迭代标签,接受多种集合类型

    1. 1. <c:forTokens>    根据指定的分隔符来分隔内容并迭代输出

    1. 1. <c:param>    用来给包含或重定向的页面传递参数

    1. 1. <c:redirect>    重定向至一个新的URL.

    1. 1. <c:url>    使用可选的查询参数来创造一个URL


    17.request.getAttribute()和 request.getParameter()有何区别

    从获取方向来看:

    getParameter()是获取 POST/GET 传递的参数值;

    getAttribute()是获取对象容器中的数据值;

    从用途来看:

    getParameter用于客户端重定向时,即点击了链接或提交按扭时传值用,即用于在用表单或url重定向传值时接收数据用。

    getAttribute用于服务器端重定向时,即在 sevlet 中使用了 forward 函数,或 struts 中使用了

    mapping.findForward。 getAttribute 只能收到程序用 setAttribute 传过来的值。

    另外,可以用 setAttribute,getAttribute 发送接收对象.而 getParameter 显然只能传字符串。

    setAttribute 是应用服务器把这个对象放在该页面所对应的一块内存中去,当你的页面服务器重定向到另一个页面时,应用服务器会把这块内存拷贝另一个页面所对应的内存中。这样getAttribute就能取得你所设下的值,当然这种方法可以传对象。session也一样,只是对象在内存中的生命周期不一样而已。getParameter只是应用服务器在分析你送上来的 request页面的文本时,取得你设在表单或 url 重定向时的值。

    总结:

    getParameter 返回的是String,用于读取提交的表单中的值;(获取之后会根据实际需要转换为自己需要的相应类型,比如整型,日期类型啊等等)

    getAttribute 返回的是Object,需进行转换,可用setAttribute 设置成任意对象,使用很灵活,可随时用


    18.servlet线程安全描述

        servlet是单列的,对于所有请求都使用一个实例,所以如果有全局变量被多

    线程使用的时候,就会出现线程安全问题。

    解决这个问题有三种方案:

    1.实现singleThreadModel接口,这样对于每次请求都会创建一个新的servlet实例,这样就会消耗服务端内存,降低性能,但是这个接口已经过时,不推荐使用。

    2.可以通过加锁(synchroniezd关键字)来避免线程安全问题。这个时候虽然还是单列,但是对于多线程的访问,每次只能有一个请求进行方法体内执行,只有执行完毕后,其他线程才允许访问,降低吞吐量。

    3.避免使用全局变量,使用局部变量可以避免线程安全问题,强烈推荐使用此方法来解决servlet线程安全的问题。


    19.Java过滤器与SpringMVC拦截器之间的关系与区别 

    过滤器和拦截器的区别:

      过滤器需要在web.xml中配置,依赖于servlet容器,实现过滤器的时候需要实现Filter接口。一般做编码过滤器

      拦截器是属于mvc框架的,需要在mvc框架的配置文件中进行配置。一般做登录拦截器

      写了点测试代码,顺便整理一下思路,搞清楚这几者之间的顺序:

      1.过滤器是JavaEE标准,采用函数回调的方式进行。是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理。

        @Override

        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

            System.out.println("before...");

            chain.doFilter(request, response);

            System.out.println("after...");

        }

      chain.doFilter(request, response);这个方法的调用作为分水岭。事实上调用Servlet的doService()方法是在chain.doFilter(request, response);这个方法中进行的。

      2.拦截器是被包裹在过滤器之中的。

        @Override

        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

            System.out.println("preHandle");

            return true;

        }

        @Override

        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

            System.out.println("postHandle");

        }

        @Override

        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

            System.out.println("afterCompletion");

        }

      a.preHandle()这个方法是在过滤器的chain.doFilter(request, response)方法的前一步执行,也就是在 [System.out.println("before...")][chain.doFilter(request, response)]之间执行。

      b.preHandle()方法之后,在return ModelAndView之前进行,可以操控Controller的ModelAndView内容。

      c.afterCompletion()方法是在过滤器返回给前端前一步执行,也就是在[chain.doFilter(request, response)][System.out.println("after...")]之间执行。

      3.SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的。所以过滤器、拦截器、service()方法,dispatc()方法的执行顺序应该是这样的,大致画了个图:其实非常好测试,自己写一个过滤器,一个拦截器,然后在这些方法中都加个断点,一路F8下去就得出了结论。

      总结:拦截器功在对请求权限鉴定方面确实很有用处,在我所参与的这个项目之中,第三方的远程调用每个请求都需要参与鉴定,所以这样做非常方便,而且他是很独立的逻辑,这样做让业务逻辑代码很干净。和框架的其他功能一样,原理很简单,使用起来也很简单,大致看了下SpringMVC这一部分的源码,其实还是比较容易理解的。

      我们项目中仅仅用到了preHandle这个方法,而未用其他的,框架提供了一个已经实现了拦截器接口的适配器类HandlerInterceptorAdapter,继承这个类然后重写一下需要用到的方法就行了,可以少几行代码,这种方式Java中很多地方都有体现。

    监听器>拦截器的初始化>过滤器>servlet()


    20.Ajax总结,什么是AJAX?AJAX的技术体系组成是由那几部分组成?

        AJAX 全称: 异步JavaScript及 XML(Asynchronous JavaScript And XML)

    Ajax的核心是JavaScript对象XmlHttpRequest(XHR)。

    Ajax的优点:

        提高用户体验度(UE)

        提高应用程序的性能

        进行局部刷新

    AJAX不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的 Web 应用程序的技术。

    2.  通过 AJAX,我们的 JavaScript 可使用JavaScript的XMLHttpRequest对象来直接与服务器进行通信。通过这个对象,我们的 JavaScript 可在不重载页面的情况与Web服务器交换数据,即可局部刷新。

    3.  AJAX 在浏览器与 Web 服务器之间使用异步数据传输(HTTP 请求),这样就可使网页从服务器请求少量的信息,而不是整个页面,减轻服务器的负担,提升站点的性能。

    AJAX 可使因特网应用程序更小、更快,更友好,用户体验(UE)好。

    5.  Ajax是基于标准化并被广泛支持的技术,并且不需要插件和下载小程序

    Ajax: Asynchronous Javascript And Xml;

           (异步的JavaScript和XML)

       包括的技术:JavaScript、XML、CSS、XMLHttpRequest

       异步:发送请求以后,不等结果,由回调函数处理。

       JavaScript:向服务器发送请求,获得返回结果,更新页面

       XML: 用来封装数据

    1)创建XMLHttpReuest对象

         非IE浏览器(Mozilla/Safari):

         var xhr=new XMLHttpRequest();

         IE:

         xhr=new ActiveXObject("Msxml2.XMLHTTP");

         低版本IE:

         xhr=new ActiveXObject("Microsfot.XMLHTTP"); 

       2)XMLHttpRequest对象的属性与方法

         a)方法:

          open("GET/POST",URL,true/false):用来向服务器建立连接

           有三个参数:

           参数1:提交方式,post或get

           参数2:请求的URL

           参数3:表示同步或异步请求,true:表示异步请求

           false: 表示同步请求

          send(data):发送请求

           参数:提交的内容。

           POST方式:data就是提交的参数,send(username=root&password=abc123);

           GET方式:send(null)

        b)属性:

         onreadystatechange:设置状态改变时的回调函数,回调函数用来获取服务器数据。

           onreadystatechange=function(){

           }

         readyState:服务器状态响应

           状态码:

           0:未初始化

           1:正在加载

           2:加载完成

           3:请求进行中

           4:请求完成

         responseText:服务器返回的数据(文本格式)

         responseXML:服务器返回的数据(XML格式)


    21.XML和Json的特点

    1.共同点:

        xml和json都是数据传输的载体,并且具有跨平台跨语言的特性。

    Xml特点:

      1、有且只有一个根节点;

      2、所有的标签都需要自定义;

      3、是纯文本文件

    Json(JavaScript Object Notation)特点:

      json分为两种格式:

    json对象(就是在{}中存储键值对,键和值之间用冒号分隔,

    键 值 对之间用逗号分隔);

    json数组(就是[]中存储多个json对象,json对象之间用逗号分隔)

    (两者间可以进行相互嵌套)数据传输的载体之一

    场景:

        像配置文件,一般采取的是xml的格式,因为他描述比较清晰。

        数据的传递我们会采用Json的格式,因为他的效率更高。


    22.html中form里action方法的get和post有什么区别?

    get和post的区别:

    1)请求参数存放的位置不同,get方式放在url后面,post方式放在请求实体内容中

    2)请求参数的长度限制不同,get方式有长度限制,post没有

    3)安全性,post方式提交的数据更安全

    4)get方式的url可以传播,post方式不可以


    23.jQuery对象和dom对象是怎样转换的?

    jQuery对象转成DOM对象:

    两种转换方式将一个jQuery对象转换成DOM对象:[index]和.get(index);

    (1)jQuery对象是一个数据对象,可以通过[index]的方法,来得到相应的DOM对象。

    如:var $v =$("#v") ; //jQuery对象

    var v=$v[0];    //DOM对象

    alert(v.checked)   //检测这个checkbox是否被选中

    (2)jQuery本身提供,通过.get(index)方法,得到相应的DOM对象

    如:var $v=$("#v");  //jQuery对象

    var v=$v.get(0);   //DOM对象

    alert(v.checked)  //检测这个checkbox是否被选中

    DOM对象转成jQuery对象:

    对于已经是一个DOM对象,只需要用$()把DOM对象包装起来,就可以获得一个jQuery对象了。$(DOM对象)

    如:var v=document.getElementById("v");  //DOM对象

    var $v=$(v);    //jQuery对象

    转换后,就可以任意使用jQuery的方法了。


    24.如何解决AJAX的跨域问题?

    1、在请求页面上使用Access-Control-Allow-Origin标头。

       使用如下标头可以接受全部网站请求:

    header('Access-Control-Allow-Origin:*')

      使用如下标头可以接受指定网站请求:

    header('Access-Control-Allow-Origin:http://www.abc.com')

    2、使用jsonp跨域请求。

    $data = json_encode(array('msg'=>'msg....'));

    die( $_REQUEST['function_name_index'].'('.$data.')' );

    <!DOCTYPE html>

    <html lang="en" class="">

    <head>

    <meta charset="utf-8" />

    <title>测试</title>

    <script src="http://www.ysont.cn/plugs/cookie/js/jquery-1.11.1.min.js"></script>

    <body>

    <script>

        $.ajax({

            url:'http://192.168.1.124/homekoo.com/zde/cors_1.php',

            dataType:'jsonp',

            jsonp:'function_name_index',

            jsonpCallback:'function_name',

            success:function(data){

                alert(data.msg);

            }

        });

    </script>

    </body>

    </html>


    25.AJAX的优点与缺点分别是什么?

    (1).AJAX的优点

    <1>.无刷新更新数据。

    AJAX最大优点就是能在不刷新整个页面的前提下与服务器通信维护数据。这使得Web应用程 序更为迅捷地响应用户交互,并避免了在网络上发送那些没有改变的信息,减少用户等待时间, 带来非常好的用户体验。

    <2>.异步与服务器通信。

    AJAX使用异步方式与服务器通信,不需要打断用户的操作,具有更加迅速的响应能力。优化了 Browser和Server之间的沟通,减少不必要的数据传输、时间及降低网络上数据流量。

    <3>.前端和后端负载平衡。

    AJAX可以把以前一些服务器负担的工作转嫁到客户端,利用客户端闲置的能力来处理,减轻服 务器和带宽的负担,节约空间和宽带租用成本。并且减轻服务器的负担,AJAX的原则是“按需取 数据”,可以最大程度的减少冗余请求和响应对服务器造成的负担,提升站点性能。

    <4>.基于标准被广泛支持。

    AJAX基于标准化的并被广泛支持的技术,不需要下载浏览器插件或者小程序,但需要客户允许 JavaScript在浏览器上执行。随着Ajax的成熟,一些简化Ajax使用方法的程序库也相继问世。 同样,也出现了另一种辅助程序设计的技术,为那些不支持JavaScript的用户提供替代功能。

    <5>.界面与应用分离。

    Ajax使WEB中的界面与应用分离(也可以说是数据与呈现分离),有利于分工合作、减少非技 术人员对页面的修改造成的WEB应用程序错误、提高效率、也更加适用于现在的发布系统。

    (2).AJAX的缺点

    <1>.AJAX干掉了Back和History功能,即对浏览器机制的破坏。

    <2>.AJAX的安全问题。

    <3>.对搜索引擎支持较弱。

    <4>.破坏程序的异常处理机制。

    <5>.违背URL和资源定位的初衷。

    <6>.AJAX不能很好支持移动设备。

    <7>.客户端过肥,太多客户端代码造成开发上的成本。


    26.AJAX应用和传统Web应用有什么不同?

    a)在传统的Javascript编程中,如果想得到服务器端数据库或文件上的信息,或者发送客户端信息到服务器,需要建立一个HTML form然后GET或者POST数据到服务器端。用户需要点击”Submit”按钮来发送或者接受数据信息,然后等待服务器响应请求,页面重新加载。 

    因为服务器每次都会返回一个新的页面, 所以传统的web应用有可能很慢而且用户交互不友好。 

    使用AJAX技术, 就可以使Javascript通过XMLHttpRequest对象直接与服务器进行交互。 

    通过HTTP Request, 一个web页面可以发送一个请求到web服务器并且接受web服务器返回的信息(不用重新加载页面),展示给用户的还是通一个页面,用户感觉页面刷新,也看不到到Javascript后台进行的发送请求和接受响应。


    27.Ajax和javascript的区别? 

    a) javascript是一种用于浏览器的脚本语言,它的主要功能分dom和bom操作两种,前者用于对网页文档进行操作,后者对于浏览器对象进行操作,它们都具有丰富多彩的强大效果。虽然JavaScript在诞生之初借用了Java的名,但从前景来看,这种动态弱类型的脚本语言可能比静态强类型的Java要更有前途。

    Ajax诞生于2005年,这是一种借助XMLHttpRequest异步与后台进行通信的“新”技术。XMLHttpRequest,加上dom,css,xml等各项技术,再使用JavaScript将它们糅合在一起,就组成了Ajax。它的最大特点是异步无刷新的响应机制,这使BS程序开始在界面感观上能与CS程序媲美。此外,Ajax还不限后台语言,这使得它从诞生之初就得到了非常广泛的认同和使用。


    未完待续。。。。将不定时更新

    相关文章

      网友评论

          本文标题:Java Web部分(重要)

          本文链接:https://www.haomeiwen.com/subject/prwctctx.html