面试知识点六:Java Web

64.jsp 和 servlet 有什么区别?php

65.jsp 有哪些内置对象?做用分别是什么?css

66.说一下 jsp 的 4 种做用域?html

67.session 和 cookie 有什么区别?前端

68.说一下 session 的工做原理?java

69.若是客户端禁止 cookie 能实现 session 还能用吗?web

70.spring mvc 和 struts 的区别是什么?算法

71.如何避免 sql 注入?spring

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

73.什么是 CSRF 攻击,如何避免?数据库

 

64.jsp 和 servlet 有什么区别?

首先来看一下Servlet:Java服务器小程序(Server Applet)

  事实上,Servlet不复杂,它只是一个接口,而接口的做用是什么,规范。

servlet接口定义的是一套处理网络请求的规范,全部实现servlet的类,都须要实现它那五个方法,其中最主要的是两个生命周期方法 init()和destroy(),还有一个处理请求的service(),也就是说,全部实现servlet接口的类,或者说,全部想要处理网络请求的类,都须要回答这三个问题:

  • 你初始化时要作什么
  • 你销毁时要作什么
  • 你接受到请求时要作什么

这是Java给的一种规范!servlet是一个规范,那实现了servlet的类,就能处理请求了吗?答案是,不能。

看一下service方法的说明,该方法是被servlet container即servlet容器调用来响应请求的,好比咱们最经常使用的Tomcat容器。

因此,servlet不直接和客户端打交道,而是经过Tomcat,Tomcat监听了端口,请求过来后,根据url等信息,肯定要将请求交给哪一个servlet去处理,而后调用那个servlet的service方法,service方法返回一个response对象,tomcat再把这个response返回给客户端。

/** * Defines methods that all servlets must implement. * * <p> * A servlet is a small Java program that runs within a Web server. Servlets * receive and respond to requests from Web clients, usually across HTTP, the * HyperText Transfer Protocol. */
public interface Servlet { /** * Called by the servlet container to allow the servlet to respond to a * request. */
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; }

servlet的本质是什么,它是如何工做的?

servlet容器与tomcat容器的区别

Servlet应用没法独立运行,必须运行在Servlet容器中。Tomcat 是Web应用服务器,就是一个Servlet/JSP容器。Servlet容器将用户的请求传递给Servlet应用,并将结果返回给用户。Web服务器和Web客户端间经过HTTP协议通讯,所以Web服务器也叫HTTP服务器。像下图

 

接着看一下JSP: Java Server Pages,直译就是运行在服务器端的页面,是Sun 公司指定的一种服务器端动态页面技术的组件规范,Jsp是以“.jsp”为后缀的文件,在该文件中主要是html 和少许的java 代码。jsp 文件在容器中会转换成Servlet去执行。

当有人请求JSP时,服务器内部会经历一次动态资源(JSP)到静态资源(HTML)的转化,服务器会自动帮咱们把JSP中的HTML片断和数据拼接成静态资源响应给浏览器。也就是说JSP是运行在服务器端,但最终发给客户端的都已是转换好的HTML静态页面(在响应体里)。

即:JSP = HTML + Java片断(各类标签本质上仍是Java片断)

浅谈JSP

因此:简单总结一下servelet与JSP的区别:

一、运行过程
    客户在第一次请求JSP时,请求较慢,由于JSP Engine先把JSP程序转换成servlet代码,接着将它编译成类文件,之后贮存在内存中再次调用速度就快了;
    访问servlet时,能够直接对其编译好的类文件执行。

二、使用方式
    要想使用servlet必须把它放在特定位置并且必须对其映射配置;
    jsp能够放在和html一样位置(webapps根目录下或者webapps根目录下的子目录下)并且不须要配置,能够直接使用。

三、程序组成
    Servlet在Java代码中经过HttpServletResponse对象动态输出HTML内容;
    JSP在静态HTML内容中嵌入Java代码,Java代码被动态执行后生成HTML内容

四、职能分工
    jsp更侧重于前端页面显示,servlet更侧重于业务逻辑。

五、本是一家人
    Jsp 本质上是servlet,用jsp实现的页面用servlet也能实现。

Jsp和Servlet有什么区别? 

浅谈Servlet与JSP

最后,servlet和JSP经过MVC双剑合璧

各自的特色

  • Servlet可以很好地组织业务逻辑代码,可是在Java源文件中经过字符串拼接的方式生成动态HTML内容会致使代码维护困难、可读性差
  • JSP虽然规避了Servlet在生成HTML内容方面的劣势,可是在HTML中混入大量、复杂的业务逻辑一样也是不可取的

既然JSP和Servlet都有自身的适用环境,那么可否扬长避短,让它们发挥各自的优点呢?答案是确定的——MVC(Model-View-Controller)模式很是适合解决这一问题。

MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller):

  • Controller——负责转发请求,对请求进行处理
  • View——负责界面显示
  • Model——业务功能编写(例如算法实现)、数据库设计以及数据存取操做实现

在JSP/Servlet开发的软件系统中,这三个部分的描述以下所示:

&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;img src="https://pic2.zhimg.com/50/229cf9ff5b1729eaf408fac56238eeb3_hd.jpg" data-rawwidth="842" data-rawheight="326" class="origin_image zh-lightbox-thumb" width="842" data-original="https://pic2.zhimg.com/229cf9ff5b1729eaf408fac56238eeb3_r.jpg"/&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;

 


  1. Web浏览器发送HTTP请求到服务端,被Controller(Servlet)获取并进行处理(例如参数解析、请求转发)
  2. Controller(Servlet)调用核心业务逻辑——Model部分,得到结果
  3. Controller(Servlet)将逻辑处理结果交给View(JSP),动态输出HTML内容
  4. 动态生成的HTML内容返回到浏览器显示

MVC模式在Web开发中的好处是很是明显,它规避了JSP与Servlet各自的短板,Servlet只负责业务逻辑而不会经过out.append()动态生成HTML代码;JSP中也不会充斥着大量的业务代码。这大大提升了代码的可读性和可维护性。

注意:MVC是web开发都有的一种模式,好比PHP开发web时也有MVC模式。而三层架构则是JavaEE的:Controller/Service/Dao。分层开发是为了使代码逻辑更加清晰,也起到了必定的解耦合做用。

65.jsp 有哪些内置对象?做用分别是什么?

在jsp开发中会频繁使用到一些对象,如ServletContext HttpSession PageContext等.若是每次咱们在jsp页面中须要使用这些对象都要本身亲自动手建立就会特别的繁琐.SUN公司所以在设计jsp时,在jsp页面加载完毕以后自动帮开发者建立好了这些对象,开发者只须要使用相应的对象调用相应的方法便可.这些系统建立好的对象就叫作内置对象.

在servlet程序中,若是开发者但愿使用session对象,必须经过request.getSession()来获得session对象;而在jsp程序中,开发中可直接使用session(系统帮咱们建立好的session对象的名字就叫session)调用相应的方法便可,如:session.getId().

JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、pagecontext、config、page、exception

内置对象(又叫隐含对象)特色: 
1. 由JSP规范提供,不用编写者实例化。 
2. 经过Web容器实现和管理 
3. 全部JSP页面都可使用 
4. 只有在脚本元素的表达式或代码段中才可以使用(<%=使用内置对象%>或<%使用内置对象%>)

对象名 功能 类型 做用域
request 向客户端请求数据 javax.servlet.ServletRequest Request
response 封装了jsp产生的响应,而后被发送到客户端以响应客户的请求 javax.servlet.SrvletResponse Page
pageContext 为JSP页面包装页面的上下文。管理对属于JSP中特殊可见部分中己经命名对象的该问 javax.servlet.jsp.PageContext Page
session 用来保存每一个用户的信息,以便跟踪每一个用户的操做状态 javax.servlet.http.HttpSession Session
application 应用程序对象 javax.servlet.ServletContext Application
out 向客户端输出数据 javax.servlet.jsp.JspWriter Page
config 表示Servlet的配置,当一个Servlet初始化时,容器把某些信息经过此对象传递给这个Servlet javax.servlet.ServletConfig Page
page Jsp实现类的实例,它是jsp自己,经过这个能够对它进行访问 javax.lang.Object Page
exception 反映运行的异常 javax.lang.Throwable Page

JSP九大内置对象及其做用+四大域对象

66.说一下 jsp 的 4 种做用域?

分类:

  1. ServletContext     application域(context域  )
  2. HttpServletRequet  request域  
  3. HttpSession        session域     --前三种在学习Servlet时就能接触到  
  4. PageContext        page域     --jsp学习的  

域对象的做用:保存数据,获取数据,共享数据.

保存数据:Context.setAttribute("内容");//默认保存到page域  

  1. pageContext.setAttribute("内容",域范围常量);//保存到指定域中  
  2. //四个域常量  
  3. PageContext.PAGE_SCOPE  
  4. PageContext.REQUEST_SCOPE  
  5. PageContext..SESSION_SCOPE  
  6. PageContext.APPLICATION_SCOPE  

获取数据:

  1. pageContext.getAttribute("内容");  pageContext.getAttribute("name",域范围常量);

   //自动在四个域中搜索数据 pageContext.findAttribute("内容");//在四个域中自动搜索数据,顺序:page域->request域->session域->application域(context域)

域做用范围:

  1. page域:    只能在当前jsp页面使用                (当前页面)  
  2. request域: 只能在同一个请求中使用               (转发)  
  3. session域: 只能在同一个会话(session对象)中使用  (私有的)  
  4. context域: 只能在同一个web应用中使用            (全局的)

