servlet
1,什么是servlet?他有什么作用?
(1)servlet是SUN推出的一套规范,规定了如何用java来开发动态网站,也就是说,java可以开发网站后台,但一定要遵循一定的标准.
(2)servlet可以使用所有的java API ,类库丰富,功能强大.
(3)通过servlet,可以:接受用户通过<form>表单提交的信息;
查询数据库,包括用户信息,文章内容,页面点击次数等;
生成验证码,防止机器恶意注册.
2,什么是ServletContext?他由谁创建?
当servlet容器启动时,他会部署并加载所有的web应用.当web应用被加载时,servlet容器会一次性为每个应用创建servlet上下文(servletContext)并把它们保存在内存中.servlet容器会处理web应用的web.xml文件,并且一次性的创建在web,xml里定义的servlet,filter,listener,同样也会把他们保存在内存中,当servlet容器关闭时,他会卸载所有的web应用和servletContext,所有的servlet,filter,listener实例都会被销毁.
3,servletRequest和ServletResponse从哪里进入生命周期?
servlet容器包含在web服务器中,web服务器监听来自特定端口的HTTP请求,这个端口通常是80,当客户端(使用web浏览器的用户)发送一个HTTP请求时,servlet容器会创建新的HttpServletRequest和HttpServletResponse对象,并且把他们传递给已经创建的Filter和请求URL匹配的Servlet实例的方法,所有的这些都是使用同一个线程.
request对象获取了http请求的所有信息的入口,比如请求头和请求实体,response对象提供了控制和发送http响应的便利方法,比如设置响应头和响应实体(通常jsp生成的html内容),当http响应被提交并结束后,request和response对象都会被销毁.
4,servlet是线程安全的吗?servlet如何保证线程安全?
(1),实现SingleThreadModel接口
该接口指定了系统如何处理对同一个servlet的调用,如果一个servlet被这个接口指定,那么在这个servlet中的service方法就不会有两个线程被同时执行,当然也就不会存在线程安全问题.只要实现这个接口就可以了.
(2),同步对共享数据的操作
使用synchronized关键字能保证一次只有一个线程可以访问被保护的区段.
(3),避免使用实例变量
线程安全问题还是有些是由实例变量造成的,只要在servlet里面的任何方法里面都不使用实例变量,就安全.
5,servlet为什么是线程不安全的?
当客户端第一次请求servlet的时候,tomcat会根据web.xml配置文件实例化servlet,当又有一个客户端访问该servlet时,不会再实例化该servlet,也就是多个线程在使用这个实例,
servlet线程池
servlet采用多线程来处理多个请求同时访问,tomcat容器维护了一个线程池来服务请求.
线程池实际上是等待执行代码的一组线程叫做工作组线程,tomcat容器使用一个调度线程来管理工作组线程.
当容器收到一个servlet请求时,dispatcher线程从线程池中选出一个工作组线程,将请求传递给该线程,然后由该线程来执行servlet的service方法.
当这个线程正在执行的时候,容器收到另一个请求,调度者将从线程池中选出另外一个工作组线程来服务这个新的请求,容器并不关心这个请求是否访问的是同一个servlet还是另一个servlet,当容器收到对同一个servlet的多个请求的时候,这个servlet的service方法将在多线程中并发的执行.
6, 什么是Cookie?Cookie有什么规范?
① 什么是cookie
Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!
② HTTP的cookie规范如下:
Cookie大小上限为4KB;
一个服务器最多在客户端浏览器上保存20个Cookie;
一个浏览器最多保存300个Cookie;
7, Cookie的生命
① 什么是Cookie的生命
Cookie不只是有name和value,Cookie还是生命。所谓生命就是Cookie在客户端的有效时间,可以通过setMaxAge(int)来设置Cookie的有效时间。
cookie.setMaxAge(-1):cookie的maxAge属性的默认值就是-1,表示只在浏览器内存中存活。一旦关闭浏览器窗口,那么cookie就会消失。
cookie.setMaxAge(60*60):表示cookie对象可存活1小时。当生命大于0时,浏览器会把Cookie保存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie也会存活1小时;
cookie.setMaxAge(0):cookie生命等于0是一个特殊的值,它表示cookie被作废!也就是说,如果原来浏览器已经保存了这个Cookie,那么可以通过Cookie的setMaxAge(0)来删除这个Cookie。无论是在浏览器内存中,还是在客户端硬盘上都会删除这个Cookie。
8, Cookie中保存中文
① Cookie中保存中文
Cookie中根本不能保存中文!需要把中文转换成URL编码后才能保存。这也说明读取Cookie之后,还要使用URL解码!!!
Cookie的name和value都不能使用中文,如果希望在Cookie中使用中文,那么需要先对中文进行URL编码,然后把编码后的字符串放到Cookie中。
9, cookie的应用以及注意
① 使用cookie的注意事项
不要保存私人信息。
任何重要数据,最好通过加密形式来保存数据(最简单的可以用URLEncode,当然也可以用完善的逆加密方式,遗憾的是,最好不要用md5来加密)。
是否保存登陆信息,需有用户自行选择。
长于10K的数据,不要用到Cookie。
② cookie最典型的应用
判断用户是否登陆过网站,以便下次登录时能够直接登录。如果我们删除cookie,则每次登录必须从新填写登录的相关信息。
另一个重要的应用是“购物车”中类的处理和设计。用户可能在一段时间内在同一家网站的不同页面选择不同的商品,可以将这些信息都写入cookie,在最后付款时从cookie中提取这些信息,当然这里面有了安全和性能问题需要我们考虑了。
10, 什么是session?
① 当首次使用session时,服务器端要创建session,session是保存在服务器端,而给客户端的session的id (一个cookie中保存了sessionId)。客户端带走的是sessionId,而数据是保存在session中。当客户端再次访问服务器时,在请求中会带上sessionId,而服务器会通过sessionId找到对应的session,而无需再创建新的session。
11, session的生命周期
getSession() getSession(true);
① Session的销毁只有两种情况:第一:session调用了 session.invalidate()方法. 第二:前后两次请求超出了session指定的生命周期时间. 其中Session的生命周期时间可以在web.xml配置. 默认30分钟 在web.xml可以做如下配置:
<session-config>
<session-timeout>5</session-timeout>
</session-config>
12,什么是filter?
filter被称作是过滤器,功能是对servlet容器调用servlet的过程进行拦截,从而在servlet进行响应处理前后实现一个特殊功能和业务上的功能.
13,filter的生命周期.
服务器启动的时候加载过滤器的实例,并调用init()来初始化实例,每一次请求都只调用方法doFilter()进行处理,停止服务器时调用destroy()方法,销毁实例.
14,filter与interceptor的区别
拦截器基于java反射机制的,过滤器是基于函数回调.
拦截器不依赖于servlet容器,过滤器依赖于servlet容器.
拦截器只能对action请求起作用,过滤器对所有的请求起作用.
拦截器可以访问action上下文,值栈里面的对象,过滤器不能.
在action的生命周期中,拦截器可以多次调用,过滤器只能在容器初始化时调用一次.
15,filter的应用.
filter实现统一全站编码.
细粒度权限控制.
分ip统计网站的访问次数.
filter实现页面静态化.
16,什么是listener?
listener是servlet事件监听器,servlet事件监听器就是一个实现特定接口的java程序,专门用于监听web应用程序中的servletContext,HttpSession和ServletRequest等域对象的创建和销毁过程,监听这些域对象属性的修改以及感知绑定到HttpSession域中某个对象的状态.
17,listener的应用场景.
统计当前在线的人数.
日志监听.
特定要求过滤关键字拦截(过敏敏感字符).
18,tomcat怎么处理请求的?
客户端点击一个连接,url执行一个servlet
容器中的部署文件将url映射到servlet,会创建两个对象,httpServletRequest和httpServletResponse.
容器根据请求中的url找到正确的servlet,为这个请求创建或者分配一个线程,把请求和响应对象传递给这个servlet线程
容器调用servlet里面的service()方法,根据请求的不同类型(post or get)service()方法会调用doGet()或者doPost()方法
假如请求是一个http get请求,doGet()会生成动态页面,并把这个页面填入响应对象.
线程结束,容器吧响应对象转换成一个http响应,把它发回给客户,然后删除请求对象和响应对象.
19,请求转发和重定向的区别?
重定向是客户端行为,转发是服务器行为.
重定向需要再次回到浏览器,请求转发不需要再次回到浏览器.
重定向请求两次,请求转发请求一次.
重定向可以跨域请求,请求转发不能跨域请求.
20,使用tomcat的时候做了哪些配置?
配置tomcat支持http协议
配置NIO
配置tomcat压缩静态文件
配置最大线程数
21,servlet的声明周期?
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
22,过滤器的配置以及它的作用?
过滤器是一个对象,可以传输请求或修改响应。它可以在请求到达Servlet/JSP之前对其进行预处理,而且能够在响应离开Servlet/JSP之后对其进行后处理。所以如果你有几个Servlet/JSP需要执行同样的数据转换或页面处理的话,你就可以写一个过滤器类,然后在部署描述文件(web.xml)中把该过滤器与对应的Servlet/JSP联系起来。你可以一个过滤器以作用于一个或一组servlet,零个或多个过滤器能过滤一个或多个servlet。一个过滤器实现java.servlet.Filter接口并定义 它的三个方法:
1) void init(FilterConfig config) throws ServletException:在过滤器执行service前被调用,以设置过滤器的配置对象。
2) void destroy();在过滤器执行service后被调用.
3) Void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) throws IOException,ServletException;
23,如何防止表单的重复提交?
使用js来防止表单的重复提交
使用session技术
在jsp页面生成一个唯一的随机值,将其保存在session中,同时将其保存在表单的隐藏域的值在处理注册的请求时,获取session中的值,获取请求参数的值,比较两着是否相同,相同说明不是重复提交,请求通过同时提交session中保存的值,如果不想听则是重复提交,不能通过.
24, HTTP 请求的 GET 和 POST 方式的区别
可以从以下几个方面去回答:
1. 携带请求参数的方式
GET: 通过请求行携带参数, 参数会显示在地址栏
POST: 通过请求体来携带参数, 参数不会显示在地址栏
2. 服务器端处理请求的方法
GET: 会调用 Servlet 的 doGet()来处理请求
POST: 会调用 Servlet 的 doPost()来处理请求
3. 数据大小与安全性
GET: 大小有限制(小于 2k), 不安全 POST: 大小没有限制, 安全