1、jsp和servlet有什么区别和联系?
-
联系:JSP的本质是一个Servlet,它会由服务器的JSP引擎翻译成Servlet并最终执行,JSP可以看做是对Servlet的一种简化。
-
区别:
A、表现形式不同:JSP表现为一个HTML标记和Java代码混合的jsp文件,而Servlet是一个纯粹的java文件
B、是否具有内置对象:JSP有隐式的内置对象,而Servlet没有隐式对象
C、功能侧重不同:JSP更侧重于页面的输出显示,而Servlet更侧重逻辑控制
2、jsp的内置对象有哪些?有什么作用?
- request:表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header和session数据的有用的方法。
- Response:表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等)。
- out:对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。
- pageContext:表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。
- session:表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息。
- application: 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息。
- config:表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。
- page:表示从该页面产生的一个servlet实例。
- exception: 针对错误网页,表示异常对象
3、说一下jsp的4种作用域?
- page作用域:当前页面从打开到关闭这段时间,该作用域中的数据只能在当前的JSP中使用;
- request作用域:HTTP请求开始到响应结束这段时间,该作用域的数据可以在请求转发的多个JSP中使用;
- session作用域:从会话开始到会话结束这段时间,该作用域的数据可以在一个会话的作用范围内的多个JSP中使用,会话默认的时间为30分钟;
- application(ServletContext)作用域:服务器启动到服务器停止这段时间,该作用域的数据可以在服务器运行期间的多个JSP使用;
4、session和cookie的区别?
-
数据存储位置不同:session是将数据存储在服务器端,而cookie是将数据存储在浏览器端;
-
安全性不同:session存储的数据较为安全,而cookie存储的数据安全性较低;
-
是否会消耗服务器的性能:session会占用服务器的性能,而cookie不会占用服务器的性能;
5、说一下session的工作原理?
- 用户第一次向服务器发送请求产生状态数据后,服务器创建一个session对象,将状态数据保存到session中
- 服务器向浏览器返回响应,此时会将第1步中创建的session对象的sessionid以cookie的形式发送到浏览器
- 用户第二次发送请求时,浏览器会将之前的sessionid发送到服务器,服务器通过提取请求中的sessionid从而获取服务器端对应的session对象
- 从session对象中提取之前的状态信息,从而完成状态管理
6、如果客户端禁用cookie那么session还能使用吗?
- 如果客户端禁用cookie,那么会导致服务器端的session无法正常工作
- 因为session的工作流程中需要浏览器保存对应的sessionid,浏览器在每次请求中的请求头中附带sessionid的信息,服务器通过这个sessionid才能找到该浏览器请求对应的会话对象从而实现状态管理
- 如果禁用了cookie,那么浏览器没有对应的sessionid,服务器就无法找到之前存储状态的session对象,也就没有办法完成状态管理
- 解决办法:通过URL重写,将sessionid动态写在所有的访问地址URL后面,这样用户通过URL访问服务器就能在地址后面附带sessionid
7、如何避免SQL的注入攻击?
- 不要使用动态SQL:避免将用户提供的输入直接放入SQL语句中;最好使用准备好的语句和参数化查询,这样更安全。
- 不要将敏感数据保留在纯文本中:加密存储在数据库中的私有/机密数据;这样可以提供了另一级保护,以防攻击者成功地排出敏感数据。
- 限制数据库权限和特权:将数据库用户的功能设置为最低要求;这将限制攻击者在设法获取访问权限时可以执行的操作。
- 避免直接向用户显示数据库错误:攻击者可以使用这些错误消息来获取有关数据库的信息。
- 对访问数据库的Web应用程序使用Web应用程序防火墙(WAF):这为面向Web的应用程序提供了保护,它可以帮助识别SQL注入尝试;根据设置,它还可以帮助防止SQL注入尝试到达应用程序(以及数据库)。
- 定期测试与数据库交互的Web应用程序:这样做可以帮助捕获可能允许SQL注入的新错误或回归。
- 将数据库更新为最新的可用修补程序:这可以防止攻击者利用旧版本中存在的已知弱点/错误。
8、什么是XSS攻击?如何避免?
-
XSS(Cross Site Scripting),即跨站脚本攻击,是一种常见于web应用程序中的计算机安全漏洞.XSS通过在用户端注入恶意的可运行脚本,若服务器端对用户输入不进行处理,直接将用户输入输出到浏览器,然后浏览器将会执行用户注入的脚本。
-
避免:对用户的输入做出过滤,例如将用户输入进行的特殊符号进行转码,例如<>等符号,使用正则表达式验证用户输入等
9、什么是CSRF攻击?如何避免?
-
CSRF(Cross-site request forgery)也被称为 one-click attack或者 session riding,中文全称是叫跨站请求伪造。一般来说,攻击者通过伪造用户的浏览器的请求,向访问一个用户自己曾经认证访问过的网站发送出去,使目标网站接收并误以为是用户的真实操作而去执行命令。常用于盗取账号、转账、发送虚假消息等。攻击者利用网站对请求的验证漏洞而实现这样的攻击行为,网站能够确认请求来源于用户的浏览器,却不能验证请求是否源于用户的真实意愿下的操作行为
-
避免方法:
① 验证 HTTP Referer 字段
② 使用验证码
③ 在请求地址中添加token并验证
④ 在HTTP 头中自定义属性并验证
⑤ AngularJS提供的CSRF方案
10、http响应码301和302代表的是什么?有什么区别?
-
301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)
-
区别:301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。
11、forward和redirect的区别?
-
地址栏表现不同:forward为服务器内部的直接跳转,客户端浏览器并不知道,地址栏内容不变(服务器内部的动作);而redirect为客户端浏览器根据URL地址重新向服务器请求,地址栏变(有可能是请求的URI地址发生变化)
-
能否共享请求中数据:forward可以共享请求中的数据;redirect不能共享请求中的数据
12、Get请求和Post请求的区别?
- 发送的数据是否在地址栏可见不同:Get请求会将发送的数据拼接在请求地址之后,所以地址栏是可见的;post将数据通过报文传输,所以地址栏是不可见的
- 安全性不同:get请求数据安全性低,post请求数据安全性高
- 浏览器是否缓存不同:get请求的数据浏览器会缓存,而post请求的数据不会
- 请求数据大小的限制不同:get请求发送的数据根据各个浏览器产商的规定,会有最大长度的限制,例如IE为2k,欧朋为4k,火狐为8K等,而post请求发送的数据没有大小限制
13、如何实现跨域请求?
-
跨域请求指浏览器可以访问不同域的接口,通俗的说就是在访问的当前web应用中发送一个请求访问另一个Web应用程序。
-
跨域请求的实现方式有:
- JSONP:JSONP是JSON with Padding的简写,是应用JSON的一种方法,
- CORS:跨域资源共享)是W3C定义的一个跨域资源共享规范,规定了在必须访问跨域西原始浏览器与服务器应该如何沟通。
- 降域:在当前网页通过添加iframe,然后在iframe中实现跨域
- postMessage:window.postMessage(message,targetOrigin)方法是html5新引进的特性,可以使用它来向其它的window对象发送消息,无论这个window对象是属于同源或不同源
相关概念:
同源策略是指浏览器处于安全方面的考虑只允许本域下的接口交互。不同源的客户端脚本在没有明确授权的情况下,不能读取对方的资源。
其中同源是指:- 协议相同,比如http://lalala.com和https://lalala.com不属于同源
- 域名相同,比如http://b.lalala.com和http://a.lalala.com不属于同源
- 端口相同,比如http://lalala.com:8082和http://lalala.com不属于同源
14、说一下JSNOP的实现原理?
-
利用script标签src属性中的链接却可以访问跨域的js脚本这个特性,首先在当前网页动态创建一个
<script>
标签,其src指向跨域访问的URL -
在当前网页动态创建一个函数,并将该函数名一起发送到跨域的URL
-
跨域的资源返回一个特定的JSON字符串,格式为:
"函数名({key:value})"
或"函数名([{},{}]) "
等形式 -
该字符串返回后会被浏览器当做脚本执行,其本质就是对第二步动态创建函数的调用,并将服务器返回的数据作为函数的参数传入
-
在第二步动态创建的函数中,调用我们定义的回调函数,把参数数据传入,最终得到跨域访问的结果
备注:jquery提供了jsonp的实现,例如:
$.ajax({ url:”http://www.abc.com/api/xx”,//跨域请求地址 type:”get”,//jsonp只支持get请求 data:{} ,//跨域请求发送的数据, dataType:”jsonp”, //服务器返回数据类型 jsonpCallback:”'globalCallback'”,//jsonp回调函数名,如果不指定jquery会自动创建一个 success:function(data){ //ajax回调函数,参数即为跨域返回的数据,这部分数据是通过jsonpCallback回调函数传入进来的 } });
1、Tomcat的优化经验
答:去掉对web.xml的监视,把jsp提前编辑成Servlet。
有富余物理内存的情况,加大tomcat使用的jvm的内存
2、说一说Servlet的生命周期?
答:servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方法。
3、Servlet的基本架构
public class ServletName extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
}
}
4、SERVLET API中forward() 与redirect()的区别?
答:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。
5、什么情况下调用doGet()和doPost()?
Jsp页面中的FORM标签里的method属性为get时调用doGet(),为post时调用doPost()。
6、Request对象的主要方法:
setAttribute(String name,Object)
:设置名字为name的request的参数值
getAttribute(String name)
:返回由name指定的属性值
getAttributeNames()
:返回request对象所有属性的名字集合,结果是一个枚举的实例
getCookies()
:返回客户端的所有Cookie对象,结果是一个Cookie数组
getCharacterEncoding()
:返回请求中的字符编码方式
getContentLength()
:返回请求的Body的长度
getHeader(String name)
:获得HTTP协议定义的文件头信息
getHeaders(String name)
:返回指定名字的request Header的所有值,结果是一个枚举的实例
getHeaderNames()
:返回所以request Header的名字,结果是一个枚举的实例
getInputStream()
:返回请求的输入流,用于获得请求中的数据
getMethod()
:获得客户端向服务器端传送数据的方法
getParameter(String name)
:获得客户端传送给服务器端的有name指定的参数值
getParameterNames()
:获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例
getParametervalues(String name)
:获得有name指定的参数的所有值
getProtocol()
:获取客户端向服务器端传送数据所依据的协议名称
getQueryString()
:获得查询字符串
getRequestURI()
:获取发出请求字符串的客户端地址
getRemoteAddr()
:获取客户端的IP地址
getRemoteHost()
:获取客户端的名字
getSession([Boolean create])
:返回和请求相关Session
getServerName()
:获取服务器的名字
getServletPath()
:获取客户端所请求的脚本文件的路径
getServerPort()
:获取服务器的端口号
removeAttribute(String name)
:删除请求中的一个属性
7、jsp有哪些内置对象?作用分别是什么? 分别有什么方法?
答:JSP共有以下9个内置的对象:
request 用户端请求,此请求会包含来自GET/POST请求的参数
response 网页传回用户端的回应
pageContext 网页的属性是在这里管理
session 与请求有关的会话期
application servlet 正在执行的内容
out 用来传送回应的输出
config servlet的构架部件
page JSP网页本身
exception 针对错误网页,未捕捉的例外
request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。
response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等)
out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。
pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。
session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息
applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息
config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。
page表示从该页面产生的一个servlet实例
8、jsp有哪些动作?作用分别是什么?
(这个问题似乎不重要,不明白为何有此题)
答:JSP共有以下6种基本动作
jsp:include:在页面被请求的时候引入一个文件。
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:forward:把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记
9、JSP的常用指令
isErrorPage(是否能使用Exception对象),isELIgnored(是否忽略表达式)
10、JSP中动态INCLUDE与静态INCLUDE的区别?
答:动态INCLUDE用jsp:include动作实现
<jsp:include page=included.jsp flush=true />它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数 静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面 <%@ include file=included.htm %>
11、两种跳转方式分别是什么?有什么区别?
(下面的回答严重错误,应该是想问forward和sendRedirect 的区别,毕竟出题的人不是专业搞文字艺术的人,可能表达能力并不见得很强,用词不一定精准,加之其自身的技术面也可能存在一些问题,不一定真正将他的意思表达清楚了,严格意思上来讲,一些题目可能根本就无人能答,所以,答题时要掌握主动,只要把自己知道的表达清楚就够了,而不要去推敲原始题目的具体含义是什么,不要一味想着是在答题)
答:有两种,分别为:
<jsp:include page=included.jsp flush=true>
<jsp:forward page= nextpage.jsp/>
前者页面不会转向include所指的页面,只是显示该页的结果,主页面还是原来的页面。执行完后还会回来,相当于函数调用。并且可以带参数.后者完全转向新页面,不会再回来。相当于go to 语句。
12、页面间对象传递的方法
request,session,application,cookie等
13、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
14、MVC的各个部分都有那些技术来实现?如何实现?
答:MVC是Model-View-Controller的简写。Model 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), View 是应用的表示面(由JSP页面产生),Controller 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。
15、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
Public String translate (String str) {
String tempStr = "";
try {
tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");
tempStr = tempStr.trim();
} catch (Exception e) {
System.err.println(e.getMessage());
}
return tempStr;
}
16、HTTP1.1默认是保持长连接吗
从 HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码:Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。
17、GET与POST的区别
特征 | GET方法 | POST方法 |
---|---|---|
提交数据类型 | 文本 | 文本、二进制 文本 |
提交数据长度 | 不超过2K | 没有限制 |
提交数据可见性 | 作为URL地址的一部分显示在浏览器地址栏 | 作为请求的消息体,不可见 |
提交数据缓存 | 缓存在浏览器URL历史状态中 | 不会被浏览器缓存 |
18、上下文、请求、会话作用域区别
- 范围
- 上下文 application ,在整个项目运行过程中可以使用
- 会话 session ,在一个会话开始到结束时可以使用
- 请求 request ,在一个请求范围内可以使用
- 数据是否共享
- 上下文数据共享,所用用户公用一个上下文作用域
- 会话和请求只服务于一个用户,数据不共享
- 相同
- 所有的作用域用法完全相同,作用相同
19、解决乱码
-
直接设置
// 如果使用post方式提交,首先将request请求编码设置为utf-8,那么你拿到的数据就不是乱码 req.setCharacterEncoding("utf-8"); //设置响应内容的编码形式:utf-8 resp.setCharacterEncoding("utf-8"); //告诉浏览器使用utf-8进行编码,这里的text/plain是普通文本的意思 resp.setContentType("text/plain; charset=UTF-8");
-
字符串转换
String username=req.getParameter("username"); //用字节去接收解码的数据 byte[] bytes=username.getBytes("iso-8859-1"); //把字节编译 成utf-8 String username_utf=new String(bytes,"utf-8"); System.out.println(username_utf);
-
修改Tomcat的Server.xml,在Connector标签中加上URLEncoding参数
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="99" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8"/>
24、重定向与请求转发的区别
请求转发 | 重定向 | |
---|---|---|
地址栏URL | 服务器内部跳转,所有地址栏上的路径不会改变 | 浏览器在次发送请求,地址栏上的路径会发生改变 |
请求次数 | 一次 | 两次 |
跳转范围 | 只能在当前应用内部跳转 | 可以在内部跳转也可以跳出当前应用 |
请求数据 | 能获取请求数据 | 两次请求,无法获取第一次的请求数据 |
跳转路径 | 内部跳转。它的路径写法是 /资源路径 | /工程名/资源路径 |
刷新页面 | 重新载入请求数据 | 不会重新载入请求数据 |
25、Servlet体系架构
26、如何定义过滤器链的执行顺序
-
web.xml
通过web.xml的url映射顺序
<!-- 用户登录检测过滤器 --> <filter> <filter-name>UserLoginFilter</filter-name> <filter-class>net.tfgzs.demo.filter.UserLoginFilter</filter-class> </filter> <filter-mapping> <filter-name>UserLoginFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--接口日志过滤器--> <filter> <filter-name>ApiLog</filter-name> <filter-class>net.tfgzs.demo.filter.ApiLog</filter-class> </filter> <filter-mapping> <filter-name>ApiLog</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
@WebFilter
@WebFilter 注解的Java文件名排序
Java中事务总结详解(精华)
XML文档定义有几种形式
-
dtd(文档类型定义) schema(XML模式)
-
区别
- XML Schema和DTD都用于文档验证,但二者还有一定区别,本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的)。
- XML Schema是内容开放模型,可扩展,功能性强;而DTD可扩展性差;
- XML Schema支持丰富的数据类型,而DTD不支持元素的数据类型,对属性的类型定义也很有限;
- XML Schema支持命名空间机制,而DTD不支持;
- XML Schema可针对不同情况对整个XML文档或文档局部进行验证;而DTD缺乏这种灵活性;
- XML Schema完全遵循XML规范,符合XML语法,可以和DOM结合使用,功能强大;而DTD语法本身有自身的语法和要求,难以学习;
-
解析方法
- DOM:文档驱动,处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问
- SAX:不同于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问,且是只读的。