67.session 和 cookie 有什么区别?

  首先明白为何须要session和cookie?

  由于HTTP协议是无链接无状态的。无链接: 一个请求完毕后,会断开链接,不会保持。无状态:http自己不会存储客户端和服务器在临时会话中产生的数据,而是经过客户端添加cookie机制与服务器添加session机制实现会话期间缓存产生的数据。好比你看到的网站啊,论坛啊,能记住你的密码,记住你的登录状态,那是用cookie和session实现的,和HTTP无关。

  http协议无状态中的 "状态" 到底指的是什么?!

  什么是Http无状态?Session、Cookie、Token三者之间的区别

  session与cookie:Cookie经过在客户端记录信息肯定用户身份,Session经过在服务器端记录信息肯定用户身份。

  因为HTTP是一种无状态的协议,服务器单从网络链接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,不管谁访问都必须携带本身通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工做原理

  Cookie其实是一小段的文本信息。客户端请求服务器,若是服务器须要记录该用户状态,就使用response向客 户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务 器。服务器检查该Cookie,以此来辨认用户状态。服务器还能够根据须要修改Cookie的内容。

   Cookie和Session详解

  Session是另外一种记录客户状态的机制,不一样的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只须要从该Session中查找该客户的状态就能够了。

  虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然须要客户端浏览器的支持。这是由于Session 须要使用Cookie做为识别标志。HTTP协议是无状态的,Session不能依据HTTP链接来判断是否为同一客户,所以服务器向客户端浏览器发送一 个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session 依据该Cookie来识别是否为同一用户。该Cookie为服务器自动生成的,它的maxAge属性通常为–1,表示仅当前浏览器内有效,而且各浏览器窗口间不共享,关闭浏览器就会失效。

  总结一下session与cookie的区别:

  • 保持状态:cookie保存在浏览器端,session保存在服务器端
  • 使用方式:

    (1)cookie机制:若是不在浏览器中设置过时时间,cookie被保存在内存中,生命周期随浏览器的关闭而结束,这种cookie简称会话cookie。若是在浏览器中设置了cookie的过时时间,cookie被保存在硬盘中,关闭浏览器后,cookie数据仍然存在,直到过时时间结束才消失。

         Cookie是服务器发给客户端的特殊信息,cookie是以文本的方式保存在客户端,每次请求时都带上它

    (2)session机制:当服务器收到请求须要建立session对象时,首先会检查客户端请求中是否包含sessionid。若是有sessionid,服务器将根据该id返回对应session对象。若是客户端请求中没有sessionid,服务器会建立新的session对象,并把sessionid在本次响应中返回给客户端。一般使用cookie方式存储sessionid到客户端,在交互中浏览器按照规则将sessionid发送给服务器。若是用户禁用cookie,则要使用URL重写,能够经过response.encodeURL(url) 进行实现;API对encodeURL的结束为,当浏览器支持Cookie时,url不作任何处理;当浏览器不支持Cookie的时候,将会重写URL将SessionID拼接到访问地址后。

  • 存储内容:cookie只能保存字符串类型,以文本的方式;session经过相似于Hashtable的数据结构来保存,能支持任何类型的对象(session中可含有多个对象)
  • 存储的大小:cookie:单个cookie保存的数据不能超过4kb;session大小没有限制。
  • 安全性:cookie:针对cookie所存在的攻击:Cookie欺骗,Cookie截获;session的安全性大于cookie。

      缘由以下:(1)sessionID存储在cookie中,若要攻破session首先要攻破cookie;

           (2)sessionID是要有人登陆,或者启动session_start才会有,因此攻破cookie也不必定能获得sessionID;

           (3)第二次启动session_start后,前一次的sessionID就是失效了,session过时后,sessionID也随之失效。

           (4)sessionID是加密的

           (5)综上所述,攻击者必须在短期内攻破加密的sessionID,这很难。

  • 应用场景和缺点等等  参考资料:浅谈session,cookie,sessionStorage,localStorage的区别及应用场景

68.说一下 session 的工做原理?

  Session字面含义就是会话。因为HTTP是无状态协议,为了保持浏览器与服务器之间的联系,才有了Session。Session就是用于在服务器端保存用户状态的协议。一般用来保存用户的登陆状态。

  工做原理:

  Session内容保存在服务器端的,一般是保存在内存中,固然也能够保存在文件、数据库等等。客户端跟服务器端经过SessionId来关联, SessionId一般以Cookie的形式存储在客户端。每次HTTP请求,SessionId都会随着Cookie被传递到服务器端,这样就能够经过SessionId取到对应的信息,来判断这个请求来自于哪一个客户端/用户。

  添加购物车场景示例:

  • 核心对象&职责

对象

职责

SessionId

负责标识客户端/用户

HTTP

