java Web
1、JSP和Servlet的异同及联系
异同:
- JSP经过编译之后就变成了Servlet(JSP本质上是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的类)。
- JSP更擅长于表现页面显示;Servlet更擅长于逻辑控制。
- 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有哪些内置对象?都有哪些作用?
- Page指的是JSP被翻译成Servlet的对象的引用。
- PageContext对象可以用来获取其他8个内置对象,还可以作为JSP的域范围对象使用,PageContext中存的值是当前的页面的作用范围。
- request代表请求对象,可以用来获取客户机的信息,也可以作为域对象来使用,使用request保存的数据在一次请求范围内有效。
- Session代表的是一次会话,可以用于保存用户的私有的信息,也可以作为域对象来使用,用Session保存的数据在一次会话范围内有效。
- Application代表整个应用范围,使用这个对象保存的数据在整个web应用中有效。
- Respose是响应对象,代表的是从服务器向响应器响应数据。
- Out:JSPWriter是用于向页面输出内容的对象。
- Config:指的是Servlet用于JSP翻译成Servlet后,获得Servlet的配置的对象。
- Exception:在页面中设置isErrorPage=“true”即可使用,是Throwable的引用,用来获得页面的错误信息。
2、JSP的四大作用域
- application:服务器启动到停止这段时间
application作用域上的信息传递是通过ServletContext实现的。
Object getAttribute(String name):从application中获取信息。
void setAttribute(String name,Object Value):向application作用域中设置信息。 - session:HTTP会话开始到结束这段时间
Session作用域:同一浏览器对服务器进行多次访问,Session是通过HTTPSession接口实现的。
Object HTTPSession.getAttribute(String name)从session中保存信息。
HTTPSession HTTPServletRequest。getSession()获取当前请求所在是Session对象。
会话开始:Session从浏览器发出第一个HTTP请求开始。
关闭:浏览器关闭并不会通知服务器,判断方法:在一定时间内,客户端无反应,认为会话结束,Tomcat默认值是120分钟,也可以主动让会话结束。 - request:HTTP请求开始到结束这段时间
一个HTTP请求的处理可能需要多个Servlet合作,而这几个Servlet之间通过某种方式传递信息,但这个信息在请求结束后无效。
void SetAttribute(String name,Object Value)将对象Value以name为名称保存到request作用域中。
Object getAttribute(String name)从request作用域中取得指定名字信息。 - page:当前页面会打开到关闭这段时间
Page对象的作用范围仅限于用户请求的当前页面,对于Page对象的引用将在响应返回客户端之后被释放,或者在请求被转发到其他地方后被释放,对于Page对象的引用通常存储在PageContext对象中。 - 以上介绍的作用范围越来越小,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是保存在服务器端的。
- 浏览器向服务器发送一个请求,在服务器端没有开启Session的情况下,只是普通的数据交流,在服务器端开启Session后,把相应的数据存在Session中,通过响应头setcookie返回给浏览器。
- 这时浏览器把服务器返回的值写到cookie中。
- 再次请求时,浏览器通过请求头把cookie里面的信息闯到服务器端。
- 服务器端接到浏览器传来的值时,与原先存好的值作比较,判断是否为同一用户,最后进行业务逻辑处理。
- Session生命周期
当Session超过一定时间(默认为30分钟),没有被访问时,服务器就会认为这个Session对应的客户端已经停止活动,然后将这个Session删除,用以节省空间。
当用户关闭浏览器时,SessionId的信息全部丢失,虽然服务器Session还在,依然无法访问到Session中的数据。
5、客户端禁止了cookie,Session还能实现吗?
一般默认情况下,在会话中,服务器存储Session的SessionId是通过cookie存到浏览器中的,如果浏览器禁用了cookie,浏览器请求服务器无法携带SessionId,服务器无法识别请求中用户的身份Session失效,但是可以通过其他方法在禁用cookie的情况下,可以继续使用Session:
- 通过url重写,把SessionId作为参数追加到原url中,后续的浏览器与服务器交互中,携带SessionId参数。
- 服务器的返回数据中包含SessionId,浏览器发送请求时携带SessionId参数。
- 通过HTTP协议其他header字段,服务器每次返回时设置该header字段信息,浏览器中js读取该header字段,请求服务器时,js设置携带该header字段。
6、什么是sql注入,如何避免?
sql注入是一种注入攻击,可以执行恶意sql语句,它通过将任意SQL代码数据库查询,使攻击者能够完全控制Web应用程序的数据库服务器,攻击者可以使用sql注入漏洞绕过应用程序安全措施,可以绕过网页或者web应用程序的身份验证和授权,可以检索多个SQL数据库的内容,还可以使用sql注入来对数据库中的数据进行增删改查。
如何避免:
- 不是动态sql:
避免将用户提供的输入内容,直接放到sql语句中,最好使用准备好的语句和参数化来查询,这样做更安全。 - 不将敏感数据保留在纯文本中:
加密存储在数据库中的私有/机密数据,这样也提供了另一级保护,以防止攻击者成功的排出敏感数据。 - 限制数据库权限和特权
将数据库用户的功能设置为最低要求,这样将限制攻击者在设法获取访问权限时可执行的操作。 - 避免直接向用户展示数据库错误
攻击者可以使用这些错误信息来获取又换数据库的信息。 - 对数据库的web应用程序使用web应用程序防火墙。
- 定期检查与数据库交互的web应用程序。
- 将数据库更新成最新的可用修补程序。
7、什么是XSS攻击,如何避免?
XSS攻击:即跨站脚本攻击(Cross Site Scripting),它是web中常见的漏洞,原理是攻击者往web页面里插入恶意的脚本代码(CSS代码,javascript代码),当用户浏览该页面时,嵌入其中的脚本代码会被执行,从而达到恶意攻击用户的目的,如盗取用户cookie,破坏页面结构,重定向到其他网站等。
它分为非持久型XSS攻击和持久型XSS攻击。
解决方案
- 利用php html entitoies()函数对传入参数的非法的HTML代码,包括单双引号等进行转义,但是在中文情况下,html entities()却会转化所有的html代码,包括无法识别的中文符也转换了。
- 利用php HTMLspecialchars()函数对传入参数的非法的HTML代码包括单双引号等进行转义,需要注意的是第二个参数默认的是ENT_COMPAT,函数默认只是转化双引号(“),不对单引号(‘)做转义。
- 通过正则表达式过滤传入参数的html标签来防范XSS攻击。
8、什么是CSRF攻击,如何预防?
CSRF(Cross-Site request forgery)另称为one-click attrack/session riding,跨站请求伪造,一般来说,攻击者伪造用户的浏览器请求,向访问一个用户曾认证过的网站发送,使目标网站接收并误以为是用户的真实操作而执行命令,用于盗号,转账,发送虚假信息。
- 验证HTTP,Referer字段。
- 使用验证码(页面加上验证码)。
- 在请求地址中添加token并验证。
- 在HTTP头中自定义属性并验证。