64. jsp 和 servlet 有什么差异?

jsp经编译后就变成了Servlet.(JSP的实质便是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)jsp更善于表现于页面显示,servlet更善于于逻辑掌握。
Servlet中没有内置工具,Jsp中的内置工具都是必须通过HttpServletRequest工具,HttpServletResponse工具以及HttpServlet工具得到。
Jsp是Servlet的一种简化,利用Jsp只须要完成程序员须要输出到客户真个内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。
而Servlet则是个完全的Java类,这个类的Service方法用于天生对客户真个相应。

65. jsp 有哪些内置工具?浸染分别是什么?

JSP有9个内置工具:

jsp当输入字符串不为数字时显示输入非法Java 最常见的 208 道面试题第六模块谜底 CSS

request:封装客户真个要求,个中包含来自GET或POST要求的参数;response:封装做事器对客户真个相应;pageContext:通过该工具可以获取其他工具;session:封装用户会话的工具;application:封装做事器运行环境的工具;out:输出做事器相应的输出流工具;config:Web运用的配置工具;page:JSP页面本身(相称于Java程序中的this);exception:封装页面抛出非常的工具。

66. 说一下 jsp 的 4 种浸染域?

JSP中的四种浸染域包括page、request、session和application,详细来说:

page代表与一个页面干系的工具和属性。
request代表与Web客户机发出的一个要求干系的工具和属性。
一个要求可能超过多个页面,涉及多个Web组件;须要在页面显示的临时数据可以置于此浸染域。
session代表与某个用户与做事器建立的一次会话干系的工具和属性。
跟某个用户干系的数据该当放在用户自己的session中。
application代表与全体Web运用程序干系的工具和属性,它本色上是超过全体Web运用程序,包括多个页面、要乞降会话的一个全局浸染域。

67. session 和 cookie 有什么差异?

由于HTTP协议是无状态的协议,以是做事端须要记录用户的状态时,就须要用某种机制来识详细的用户,这个机制便是Session.范例的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,以是并不知道是哪个用户操作的,以是做事端要为特定的用户创建了特定的Session,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。
这个Session是保存在做事真个,有一个唯一标识。
在做事端保存Session的方法很多,内存、数据库、文件都有。
集群的时候也要考虑Session的转移,在大型的网站,一样平常会有专门的Session做事器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,利用一些缓存做事比如Memcached之类的来放 Session。
思考一下做事端如何识别特定的客户?这个时候Cookie就登场了。
每次HTTP要求的时候,客户端都会发送相应的Cookie信息到做事端。
实际上大多数的运用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,做事端会在HTTP协议中见告客户端,须要在 Cookie 里面记录一个Session ID,往后每次要求把这个会话ID发送到做事器,我就知道你是谁了。
有人问,如果客户真个浏览器禁用了 Cookie 怎么办?一样平常这种情形下,会利用一种叫做URL重写的技能来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,做事端据此来识别用户。
Cookie实在还可以用在一些方便用户的场景下,设想你某次上岸过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。
这也是Cookie名称的由来,给用户的一点甜头。
以是,总结一下:Session是在做事端保存的一个数据构造,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种办法。

68. 说一下 session 的事情事理?

实在session是一个存在做事器上的类似于一个散列表格的文件。
里面存有我们须要的信息,在我们须要用的时候可以从里面取出来。
类似于一个大号的map吧,里面的键存储的是用户的sessionid,用户向做事器发送要求的时候会带上这个sessionid。
这时就可以从中取出对应的值了。

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

Cookie与 Session,一样平常认为是两个独立的东西,Session采取的是在做事器端保持状态的方案,而Cookie采取的是在客户端保持状态的方案。
但为什么禁用Cookie就不能得到Session呢?由于Session是用Session ID来确定当前对话所对应的做事器Session,而Session ID是通过Cookie来通报的,禁用Cookie相称于失落去了Session ID,也就得不到Session了。

假定用户关闭Cookie的情形下利用Session,实在现路子有以下几种:

设置php.ini配置文件中的“session.use_trans_sid = 1”,或者编译时打开打开了“--enable-trans-sid”选项,让PHP自动跨页通报Session ID。
手动通过URL传值、隐蔽表单通报Session ID。
用文件、数据库等形式保存Session ID,在跨页过程中手动调用。

70. spring mvc 和 struts 的差异是什么?

拦截机制的不同

Struts2是类级别的拦截,每次要求就会创建一个Action,和Spring整合时Struts2的ActionBean注入浸染域是原型模式prototype,然后通过setter,getter吧request数据注入到属性。
Struts2中,一个Action对应一个request,response高下文,在吸收参数时,可以通过属性吸收,这解释属性参数是让多个方法共享的。
Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用表明或其他办法标识其所属方法了,只能设计为多例。