负责传递SessionId

Cookie

负责保存SessionId

服务器

负责保存Session内容

Session的工做原理和使用经验

69.若是客户端禁止 cookie 能实现 session 还能用吗?

   此处cookie的做用是HTTP请求时传递sessionID,不经过cookie也能够传递,即经过URL地址重写。

  URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写 到URL地址中。服务器可以解析重写后的URL获取Session的id。这样即便客户端不支持Cookie,也可使用Session来记录用户状态。 

70.spring mvc 的工做原理?

  首先用户发送请求——>DispatcherServlet,DispatcherServlet——>HandlerMapping匹配到具体的URL,再经过HandlerAdapter调用具体的HandlerMethod,当Handler执行完成后返回ModelAndView,会被ViewResolver解析,调用具体的物理视图。最终响应给客户端浏览器。

  SpringMVC工做原理

71.如何避免 sql 注入?

  SQL注入指的是发生在Web应用对后台数据库查询语句处理存在的安全漏洞,简单的说,就是在输入字符串中嵌入SQL指令,在设计程序中忽略了对特殊字符串的检查,这些嵌入的指令便会被误认为正常的SQL指令,在数据库中执行,所以能够对后台数据库进行查看等工做,甚至破快后台数据库形成严重后果。

  避免SQL注入的方法:

  • 输入验证:检查用户输入的合法性,尽可能的限制用户输入特殊的符号,确信输入的内容只包含合法的数据。数据检查应当在客户端和服务器端都执行之因此要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。
  • 错误消息处理:防范SQL注入,还要避免出现一些详细的错误消息,由于能够利用这些消息。要使用一种标准的输入确认机制来验证全部的输入数据的长度、类型、语句、企业规则等。
  • 加密处理:在一开始的CDNS例子中没有加密的数据就直接被利用了,可是加密了就不必定会解密成功,尽可能不要用一些常见的加密算法,就算用也要使用32位以上的加密算法,将用户登陆名称、密码等数据加密保存。加密用户输入的数据,而后再将它与数据库中保存的数据比较,这至关于对用户输入的数据进行了“消毒”处理,用户输入的数据再也不对数据库有任何特殊的意义,从而也就防止了注入SQL命令。
  • 存储过程来执行全部的查询:SQL参数的传递方式将防止利用单引号和连字符实施注入。此外,它还使得数据库权限能够限制到只容许特定的存储过程执行,全部的用户输入必须听从被调用的存储过程的安全上下文,这样就很难再发生注入式了。

  SQL注入其实很简单,别一不留神就被利用了

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

  跨站脚本(cross site script)为了不与样式css混淆,因此简称为XSS。

  XSS是一种常常出如今web应用中的计算机安全漏洞,也是web中最主流的攻击方式。那么什么是XSS呢?XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去。使别的用户访问都会执行相应的嵌入代码。从而盗取用户资料、利用用户身份进行某种动做或者对访问者进行病毒侵害的一种攻击方式。

  主要缘由:过于信任客户端提交的数据!

  解决办法:不信任任何客户端提交的数据,只要是客户端提交的数据就应该先进行相应的过滤处理而后方可进行下一步的操做。

  一、将重要的cookie标记为http only, 这样的话Javascript 中的document.cookie语句就不能获取到cookie了.

  二、表单数据规定值的类型,例如:年龄应为只能为int、name只能为字母数字组合。。。。

  四、对数据进行Html Encode 处理

  五、过滤或移除特殊的Html标签, 例如: <script>, <iframe> , &lt; for <, &gt; for >, &quot for

  六、过滤JavaScript 事件的标签。例如 "onclick=", "onfocus" 等等。

  xss跨站脚本攻击

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

  CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

  你这能够这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF可以作的事情包括:以你名义发送邮件,发消息,盗取你的帐号,甚至于购买商品,虚拟货币转帐......形成的问题包括:我的隐私泄露以及财产安全。

  下图简单阐述了CSRF攻击的思想:

  

  从上图能够看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤:

  1.登陆受信任网站A,并在本地生成Cookie。

  2.在不登出A的状况下,访问危险网站B。

  CSRF攻击之因此可以成功,是由于攻击者能够伪造用户的请求,该请求中全部的用户验证信息都存在于Cookie中,所以攻击者能够在不知道这些验证信息的状况下直接利用用户本身的Cookie来经过安全验证。由此可知,抵御CSRF攻击的关键在于:在请求中放入攻击者所不能伪造的信息,而且该信息不存在于Cookie之中。

  鉴于此,咱们将为每个表单生成一个随机数秘钥,并在服务器端创建一个拦截器来验证这个token,若是请求中没有token或者token内容不正确,则认为多是CSRF攻击而拒绝该请求。

  CSRF攻击与防护

  浅谈CSRF攻击方式

相关文章
相关标签/搜索