目录
- 1、说一说Servlet的生命周期
- 2、Servlet API 中 forward() 与 redirect()的区别
- 3、request.getAttribute() 和 request.getParameter() 有何区别
- 4、MVC的各个部分都有哪些技术来实现?如何实现?
- 5、session和cookie有什么区别
- 6、tomcat容器是如何创建servlet类实例?用到了什么原理?
- 7、如何避免sql注入?
- 8、什么是XSS攻击,如何避免?
- 9、JDBC访问数据库的基本步骤是什么
- 10、说说事务的概念,在JDBC编程中处理事务的步骤
- 11、数据库连接池的原理,为什么要使用连接池
- 12、JDBC的脏读是什么?哪种数据库隔离级别能防止脏读
- 13、JDBC的DriverManager是用来做什么的?
- 14、AJAX有哪些优点和缺点
- 15、AJAX应用和传统Web应用有什么不同?
- 16、JDBC的DataSource是什么,有什么好处?
- 17、Cookie的过期和Session的超时有什么区别?
- 18、如何解决分布式Session问题
- 18、在单点登录中,如果cookie被禁用了怎么办
- 19、session何时被删除
- 20、什么是过滤器
- 21、什么是监听器
- 22、什么是拦截器
- 23、过滤器和拦截器的区别
- 24、web.xml的作用
- 25、filter的生命周期
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do()方法。结束服务,web容器调用servlet的destroy()方法。
从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器。浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.所以redirect等于客户端向服务器端发出两次request,同时也接受两次response
从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据
redirect:不能共享数据
从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等
从效率来说
forward:高
redirect:低
HTTP中重定向和请求转发的区别?
本质区别:
重定向特点:两次请求,浏览器地址发生变化,可以访问自己 web 之外的资源,传输的数据会丢失。
求转发特点:一次强求,浏览器地址不变,访问的是自己本身的 web 资源,传输的数据不会丢失。
MVC是Model-View-Controller的简写。Model代表的是应用的业务逻辑(通过JavaBean,EJB组件实现),View是应用的表示面(由JSP页面产生),Controller是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。
如何实现自动登录?
当用户在某个网站注册后,就会收到一个唯一用户ID的cookie。客户后来重新连接时,这个用户ID会自动返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,从而使用户无需给出明确的用户名和密码,就可以访问服务器上的资源。
当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过反射的方式实例化。(有时候也是在第一次请求时实例化)
在servlet注册时加上1如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。
XSS攻击又称CSS,全称Cross Site Script (跨站脚本攻击),其原理是攻击者向有XSS漏洞的网站中输入恶意的 HTML 代码,当用户浏览该网站时,这段 HTML 代码会自动执行,从而达到攻击的目的。XSS 攻击类似于 SQL 注入攻击,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。XSS是 Web 程序中常见的漏洞,XSS 属于被动式且用于客户端的攻击方式。
XSS防范的总体思路是:对输入(和URL参数)进行过滤,对输出进行编码。
JDBC的全称是Java DataBase Connection
,也就是Java数据库连接
,我们可以用它来操作关系型数据库。
Class.forName()
加载数据库连接驱动DriverManager.getConnection()
获取数据连接对象常见的JDBC异常有哪些?
java.sql.SQLException
:JDBC异常的基类。java.sql.SQLWarning
:SQL操作出现的警告信息java.sql.DataTruncation
:字段值由于某些非正常原因被截断了事务处理步骤:
数据库连接是一件费时的操作,连接池可以使多个操作共享一个连接。
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量、使用情况,为系统开发,测试及性能调整提供依据。
使用连接池是为了提高对数据库连接资源的管理
当我们使用事务时,有可能会出现这样的情况,有一行数据刚更新,与此同时另一个查询读到了这个刚更新的值。
这样就导致了脏读,因为更新的数据还没有进行持久化,更新这行数据的业务可能会进行回滚,这样这个数据就是无效的
数据库的TRANSACTIONREADCOMMITTED(读已提交),TRANSACTIONREPEATABLEREAD(),和TRANSACTION_SERIALIZABLE隔离级别可以防止脏读。
JDBC的DriverManager是一个工厂类,我们通过它来创建数据库连接。当JDBC的Driver类被加载进来时,它会自己注册到DriverManager类里面
然后我们会把数据库配置信息传成DriverManager.getConnection()方法,DriverManager会使用注册到它里面的驱动来获取数据库连接,并返回给调用的程序。
优点:
缺点:
在传统的Javascript编程中,如果想得到服务器端数据库或文件上的信息,或者发送客户端信息到服务器,需要建立一个HTML form然后GET或者POST数据到服务器端。用户需要点击”Submit”按钮来发送或者接受数据信息,然后等待服务器响应请求,页面重新加载。
因为服务器每次都会返回一个新的页面, 所以传统的web应用有可能很慢而且用户交互不友好。
使用AJAX技术, 就可以使Javascript通过XMLHttpRequest对象直接与服务器进行交互。
通过HTTP Request, 一个web页面可以发送一个请求到web服务器并且接受web服务器返回的信息(不用重新加载页面),展示给用户的还是同一个页面,用户感觉页面刷新,也看不到到Javascript后台进行的发送请求和接受响应,体验非常好。
DataSource即数据源,跟DriverManager相比,它的功能要更强大。我们可以用它来创建数据库连接,当然驱动的实现类会实际去完成这个工作。除了能创建连接外,它还提供了如下的特性:
缓存PreparedStatement以便更快的执行
可以设置连接超时时间
提供日志记录的功能
Cookie的过期和Session的超时(过期),都是对某个对象设置一个时间,然后采用轮询机制检查当前对象是否超时,如果超时则进行移除。
cookie保存在浏览器中,不安全。而session是保存在服务端的。cookie的生命周期很长,而session很短,一般也就几十分钟。
cookie是保存在客户端,session保存在服务器端,cookie保存着session相关信息。 如果cookie没有超时,那么浏览器每次请求都会带上该cookie信息,服务器端根据cookie信息从session缓存中获取相对应的session。这两个信息有一个超时,用户连接即宣告关闭
Nginx ip_hash策略
,服务端使用 Nginx 代理,每个请求按访问 IP 的 hash 分配,这样来自同一 IP 固定访问一个后台服务器,避免了在服务器 A 创建 Session,第二次分发到服务器 B 的现象Session 复制
,任何一个服务器上的 Session 发生改变(增删改),该节点会把这个 Session 的所有内容序列化,然后广播给所有其它节点。共享 Session
,将用户的 Session 等信息使用缓存中间件来统一管理,保障分发到每一个服务器的响应结果都一致单点登录的原理是后端生成一个 session ID
,然后设置到 cookie
,后面的所有请求浏览器都会带上 cookie,然后服务端从 cookie 里获取 session ID,再查询到用户信息。
所以,保持登录的关键不是 cookie,而是通过cookie 保存和传输的 session ID,其本质是能获取用户信息的数据。 除了 cookie,还通常使用 HTTP 请求头来传输。但是这个请求头浏览器不会像 cookie 一样自动携带,需要手工处理。
session在下列情况下被删除:
HttpSession.invalidate()
session id
时间间隔超过了session的最大有效时间
注意关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。
定义:依赖于servlet容器; 在实现上基于函数回调
,可以对几乎所有请求进行过滤; 缺点是一个过滤器实例只能在容器初始化时调用一次;
作用: 用来做一些过滤操作,获取我们想要获取的数据: 在过滤器中修改字符编码; 在过滤器中修改HttpServletRequest
的一些参数,包括:过滤低俗文字、危险字符等。
定义:实现了javax.servlet.ServletContextListener
接口的服务器端程序; 随web应用的启动而启动;只初始化一次; 随web应用的停止而销毁;
作用: 做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。如SpringMVC
的监听器org.springframework.web.context.ContextLoaderListener
,实现了SpringMVC容器的加载
、Bean对象创建
、DispatchServlet初始化
等。
依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架; 在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用; 缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理;
由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。
拦截器 | 过滤器 |
---|---|
基于Java反射机制 | 基于函数回调 |
不依赖Servlet容器 | 依赖Servlet容器 |
只能对action起作用 | 几乎对所有请求起作用 |
拦截器不能修改request | 过滤器可以修改request |
拦截器可以调用IOC容器中的各种依赖 | 过滤器不能调用IOC容器中的各种依赖 |
拦截器可以详细到每个方法 | 过滤器只能在请求的前后使用 |
过滤器主要是过滤出要的东西,如requeset中的信息;拦截器在做安全方面用的比较多,比如终止一些流程
用于配置Web应用的相关信息 如:监听器(listener)、过滤器(filter)、 Servlet、相关参数、会话超时时间、安全验证方式、错误页面等。
init()
方法来初始化实例;doFilter()
进行处理;destroy()
方法,销毁实例。