乐趣区

关于面试:面试Java-Web

Java Web

jsp 简介:
HTML 善于显示页面,然而它并不能调用 Java 代码动静的生成内容;Servlet 善于调用 Java 程序,生成动静内容,然而 Servlet 不善于显示页面。
 jsp(Java Server Pages)联合了 HTML 和 Servlet 的长处,实质上是运行在服务端的一个 Servlet,Tomcat 等 Servlet 容器会将 jsp 文件中的内容通过 out.write()、out.print()等办法间接输入给浏览器,浏览器获取到的仍然是一个 html 文档,而后再进行渲染等

JSP 根本语法
 1、模板元素
  模板元素指就是 JSP 中的 HTML 代码,模板元素的内容会作为 out.write() 的参数,间接输入到页面中,在 HTML 中怎么写,在 JSP 中就怎么写
2、脚本片段
  脚本片段写在 <% %> 中,能够在脚本片段中间接编写 Java 代码,脚本片段会一成不变的复制到 java 文件的 service 办法中的对应地位
3、表达式
  JSP 的表达式写在 <%= %> 中,JSP 表达式能够将一个对象间接输入到页面中,JSP 表达式中的内容最终会作为 out.print() 办法的参数,输入到页面中
4、正文
  JSP 的正文写在 <%– –%> 中
5、申明
  JSP 中的申明写在 <%! %> 中
6、JSP 指令
  JSP 指令的格局:<%@ 指令名 属性名 1 =”属性值 1”属性名 2 =”属性值 2”%>,举例:
  a、page 指令:b、include 指令 c、taglib 指令
7、JSP 动作标签格局:<jsp: 标签名 属性名 =“属性值”></jsp: 标签名 >
a、申请转发

<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 个内置对象别离是什么?作用是什么?

JSP 有 9 个内置对象:

  • 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 有什么区别?

1、存储地位不同

cookie 的数据信息寄存在客户端浏览器上。

session 的数据信息寄存在服务器上。

2、存储容量不同

单个 cookie 保留的数据 <=4KB,一个站点最多保留 20 个 Cookie。

对于 session 来说并没有下限,但出于对服务器端的性能思考,session 内不要寄存过多的货色,并且设置 session 删除机制。

3、存储形式不同

cookie 中只能保存 ASCII 字符串,并须要通过编码方式存储为 Unicode 字符或者二进制数据。

session 中可能存储任何类型的数据,包含且不限于 string,integer,list,map 等。

4、隐衷策略不同

cookie 对客户端是可见的,所以它是不平安的。

session 存储在服务器上,不存在敏感信息透露的危险。

5、有效期上不同

能够通过设置 cookie 的属性,达到使 cookie 长期有效的成果。

session 依赖于名为 JSESSIONID 的 cookie,而 cookie JSESSIONID 的过期工夫默认为 -1,只需敞开窗口该 session 就会生效,因此 session 不能达到长期有效的成果。session 的过期工夫是从 session 不流动的时候开始计算(如果 session 始终流动,session 就总不会过期,从该 Session 未被拜访, 开始计时; 一旦 Session 被拜访, 计时清 0);

6、服务器压力不同

cookie 保存在客户端,不占用服务器资源。对于并发用户非常多的网站,cookie 是很好的抉择。

session 是保存在服务器端的,每个用户都会产生一个 session。如果并发拜访的用户非常多,会产生非常多的 session,消耗大量的内存。

7、浏览器反对不同

如果客户端浏览器不反对 cookie:

cookie 是须要客户端浏览器反对的,如果客户端禁用了 cookie,或者不反对 cookie,则会话跟踪会生效。

使用 session 须要应用 URL 地址重写的形式。所有用到 session 程序的 URL 都要进行 URL 地址重写,否则 session 会话跟踪还会生效。

如果客户端反对 cookie:

cookie 既可能设为本浏览器窗口以及子窗口内无效,也可能设为所有窗口内无效。

session 只能在本窗口以及子窗口内无效。

8、跨域反对上不同

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,其实现路径有以下几种:

  1. 设置 php.ini 配置文件中的“session.use_trans_sid = 1”,或者编译时关上关上了“–enable-trans-sid”选项,让 PHP 主动跨页传递 Session ID。
  2. 手动通过 URL 传值、暗藏表单传递 Session ID。
  3. 用文件、数据库等模式保留 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 注入?

  1. PreparedStatement(简略又无效的办法)
  2. 应用正则表达式过滤传入的参数
  3. 字符串过滤
  4. JSP 中调用该函数查看是否包函非法字符
  5. 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 泄露到其余网站中去。

退出移动版