SpringMVC是方法级别的拦截,一个方法对应一个Request高下文,以是方法直接基本上是独立的,独享request,response数据。
而每个方法同时又何一个url对应,参数的通报是直接注入到方法中的,是方法所独占的。
处理结果通过ModeMap返回给框架。
在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,以是默认对所有的要求,只会创建一个Controller,有应为没有共享的属性,所以是线程安全的,如果要改变默认的浸染域,须要添加@Scope表明修正。

Struts2有自己的拦截Interceptor机制,SpringMVC这是用的是独立的Aop办法,这样导致Struts2的配置文件量还是比SpringMVC大。

底层框架的不同

Struts2采取Filter(StrutsPrepareAndExecuteFilter)实现,SpringMVC(DispatcherServlet)则采取Servlet实现。
Filter在容器启动之后即初始化;做事停滞往后坠毁,晚于Servlet。
Servlet在是在调用时初始化,先于Filter调用,做事停滞后销毁。

性能方面

Struts2是类级别的拦截,每次要求对应实例一个新的Action,须要加载所有的属性值注入,SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,有加载一次单例模式bean注入。
以是,SpringMVC开拓效率和性能高于Struts2。

配置方面

spring MVC和Spring是无缝的。
从这个项目的管理和安全上也比Struts2高。

71. 如何避免 sql 注入?

PreparedStatement(大略又有效的方法)利用正则表达式过滤传入的参数字符串过滤JSP中调用该函数检讨是否包函造孽字符JSP页面判断代码

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

XSS攻击又称CSS,全称Cross Site Script (跨站脚本攻击),其事理是攻击者向有XSS漏洞的网站中输入恶意的 HTML 代码,当用户浏览该网站时,这段 HTML 代码会自动实行,从而达到攻击的目的。
XSS 攻击类似于 SQL 注入攻击,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修正/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的掌握,获取用户的一些信息。
XSS是 Web 程序中常见的漏洞,XSS 属于被动式且用于客户真个攻击办法。

XSS戒备的总体思路是:对输入(和URL参数)进行过滤,对输出进行编码。

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

CSRF(Cross-site request forgery)也被称为 one-click attack或者 session riding,中文全称是叫跨站要求假造。
一样平常来说,攻击者通过假造用户的浏览器的要求,向访问一个用户自己曾经认证访问过的网站发送出去,使目标网站吸收并误以为是用户的真实操作而去实行命令。
常用于盗取账号、转账、发送虚假等。
攻击者利用网站对要求的验证漏洞而实现这样的攻击行为,网站能够确认要求来源于用户的浏览器,却不能验证要求是否源于用户的真实意愿下的操作行为。

如何避免:

1. 验证 HTTP Referer 字段

HTTP头中的Referer字段记录了该 HTTP 要求的来源地址。
在常日情形下,访问一个安全受限页面的要求来自于同一个网站,而如果黑客要对实在行 CSRF

攻击,他一样平常只能在他自己的网站布局要求。
因此,可以通过验证Referer值来防御CSRF 攻击。

2. 利用验证码

关键操作页面加上验证码,后台收到要求后通过判断验证码可以防御CSRF。
但这种方法对用户不太友好。

3. 在要求地址中添加token并验证

CSRF 攻击之以是能够成功,是由于黑客可以完备假造用户的要求,该要求中所有的用户验证信息都是存在于cookie中,因此黑客可以在不知道这些验证信息的情形下直策应用用户自己的cookie 来通过安全验证。
要抵御 CSRF,关键在于在要求中放入黑客所不能假造的信息,并且该信息不存在于 cookie 之中。
可以在 HTTP 要求中以参数的形式加入一个随机产生的 token,并在做事器端建立一个拦截器来验证这个 token,如果要求中没有token或者 token 内容禁绝确,则认为可能是 CSRF 攻击而谢绝该要求。
这种方法要比检讨 Referer 要安全一些,token 可以在用户上岸后产生并放于session之中,然后在每次要求时把token 从 session 中拿出,与要求中的 token 进行比对,但这种方法的难点在于如何把 token 以参数的形式加入要求。

对付 GET 要求,token 将附在要求地址之后,这样 URL 就变成 http://url?csrftoken=tokenvalue。

而对付 POST 要求来说,要在 form 的末了加上 <input type=\"大众hidden\"大众 name=\"大众csrftoken\公众 value=\"大众tokenvalue\"大众/&gt;,这样就把token以参数的形式加入要求了。

4. 在HTTP 头中自定义属性并验证

这种方法也是利用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 要求之中,而是把它放到 HTTP 头中自定义的属性里。
通过 XMLHttpRequest 这个类,可以一次性给所有该类要求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入个中。
这样办理了上种方法在要求中加入 token 的不便,同时,通过 XMLHttpRequest 要求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 透露到其他网站中去。