面试-Java Web

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 有什么区别?正则表达式

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

65. jsp 的9个内置对象分别是什么?做用是什么?spring

JSP有9个内置对象:sql

  • request:封装客户端的请求,其中包含来自GET或POST请求的参数;
  • response:封装服务器对客户端的响应;
  • pageContext:经过该对象能够获取其余对象;
  • session:封装用户会话的对象;
  • application:封装服务器运行环境的对象;
  • out:输出服务器响应的输出流对象;
  • config:Web应用的配置对象;
  • page:JSP页面自己(至关于Java程序中的this);
  • exception:封装页面抛出异常的对象。

66. 说一下 jsp 的 4 种做用域?跨域

JSP中的四种做用域包括page、request、session和application,具体来讲:浏览器

  • pageContext对象,最小的域对象,能够在当前页面中共享数据,一旦切换页面,则域中的属性就会丢失,该对象主要用来向标签中传递数据。
  • request对象,能够在一次请求中共享数据,一旦发送屡次请求,则域中的属性就会丢失。主要用于在转发时共享数据(request域中属性在转发时有效,重定向时无效)。
  • session对象,能够在一次会话中共享数据,一旦会话结束则域中的属性丢失。会话:就是一次打开关闭浏览器的过程。
  • application对象,是最大的域对象,做用范围是整个项目,只要不关闭服务器则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。

  1. 经过url重写把 session id 做为参数追加的原 url 中,后续的浏览器与服务器交互中携带 session id 参数。
  2. 服务器的返回数据中包含 session id,浏览器发送请求时,携带 session id 参数
  3. 经过 Http 协议其余 header 字段,服务器每次返回时设置该 header 字段信息,浏览器中 js 读取该 header 字段,请求服务器时,js设置携带该 header 字段。

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 注入?

  1. PreparedStatement(简单又有效的方法)
    采用预编译语句集,输出的SQL是把整个参数用引号包起来,并把参数中的引号做为转义字符,从而避免了参数也做为条件的一部分,只要使用它的setXXX方法传值便可
    sql注入只对sql语句的准备(编译)过程有破坏做用,PreparedStatement参数不是简单拼接生成sql,而是先用?占位,以后再根据参数产生sql,所以也就避免了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();
  1. 使用正则表达式过滤传入的参数
  2. 字符串过滤
  3. JSP中调用该函数检查是否包函非法字符
  4. JSP页面判断代码
    使用javascript在客户端进行不安全字符屏蔽
    功能介绍:检查是否含有”‘”,”\”,”/”

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 攻击。
  1. 使用验证码
关键操做页面加上验证码,后台收到请求后经过判断验证码能够防护CSRF。但这种方法对用户不太友好。
  1. 在请求地址中添加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以参数的形式加入请求了。
  1. 在HTTP 头中自定义属性并验证
这种方法也是使用 token 并进行验证,和上一种方法不一样的是,这里并非把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。经过 XMLHttpRequest 这个类,能够一次性给全部该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,经过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担忧 token 会透过 Referer 泄露到其余网站中去。
相关文章
相关标签/搜索