[java面试]之java Web

java Web

1、JSP和Servlet的异同及联系

异同:

  1. JSP经过编译之后就变成了Servlet(JSP本质上是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的类)。
  2. JSP更擅长于表现页面显示;Servlet更擅长于逻辑控制。
  3. Servlet中没有内置对象,JSP中内置对象都是必须通过HTTPServletRespose对象,HttpServletResquest对象以及HTTPServlet对象得到。
    JSP是Servlet的一种简化,使用JSP只需要完成程序员需要输出到客户端的内容,JSP中的java脚本如何镶嵌到一个类中,都是由JSP容器完成,而Servlet则是一个完整的java类,这个类的Service方法用于生成对客户端的响应。

联系:
JSP是Servlet技术的扩展,本质上就是Servlet的简易方式,JSP编译后是“类Servlet”,Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在java文件中,并且完全从表示层中的HTML里分离开来,而JSP的情况是java和HTML可以组合成一个扩展名为.JSP的文件,JSP侧重于视图,Servlet侧重于控制逻辑。

2、JSP有哪些内置对象?都有哪些作用?

  1. Page指的是JSP被翻译成Servlet的对象的引用。
  2. PageContext对象可以用来获取其他8个内置对象,还可以作为JSP的域范围对象使用,PageContext中存的值是当前的页面的作用范围。
  3. request代表请求对象,可以用来获取客户机的信息,也可以作为域对象来使用,使用request保存的数据在一次请求范围内有效。
  4. Session代表的是一次会话,可以用于保存用户的私有的信息,也可以作为域对象来使用,用Session保存的数据在一次会话范围内有效。
  5. Application代表整个应用范围,使用这个对象保存的数据在整个web应用中有效。
  6. Respose是响应对象,代表的是从服务器向响应器响应数据。
  7. Out:JSPWriter是用于向页面输出内容的对象。
  8. Config:指的是Servlet用于JSP翻译成Servlet后,获得Servlet的配置的对象。
  9. Exception:在页面中设置isErrorPage=“true”即可使用,是Throwable的引用,用来获得页面的错误信息。
2、JSP的四大作用域
  1. application:服务器启动到停止这段时间
    application作用域上的信息传递是通过ServletContext实现的。
    Object getAttribute(String name):从application中获取信息。
    void setAttribute(String name,Object Value):向application作用域中设置信息。
  2. session:HTTP会话开始到结束这段时间
    Session作用域:同一浏览器对服务器进行多次访问,Session是通过HTTPSession接口实现的。
    Object HTTPSession.getAttribute(String name)从session中保存信息。
    HTTPSession HTTPServletRequest。getSession()获取当前请求所在是Session对象。
    会话开始:Session从浏览器发出第一个HTTP请求开始。
    关闭:浏览器关闭并不会通知服务器,判断方法:在一定时间内,客户端无反应,认为会话结束,Tomcat默认值是120分钟,也可以主动让会话结束。
  3. request:HTTP请求开始到结束这段时间
    一个HTTP请求的处理可能需要多个Servlet合作,而这几个Servlet之间通过某种方式传递信息,但这个信息在请求结束后无效。
    void SetAttribute(String name,Object Value)将对象Value以name为名称保存到request作用域中。
    Object getAttribute(String name)从request作用域中取得指定名字信息。
  4. page:当前页面会打开到关闭这段时间
    Page对象的作用范围仅限于用户请求的当前页面,对于Page对象的引用将在响应返回客户端之后被释放,或者在请求被转发到其他地方后被释放,对于Page对象的引用通常存储在PageContext对象中。
  5. 以上介绍的作用范围越来越小,request和Page的生命周期都是短暂的,一个request可以包含多个page页。
3、Session和Cookie的区别
  • Session称为会话技术,位于web服务器上,主要负责访问者与网站之间的交互,当访问浏览器请求http地址时,将传递到web服务器上,并与访问信息进行匹配,当关闭网站时,就表示会话已经结束了,网站无法访问该信息了,所以它无法保存永久数据,我们无法访问以及禁用网站。
  • Cookie,位于用户的计算机上,用来维护用户计算机中的信息,知道用户删除,如果登录某个软件输入用户名及密码时保存为cookie,则我们每次访问的时候就不需要登录网站了,我们可以在浏览器上保存任何文本,而且我们还可以随时随地的去阻止或者删除它,我们同样也可以禁用或者编辑cookie,但是有一点需要注意,不要使用cookie来存储一些隐私数据以防止隐私泄露。
    1、cookie以文本文件格式存储在浏览器中(客户的浏览器端),而Session存储在服务器端。
    2、cookie不是很安全的,别人可以分析存放在本地cookie,并且进行cookie欺骗,考虑到安全问题时,应该使用session。
    3、Session会在一定时间内保存到服务器上,当访问增多时,会比较占用服务器的性能,考虑到减轻服务器性能方面,应使用cookie。
    4、单个cookie保存的数据不能超过4kb,很多浏览器都限制一个站点最多保存20个cookie。
    5、可以考虑将重要信息(如登录信息)存放在Session,其他信息如果需要保留,则可以存放在cookie中。
    6、session是通过cookie来工作的。
