64. jsp 和 servlet 有什么区别? 65. jsp 的9个内置对象分别是什么?做用是什么? 66. 说一下 jsp 的 4 种做用域? 67. session 和 cookie 有什么区别? 68. 说一下 session 的工做原理? 69. 若是客户端禁止 cookie 能实现 session 还能用吗? 70. spring mvc 和 struts 的区别是什么? 71. 如何避免 sql 注入? 72. 什么是 XSS 攻击,如何避免? 73. 什么是 CSRF 攻击,如何避免?
Java Webjavascript
jsp简介:
HTML擅长显示页面,可是它并不能调用Java代码动态的生成内容;Servlet擅长调用Java程序,生成动态内容,可是Servlet不擅长显示页面。
jsp(Java Server Pages)结合了HTML和Servlet的优势,本质上是运行在服务端的一个Servlet,Tomcat等Servlet容器会将jsp文件中的内容经过out.write()、out.print()等方法直接输出给浏览器,浏览器获取到的依然是一个html文档,而后再进行渲染等html
JSP基本语法
一、模板元素
模板元素指就是JSP中的HTML代码,模板元素的内容会做为out.write()的参数,直接输出到页面中,在HTML中怎么写,在JSP中就怎么写
二、 脚本片断
脚本片断写在 <% %>中,能够在脚本片断中直接编写Java代码,脚本片断会原封不动的复制到java文件的service方法中的对应位置
三、表达式
JSP的表达式写在<%= %>中,JSP表达式能够将一个对象直接输出到页面中,JSP表达式中的内容最终会做为out.print()方法的参数,输出到页面中
四、注释
JSP的注释写在 <%-- --%>中
五、声明
JSP中的声明写在<%! %>中
六、JSP指令
JSP指令的格式:<%@ 指令名 属性名1=”属性值1” 属性名2=”属性值2” %>,举例:
a、page指令:b、include指令c、taglib指令
七、JSP动做标签格式:<jsp:标签名 属性名=“属性值”></jsp:标签名>
a、请求转发java
<jsp:forward page=""></jsp:forward>
b、动态包含程序员
<jsp:include page="/include2/2.jsp"></jsp:include>
64. jsp 和 servlet 有什么区别?正则表达式
65. jsp 的9个内置对象分别是什么?做用是什么?spring
JSP有9个内置对象:sql
66. 说一下 jsp 的 4 种做用域?跨域
JSP中的四种做用域包括page、request、session和application,具体来讲:浏览器
67. session 和 cookie 有什么区别?安全
一、存储位置不一样
cookie的数据信息存放在客户端浏览器上。session的数据信息存放在服务器上。
二、存储容量不一样
单个cookie保存的数据<=4KB,一个站点最多保存20个Cookie。对于session来讲并无上限,但出于对服务器端的性能考虑,session内不要存放过多的东西,而且设置session删除机制。
三、存储方式不一样
cookie中只能保管ASCII字符串,并须要经过编码方式存储为Unicode字符或者二进制数据。session中可以存储任何类型的数据,包括且不限于string,integer,list,map等。
四、隐私策略不一样
cookie对客户端是可见的,因此它是不安全的。session存储在服务器上,不存在敏感信息泄漏的风险。
五、有效期上不一样
能够经过设置cookie的属性,达到使cookie长期有效的效果。Sessinon在用户访问第一次访问服务器时建立,须要注意只有访问JSP、Servlet等程序时才会建立Session,只访问HTML、IMAGE等静态资源并不会建立Session,可调用request.getSession(true)强制生成Session。Tomcat中Session的默认失效时间为20分钟,只需关闭窗口该session就会失效,于是session不能达到长期有效的效果。session的过时时间是从session不活动的时候开始计算(若是session一直活动,session就总不会过时,从该Session未被访问,开始计时; 一旦Session被访问,计时清0);
六、服务器压力不一样
cookie保管在客户端,不占用服务器资源。对于并发用户十分多的网站,cookie是很好的选择。session是保管在服务器端的,每一个用户都会产生一个session。假如并发访问的用户十分多,会产生十分多的session,耗费大量的内存。
七、浏览器支持不一样
假如客户端浏览器不支持cookie:
cookie是须要客户端浏览器支持的,假如客户端禁用了cookie,或者不支持cookie,则会话跟踪会失效。session通常来讲要配合cookie使用,若是用户浏览器禁用了cookie,那么只能使用URL重写来实现session的存储功能。
假如客户端支持cookie:
cookie既可以设为本浏览器窗口以及子窗口内有效,也可以设为一切窗口内有效。session只能在本窗口以及子窗口内有效。
八、跨域支持上不一样
cookie支持跨域名访问。session不支持跨域名访问。
68. 说一下 session 的工做原理?
session相似于map是键值对的形式存在的。经过session.getAttribute("name");获取对应的name参数信息
当用户访问到一个服务器,若是服务器启用Session,服务器就要为该用户建立一个session,在建立这个session的时候,服务器首先检查这个用户发来的请求里是否包含了一个session id,若是存在就去遍历服务端的session文件,找到与这个session id相对应的文件,文件中的key值即是session id,value为当前用户的一些信息,若是客户端请求里不包含有session id,则为该客户端建立一个session并生成一个与此session相关的session id。这个session id是惟一的、不重复的、不容易找到规律的字符串,这个session id将被在本次响应中返回到客户端保存,而保存这个session id的正是cookie经过set-cookie完成,此后的请求都会交换这个 Session ID,进行有状态的会话。
69. 若是客户端禁止 cookie 能实现 session 还能用吗?
Cookie与 Session,通常认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案。
通常默认状况下,在会话中,服务器存储 session 的 session id 是经过 cookie 保存到浏览器里。
若是浏览器禁用了 cookie,浏览器请求服务器没法携带 session id,服务器没法识别请求中的用户身份,session就会失效。
可是能够经过其余方法在禁用 cookie 的状况下,能够继续使用session。
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 注入?
//构建sql语句,以?做为占位符 String sq = "delete from table1 where id=? and name=?" //建立PreparedStatement时就传入sql语句,实现了预编译 PreparedStatement ps = con.prepareStatement(sq); //设置sql语句的占位符的值,注意第一个参数位置是1不是0 ps.setString(1,"03"); ps.setString(2,"mao"); //执行这个PreparedStatement ps.execute();
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,中文全称是叫跨站请求伪造。通常来讲,攻击者经过伪造用户的浏览器的请求,向访问一个用户本身曾经认证访问过的网站发送出去,使目标网站接收并误觉得是用户的真实操做而去执行命令。经常使用于盗取帐号、转帐、发送虚假消息等。攻击者利用网站对请求的验证漏洞而实现这样的攻击行为,网站可以确认请求来源于用户的浏览器,却不能验证请求是否源于用户的真实意愿下的操做行为。
如何避免:
HTTP头中的Referer字段记录了该 HTTP 请求的来源地址。在一般状况下,访问一个安全受限页面的请求来自于同一个网站,而若是黑客要对其实施 CSRF
攻击,他通常只能在他本身的网站构造请求。所以,能够经过验证Referer值来防护CSRF 攻击。
关键操做页面加上验证码,后台收到请求后经过判断验证码能够防护CSRF。但这种方法对用户不太友好。
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以参数的形式加入请求了。
这种方法也是使用 token 并进行验证,和上一种方法不一样的是,这里并非把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。经过 XMLHttpRequest 这个类,能够一次性给全部该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,经过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担忧 token 会透过 Referer 泄露到其余网站中去。