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页面判断map的可以208道Java 高频面试题谜底5 RESTful API

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\"大众/>,这样就把token以参数的形式加入要求了。

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

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

微信公众年夜众号【程序员乔戈里】 作者乔戈里,斜杠青年,哈工大本硕985 硕士,百度Java 研发工程师,目前致力于分享求职必备学习履历、求职心得和发展感悟/技能文章。
(关注"大众号送9000G 考研/python/C++/java/前端/小程序/微信"大众号/机器学习/人工智能资源)