4、Session工作原理

Session是保存在服务器端的。

  1. 浏览器向服务器发送一个请求,在服务器端没有开启Session的情况下,只是普通的数据交流,在服务器端开启Session后,把相应的数据存在Session中,通过响应头setcookie返回给浏览器。
  2. 这时浏览器把服务器返回的值写到cookie中。
  3. 再次请求时,浏览器通过请求头把cookie里面的信息闯到服务器端。
  4. 服务器端接到浏览器传来的值时,与原先存好的值作比较,判断是否为同一用户,最后进行业务逻辑处理。
  5. Session生命周期
    当Session超过一定时间(默认为30分钟),没有被访问时,服务器就会认为这个Session对应的客户端已经停止活动,然后将这个Session删除,用以节省空间。
    当用户关闭浏览器时,SessionId的信息全部丢失,虽然服务器Session还在,依然无法访问到Session中的数据。
5、客户端禁止了cookie,Session还能实现吗?

一般默认情况下,在会话中,服务器存储Session的SessionId是通过cookie存到浏览器中的,如果浏览器禁用了cookie,浏览器请求服务器无法携带SessionId,服务器无法识别请求中用户的身份Session失效,但是可以通过其他方法在禁用cookie的情况下,可以继续使用Session:

  1. 通过url重写,把SessionId作为参数追加到原url中,后续的浏览器与服务器交互中,携带SessionId参数。
  2. 服务器的返回数据中包含SessionId,浏览器发送请求时携带SessionId参数。
  3. 通过HTTP协议其他header字段,服务器每次返回时设置该header字段信息,浏览器中js读取该header字段,请求服务器时,js设置携带该header字段。
6、什么是sql注入,如何避免?

sql注入是一种注入攻击,可以执行恶意sql语句,它通过将任意SQL代码数据库查询,使攻击者能够完全控制Web应用程序的数据库服务器,攻击者可以使用sql注入漏洞绕过应用程序安全措施,可以绕过网页或者web应用程序的身份验证和授权,可以检索多个SQL数据库的内容,还可以使用sql注入来对数据库中的数据进行增删改查。

如何避免:

  1. 不是动态sql:
    避免将用户提供的输入内容,直接放到sql语句中,最好使用准备好的语句和参数化来查询,这样做更安全。
  2. 不将敏感数据保留在纯文本中:
    加密存储在数据库中的私有/机密数据,这样也提供了另一级保护,以防止攻击者成功的排出敏感数据。
  3. 限制数据库权限和特权
    将数据库用户的功能设置为最低要求,这样将限制攻击者在设法获取访问权限时可执行的操作。
  4. 避免直接向用户展示数据库错误
    攻击者可以使用这些错误信息来获取又换数据库的信息。
  5. 对数据库的web应用程序使用web应用程序防火墙。
  6. 定期检查与数据库交互的web应用程序。
  7. 将数据库更新成最新的可用修补程序。
7、什么是XSS攻击,如何避免?

XSS攻击:即跨站脚本攻击(Cross Site Scripting),它是web中常见的漏洞,原理是攻击者往web页面里插入恶意的脚本代码(CSS代码,javascript代码),当用户浏览该页面时,嵌入其中的脚本代码会被执行,从而达到恶意攻击用户的目的,如盗取用户cookie,破坏页面结构,重定向到其他网站等。
它分为非持久型XSS攻击和持久型XSS攻击。
解决方案

  1. 利用php html entitoies()函数对传入参数的非法的HTML代码,包括单双引号等进行转义,但是在中文情况下,html entities()却会转化所有的html代码,包括无法识别的中文符也转换了。
  2. 利用php HTMLspecialchars()函数对传入参数的非法的HTML代码包括单双引号等进行转义,需要注意的是第二个参数默认的是ENT_COMPAT,函数默认只是转化双引号(“),不对单引号(‘)做转义。
  3. 通过正则表达式过滤传入参数的html标签来防范XSS攻击。
8、什么是CSRF攻击,如何预防?

CSRF(Cross-Site request forgery)另称为one-click attrack/session riding,跨站请求伪造,一般来说,攻击者伪造用户的浏览器请求,向访问一个用户曾认证过的网站发送,使目标网站接收并误以为是用户的真实操作而执行命令,用于盗号,转账,发送虚假信息。

  1. 验证HTTP,Referer字段。
  2. 使用验证码(页面加上验证码)。
  3. 在请求地址中添加token并验证。
  4. 在HTTP头中自定义属性并验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值