Java Web
- 什么是Servlet?
- Servlet就是小程序服务或服务连接器,使用Java编写的服务器端程序,独立于平台与协议,Servlet能够交互式浏览和生成数据,生成动态web内容
- Servlet的生命周期?
- 加载并实例化-->初始化【init()】-->处理请求【service()】-->服务终止【destory()】
- JSP和Servlet的区别?
- JSP的本质就是Servlet,我们可以这样认为JSP是简易的Servlet
- 主要区别:
- Servlet的应用逻辑是Java文件,而JSP是由http和Java组合的以jsp为扩展名的文件
- Servlet侧重于控制逻辑,JSP侧重于表现层
- JSP有哪些内置对象?作用是什么?
- request:封装客户端请求的对象,包含get和post请求的参数
- response:封装服务器端的响应
- pageContext:通过此对象可以获取到其他对象
- session:封装用户会话的对象
- application:封装服务器运行环境对象
- out:输出服务器响应的输出流对象
- config:WEB应用的配置对象
- page:JSP本身
- exception:封装抛出异常的对象
- JSP的4中作用域分别是什么?
- page:当前页面可用
- request:一次请求
- session:一次会话
- application:当服务器关闭
- Ajax中浏览器的缓存问题如何解决?
- 原因:
- Ajax提高页面的载入速度的原因是通过Ajax减少加载重复的数据,也就是说Ajax在每次加载数据时都会将数据缓存到内存中,只要页面没有刷新缓存就一直存在。这样做降低了系统的负载,提高了用户的体验度,但我们不能拿到最新的数据,从而产生了Ajax的缓存问题
- 解决方式:
- 使用JQuery,$.ajaxSetup({cache:false});
- 在Ajax请求的前面加上anAjaxObj.setRequestHandler("cache-control","no-cache");
- 在请求的URl后面加上随机数,"fresh="+Math.random();
- 原因:
- session和cookie的区别?
- 存储位置:session存放在服务器中,cookie存放在客户端浏览器中
- 安全性:cookie不安全,因为存放在浏览器中,所以就有可能被篡改或伪造
- 存储容量:cookie的存储容量是有限制的,每个cookie不能超过4K,而且每个站点对cookie的个数也是有限制的
- 存储的多样性:session能够保存在Redis、数据库和应用程序中,cookie只能存在浏览器中
- 说一下session的工作原理?
- 在我们使用session时,服务器会创建对应的session,并且将sessionId传给客户端存入cookie中,在客户端再次访问时,会通过sessionId找到对应的session完成后续操作
- 在我们使用session时,服务器会创建对应的session,并且将sessionId传给客户端存入cookie中,在客户端再次访问时,会通过sessionId找到对应的session完成后续操作
- 如果客户端禁止cookie能实现session吗?session还能使用吗?
- 可以实现,因为session只需要cookie存储sessionId,在cookie被禁用之后,我们可以将sessionId加在URL上,从而保证session能够正常的使用
- 可以实现,因为session只需要cookie存储sessionId,在cookie被禁用之后,我们可以将sessionId加在URL上,从而保证session能够正常的使用
- get请求和post请求的区别?
- 使用场景:get一般使用在服务器响应,post一般使用在客户端请求
- 安全性:get的安全性较差会将请求的参数直接加在URL的后面,post的参数是在http包体中
- 传输数据:get只能传输文本类型的数据,并且大小不能超过1024字节,post既能传输文本又能传输二进制的文件,默认没有限制
- 使用场景:get一般使用在服务器响应,post一般使用在客户端请求
- 重定向和请求转发的区别?
- 重定向:
- 客户端行为,地址栏发生改变
- 发送了两次请求,效率较低
- 数据不共享
- 请求转发:
- 服务器行为,地址栏不发生改变
- 发送一次请求,效率较高
- 共享request对象的数据
- 重定向:
- get与post请求request对象乱码问题如何解决?
- tomcat7:
- get请求:获取出现乱码的元素,将乱码元素的编码格式从ISO-8859-1改为UTF-8[new String(request.getParamter(name)).getBytes("ISO-8859-1","UTF-8")]
- post请求:request.setCharacterEncoding("UTF-8")
- tomcat8:
- get请求:不会存在乱码
- post请求:request.setCharacterEncoding("UTF-8")
- tomcat7:
- 如何避免SQL注入?
- 使用预处理PreparedStatement
- 使用正则表达式过滤字符中的特殊字符
- 说说TCP和UDP的区别?
- TCP是面向连接,UDP是面向无连接的
- TCP提供可靠的数据传输(三次握手与四次挥手),UDP是不可靠的数据传输
- TCP的传输速度比较慢,UDP传输速度快
- TCP是面向字节流的,UDP是面向报文的(报文包含需要发送的完整数据信息)
- TCP是面向连接,UDP是面向无连接的
- 说说TCP的三次握手和四次挥手?
- TCP连接的三次握手
- 第一次握手:客户端发送请求报文SYN
- 第二次握手:服务器发送响应报文ACK和同步报文SYN
- 第三次握手:客户端发送响应报文ACK
- TCP断开的四次挥手:
- 第一次挥手:客户端发送请求断开报文FIN
- 第二次挥手:服务器发送响应报文ACK,响应请求,继续处理数据
- 第三次挥手:服务器数据处理完毕,发送断开报文FIN,断开连接
- 第四次挥手:客户端发送响应报文ACK,表示成功断开
- TCP连接的三次握手
- 说说为什么TCP需要三次握手,两次握手行吗?
- TCP连接只进行两次握手的话,代表服务器发送响应客户端的连接就成功建立连接,如果此时客户端没有对服务器的响应做任何操作,那么服务器就会一直处于等待客户端发送数据的状态,导致资源的白白消耗。采用TCP的连接三次握手,即使客户端没有对服务器的响应做任何操作,服务器也会重新发送请求进行确认,确认结果显示客户端没有建立请求,那么就直接断开就不会造成资源的浪费
- TCP连接只进行两次握手的话,代表服务器发送响应客户端的连接就成功建立连接,如果此时客户端没有对服务器的响应做任何操作,那么服务器就会一直处于等待客户端发送数据的状态,导致资源的白白消耗。采用TCP的连接三次握手,即使客户端没有对服务器的响应做任何操作,服务器也会重新发送请求进行确认,确认结果显示客户端没有建立请求,那么就直接断开就不会造成资源的浪费
- 说说TCP的粘包的原因?
- 发送端:发送端等待缓冲区数据包占满,才发送出去,造成一次发送多个包
- 接收端:接收端不及时获取缓冲区中的包,造成一次获取多个包
- 发送端:发送端等待缓冲区数据包占满,才发送出去,造成一次发送多个包
- 什么是XSS攻击,如何预防?
- XSS(Cross Site Scripting)跨站脚本攻击,原理就是攻击者在WEB页面中使用恶意脚本代码(CSS代码、JavaScript代码等),在我们浏览页面时,这些代码也会被运行,从而达到攻击者的目的,如:cookie窃取,页面的重构以及重定向到其他页面
- 预防:
- 对输入的信息做过滤处理
- XSS(Cross Site Scripting)跨站脚本攻击,原理就是攻击者在WEB页面中使用恶意脚本代码(CSS代码、JavaScript代码等),在我们浏览页面时,这些代码也会被运行,从而达到攻击者的目的,如:cookie窃取,页面的重构以及重定向到其他页面
- 什么是CSRF攻击,如何预防?
- CSRF(Cross Site Request Forgrey)跨站请求伪造,可以这样理解攻击者伪装成你,使用你的名义来发送恶意请求。如:发送邮件、购买商品以及资金转账
- 预防:
- 在比较重要的操作部分添加验证码进行验证
- 验证请求操作的源地址
- 请求地址加上识别码并验证
- CSRF(Cross Site Request Forgrey)跨站请求伪造,可以这样理解攻击者伪装成你,使用你的名义来发送恶意请求。如:发送邮件、购买商品以及资金转账
- 如何实现跨域?
- 使用Jsonp进行跨域,Jsonp是使用script标签的src连接可以访问不同源的特性,加载远程返回的“JS函数”来执行的
- 在单接口使用注解@CrossOrigin运行跨域
- JDBC调用数据库的步骤?数据库操作流程?
- JDBC获取数据库连接:
- 创建properties的配置文件
- 获取properties配置文件的流对象
- 创建properties的配置文件对象
- 使用properties对象load()方法加载流
- 获取配置文件中的配置信息
- 加载驱动
- 返回数据库连接
- 数据库操作流程:
- 定义sql
- 获得数据库连接
- 使用PreparedStatement预编译sql语句
- 设置sql参数,使用sql语句中使用?代表占位符,所以下标要从1开始设置,这样做能够避免sql的注入
- 执行sql语句,返回ResultSet对象
- 分析并判断ResultSet对象
- 关闭资源
- JDBC获取数据库连接: