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 泄露到其余网站中去。