寒假用了几天来学习JavaWEB 不能说学的怎么样吧,但是学过的东西不能让他直接忘了不是,以下是在学习之余做的笔记,如今整理过来,为了不让自己像暑假的时候一样,学了之后全部忘记。。。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
<1>JSP:在HTML页面中去嵌入Java代码,在servlet容器中去解释执行,这就是JSP
① JSP文件就像普通的HTML文件一样,他们放在web应用的除了web-inf文件之外的任何地方,JSP访问路径与HTML的访问路径是一样的。//那么WEN-INF 放的都是应用的隐私文件,隐私文件是不能被外部直接访问的,但是转发是可以访问WEB-INF目录下的文件的。
②JSP的运行原理:JSP是一个servlet(每个JSP页面我们都可以找到对应的.Java文件与.class文件)
③ web容器(servlet引擎)接受到以.jsp为扩展名的URL访问请求之后,会将访问请求交于JSP引擎去处理。
④ 每一个JSP页面在第一次被访问的时候,JSP引擎将它们翻译成一个servlet源程序,接着把这个源程序编译成.class类文件,然后由web容器像调用普通的servlet一样的方式来装载和解释执行。
<2>请求的转发与重定向的区别?
本质区别:请求的转发只发出了一次请求,重定向则发出了两次请求
具体请求:
①请求的转发,地址栏是初次发出请求的地址,请求的重定向的地址栏不在是初次发出请求的地址,而是重定向之后相应的地址。
②请求的转发,在最终的servlet中,request对象与response对象都是原来的对象,请求的重定向子最终的servlet中,只有respons是原来的对象。
③...
<3>JSP中几个隐含的对象
(request response pageContext session application config out page (exception))九大隐含对象
①request : httpServletRequest的对象,用于获取请求参数
String name = request.getParameter("name");
②response:httpServletResponse对象 (在JSP页面中几乎不会用得到response的任何方法)
③pageContext:页面的上下文,是PageContext的对象,可以在该对象中获取其他的八个隐含对象,也可以获取当前页面的其他信息
④session 代表浏览器与服务器的一次会话
⑤application 代表当前web应用,是servletContext对象,可以获取当前web应用的初始化参数
⑥config servletconfig对象
|------------------------------------------------------------------------------------
| 如何配置JSP
| <servlet>
| <servlet-name>login</servlet-name>
| <servlet-class>LoginServlet</servlet-class>
| </servlet>
| <servlet-mapping>
| <servlet-name>login</servlet-name>
| <url-pattern>/Login</url-pattern>
| </servlet-mapping>
| 如何配置web应用
| <context-param>
| <param-name>user</param-name>
| <param-value>Trina</param-value>
| </context-param>
| <context-param>
| <param-name>password</param-name>
| <param-value>liufengshuang</param-value>
| </context-param>
| load-on-startup 这个参数的意思是使servlet随当前web应用的加载而加载。
|--------------------------------------------------------------------------------------
⑦out JSPWriter的对象调用out.println();将字符打印在浏览器上,如果想要打换行, out.println("<br>");
⑧ exception在一定的条件才可以用
在JSP页面的头部声明<%@ isErrorPage = "true"%> 说明这个JSP页面是一个错误页面,这个时候,JSP中的exception对象是可以用的
<4> 客户端---->服务器
① 客户端发送请求--->请求数据包
②服务器收到请求之后
>分析出请求的是哪台虚拟主机(查看Host请求头可以看出,如果没有Host请求头, 那么访问缺省主机)
>分析出请求访问的是当前主机的哪个web资源(从请求行中请求的资源部分分许出当前的那个应用)
>分析请求要访问的是WEB应用的哪个资源(从请求行的资源部分分析出访问的哪个资源)
>查看web.xml文件,查看有没有对应的虚拟路径,有责安虚拟路径所对应的资源加载,如果,没有访问缺省资源,如果没有缺省资源,浏览器打印404。
>服务器从response 对象中获取之前写入的数据,组织成HTTP响应数据,组织成HTTP响应消息打给浏览器。
*************************************************************************************************************************************************************************
-----------------------------------------------------------JSP基本语法---------------------------------------------------------------------
<1>模板元素:JSP页面中的静态HTML内容为JSP模板元素,在静态HTML内容中可以嵌套JSP的各种元素来产生动态的内容和业务逻辑。
JSP模板元素定义了网页的基本骨架,即定义了页面的结构和外观。
<2> 如何去改JSP页面的编码?
window--preferences --JSP --jsp Files--Encoding
(改为UTF-8)
这样每次新建JSP页面的时候页面的编码都会是UTF-8编码类型。相当于修改了如下内容
<%@ page language="java" contentType = "text/html; charset=UTF-8 " pageEnconding="UTF-8"%><!--JSP页面的又不声明,其实可以写在页面的任何地方,只是习惯性的写在头部-->
<3>JSP表达式
JSP表达式提供了一个将Java变量或表达式的计算结果传输给客户端的简化方式,他将输出的变量值封装在<%= %>中
例如: <%=request.getParameter("name")%>
JSP表达式中的变量或表达式后面不能有分号,该表达式被翻译为servlet中的out.print();语句
<4>如何查找JSP页面的错误?
①JSP页面语法错误,导致不能被翻译成servlet源文件,JSP引擎将提示这些错误即错误发生的位置
②JSP页面中JSP语法没有错,但是被翻译成servlet源文件中出现了Java语法错误,导致JSP页面翻译成的servlet不能完成编译,JSP引擎也会提示这些错误及其位置。
③翻译编译都没错,运行时粗线运行时异常,会提示错误在servletJava文件中的位置。
<5>脚本片段
JSP脚本是指在<% %>之间的Java代码,多个脚本之间可以相互访问,脚本中不可以写方法,如果要写方法,要用JSP声明的方式
<6>JSP声明
JSP声明将Java脚本片段封装在<%! %>之中,他里面的代码将插入到_jspService()方法的外面,而我们平时写的JSP脚本是插入到_jspService()方法体中的。里面是可以写函数什么的,JSP隐式对象时不可以在JSP声明中使用的。
<7>JSP标签
①JSP还提供了一种称作Action额元素,在JSP页面中使用Action元素可以完成各种通用的JSP页面功能,也可以实现和处理一些复杂业务逻辑的专用功能
②Action采用XML元素的语法格式,即每个Action元素在JSP页面中都以XML标签的形式出现
③<jsp:include> <jsp: forward>
<7> JSP动态包含:
通过<jsp:include>标签将另一资源的输出内容插入到当前页面的输出内容之中,这种在JSP页面执行时的引入成为动态引入
并不是像<%@page include=""%>一样生成一个servlet源文件,动态引入是生成两个servlet源文件然后通过方法的方式将另一个页面包含进来的。
<8><jsp: forward>标签,相当于在页面上写一个转发 <jsp: forward page="b.jsp">这样的转发可以写相对路径也可以写绝对路径
同时可以用<jsp: param value="" name=""></jsp: parma>自标签来传一些参数
<jsp: forward page="b.jsp">
<jsp: param name="name" value="Trina"></jsp:forward>
</jsp:forward>
然后用String name = request.getParameter("name");
------------------------------------------------------------------------------------------------------------------------
<1>和属性相关的几个方法
getAttribute(String name);
Enumeration getAttributeNames();
removeAttrbute(String name);
addAttribute(String key, Object value);
<2>哪些对象有这些方法
pageContext request session application都有这些方法
------------------------------------------------------------------------
request:如果没有离开该页面就算是一个请求
session: 一次会话,如果没有关闭浏览器就是一个会话
<3>
请求的转发 request.getRequestDispathcher(String url).forward(request, response);
请求的重定向 response.sendRedirect(String url);y
<4>如何是客户不能访问一个页面呢?
正常情况下,webContent目录下的都可以访问,但是在web-inf下是不能访问的,对于tomcat服务器而言,该目录下的文件是不可以通过浏览器直接输入地址直接访问的,但是是可以请求的转发来访问的,请求的转发是转发到当前web应用下的任何资源,请求的重定向呢,则是让浏览器再次发一次请求去请求所要转发到的地址,这里就可服务器没有关系了,是浏览器的事情了,而请求的转发呢,则是在服务器内部处理的,完全是服务器的事情。
<5>contentType是指定当前JSP页面的相应类型,实际调用的是:response.setContentType();在tomcat安装目录下的 conf--web.xml
CTRL+F+doc
<6>错误页面的全局配置
<error-page>
<error-code>404(这里也可以写错误类型)</error-code>
<location>/error.jsp</location>
</error-page>
<7>对于GET请求,默认参数在传输过程中使用的编码是ISO-8850-1可以先解再编
String value = request.getParameter("name");
String username = new String(name.getBytes("iso-8859-1"), "utf-8");
这个是tomcat的问题,tomcat-conf-server.xml中改,改之后在eclipse中重新映射一遍tomcat就可以了。
---------------------------------------------------------------------------------------------------------------------
<1>静态代码块只被执行一遍
---------------------------------------------------------------------------------------------------------------------
*************************************会话与状态管理**********************************
1.HTTP协议是一种无状态的协议,WEB服务器本身不能识别那些请求是来自同一个浏览器,浏览器每次的请求都是完全孤立的
2.HTTP1.1支持连续连接,但是当用户有一段时有提交请求的时候连接会自动的关闭
3.作为web服务器,必须采用一种机制来唯一的标示一个用户,同时标记该用户的状态
---------------------
会话与会话状态
1.WEB应用的会话是指一个客户端浏览器与WEB服务器之间连续发生的一系列请求与响应过程
2.WEB应用的会话状态是指WEB服务器与浏览器在会话过程中产生的状态信息,借助会话状态,WEB服务器能够把属于同一会话的一系列请求和响应过程关联起来。
3.如何实现由状态的会话??
在servlet规范中常用两种方法进行会话跟踪,
--cookie
--session
①cookie机制
> cookie机制是采用客户端保持HTTP状态信息的方案
>cookie是在浏览器访问web服务器的某个资源的时候,由服务器在HTTP响应消息头中附带传给浏览器的一个小文本文件
浏览器 HTTP请求头中将这个cookie回传给服务器
>底层原理:web服务器通过HTTP响应消息中增加set-cookie响应字段将cookie信息发送给浏览器,浏览器则通过在HTTP请求头中增加cookie请求头字段将cookie回传给服务器
>限制:一个cookie只能标示一种信息,他至少含有标识该信息的名称name和设置值Value(只有一对)
一个web站点可以给一个服务器发送多个cookie,一个浏览器也可以存储多个站点的cookie信息,但是----->
浏览器一般只允 许存放300个cookie,一个站点最多20个,每个cookie的大小限制为4kb
>存储:cookie可以存储在浏览器的内存中(因为默认情况下cookie是会话级别的cookie,会话级别的cookie存储在浏览器的内存中,当用户退出浏览器时会被删除),也可以存在硬盘上。一般的cookie存在浏览器的内存中,当cookie设置了setMaxAge(Second sec);(以秒为单位)的时候,cookie会保存在硬盘上。当maxAge设置为0的时候,是要求浏览器删除cookie
② 会话级别的cookie与持久cookie的区别?
>存储位置:会话级别的cookie存在浏览器的内存中,持久cookie存储在硬盘上
>如果设置了过期时间,浏览器关闭后再打开这些cookie仍然有效,但是会话cookie则失效
>存储在硬盘上的cookie可以在同一个浏览器的不同进程之间使用,而保存在内存中的cookie,不同的浏览器处理不同。
③自动登录的原理--不需要填写用户名和密码就可以登录:
>若获得请求参数LoginName,将他打印,把登陆信息存储在cookie中,并设置最大时效。
>从cookie中读取用户信息,若存在则打印欢迎信息
>若既没有请求参数,有没有cookie,则重定向到login.jsp
④设置cookie的作用路径
cookie的作用范围:当前目录和当前目录的子目录,但不能作用当前目录的上一级。
cookie.setPath(request.getContextPath()+"/*相对于当前web应用的绝对目录*/");
----------------------------------------------------------------------------------------------------------------------------
下面改写session了:
session中文翻译为会话,在web开发环境下的的语义又有了新的扩展,他的含义是一类用于客户端与服务器保持状态的一种解决方案,有时候也用来只这种解决方案的一种存储结构。
①session机制:
>session机制采用服务器端爆出HTTP状态信息的方案
>服务器使用一种类似于散列表的结构(也许。。。就是散列表呢)来存储信息
>当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否包含了一个session标识(jsessionid)如果包含了这个标识则将该session检索出来,若没有检索到,则会新创建一个,这种情况可能出现在服务器端已经删除了该用户对应的session对象,但是用户认为的在请求的url后面附加一个JSESSIONID的参数。
>如果客户端不包含色色死哦你的,则为用户创建一个session,并生成一个与此session相关联的sessionid ,这个sessionid在本次响应中返回给客户端保存。当客户端再次请求时,会将该sessionid放在cookie中回传给服务器,以此每次请求都这样。浏览器不关,带sessionid的cookie存在。 。。。。。。。。。。有一个问题就是,如果浏览器单方面的禁用cookie,那么用cookie承载sessionid的登录是登陆不上去的。
② 保存sessionid的两种方式:
一种是保存在cookie中,这样浏览器可以自动的按照规则的把这个标识发送给服务器。如果cookie被禁用,那么采用第二种, 将sessionid附加在URL路径的后面,但是最常用的还是放在cookie中。
③ session-cookie
session通过sessionID来区分不同的客户,session是以cookie 或者URL重写为基础的,默认为session-cookie来实现,系统会创造一个名为 JSESSIONID的输出cookie,这个称为session-cookie,以区分persistent cookies(也就是我们平时所说的cookie)session-cookie是存储于浏览器内存中的,并不是写到硬盘上的,通常看不到JSESSIONID但是把浏览器的cookie禁用之后web服务器采用URL重写的方式,这时我们可以在地址栏中看得到,但是并不是所有人在你禁止cookie。
④ session持久化
就是让session-cookie这个cookie持久化,那么session就会持久化了。
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(600);
response.addCookie(cookie);
⑤ HTTP session的生命周期(即session什么时候创建什么时候销毁)
<1>什么时候创建session对象?
是否浏览器访问服务器端的一个JSP或者servlet,服务器就会创建一个session对象呢?自然答案是否定的。
# 如果JSP页面的头部声明中,有这样的声明:<%@ page session="false"%> page 的session属性是false,说明该JSP页面不会创建session对象,也不可以用session对象。
# 如果当前的JSP或者servlet是客户端访问的当前web应用的第一个资源,且JSP页面的page 的session属性值为false,那么也不会创建session对象。
# 如果当前的JSP不是客户端访当前web应用的第一个资源,且其他的页面已经创建了一个HttpSession对象,那么访问当前JSP的时候是不会创建新的session对象的,而是返回一个会话session对象。(同一个会话,只用第一个创建的session对象)
<2>什么时候销毁session对象
#q直接调用session.invalidate();使当前session失效。
#服务器卸载当前web应用
#session过期,默认的session存在的时间是半个小时,但是可以设置的,session.setMaxInactiveInterval(100);以秒为单位。或者在web.xml中单独设置。
##########################################################################################################
# TOMCAT的web.xml是总的xml文件,如果一个项目中有些属性不设置的话,就会用tomcat的web.xml文件中设置的属性值, #
# 如果需要单独设置的话,那么就在自己的项目下面的web.xml文件中单独配置,相当于tomcat的配置是一个全局的配置, #
##########################################################################################################
⑥ 如何获取一个HttpSession对象
对于servlet而言,若servlet是客户端访问的第一个资源,只是调用了 request.getSession(true);或者request.getSession();才会创建session对象。
⑦ 并不是关闭了浏览器就会销毁了session,因为session是在服务器端保存的,session的好处就是可以跨页面
如果禁用cookie那么每次的jsessionid都是新的。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
<1>JSP:在HTML页面中去嵌入Java代码,在servlet容器中去解释执行,这就是JSP
① JSP文件就像普通的HTML文件一样,他们放在web应用的除了web-inf文件之外的任何地方,JSP访问路径与HTML的访问路径是一样的。//那么WEN-INF 放的都是应用的隐私文件,隐私文件是不能被外部直接访问的,但是转发是可以访问WEB-INF目录下的文件的。
②JSP的运行原理:JSP是一个servlet(每个JSP页面我们都可以找到对应的.Java文件与.class文件)
③ web容器(servlet引擎)接受到以.jsp为扩展名的URL访问请求之后,会将访问请求交于JSP引擎去处理。
④ 每一个JSP页面在第一次被访问的时候,JSP引擎将它们翻译成一个servlet源程序,接着把这个源程序编译成.class类文件,然后由web容器像调用普通的servlet一样的方式来装载和解释执行。
<2>请求的转发与重定向的区别?
本质区别:请求的转发只发出了一次请求,重定向则发出了两次请求
具体请求:
①请求的转发,地址栏是初次发出请求的地址,请求的重定向的地址栏不在是初次发出请求的地址,而是重定向之后相应的地址。
②请求的转发,在最终的servlet中,request对象与response对象都是原来的对象,请求的重定向子最终的servlet中,只有respons是原来的对象。
③...
<3>JSP中几个隐含的对象
(request response pageContext session application config out page (exception))九大隐含对象
①request : httpServletRequest的对象,用于获取请求参数
String name = request.getParameter("name");
②response:httpServletResponse对象 (在JSP页面中几乎不会用得到response的任何方法)
③pageContext:页面的上下文,是PageContext的对象,可以在该对象中获取其他的八个隐含对象,也可以获取当前页面的其他信息
④session 代表浏览器与服务器的一次会话
⑤application 代表当前web应用,是servletContext对象,可以获取当前web应用的初始化参数
⑥config servletconfig对象
|------------------------------------------------------------------------------------
| 如何配置JSP
| <servlet>
| <servlet-name>login</servlet-name>
| <servlet-class>LoginServlet</servlet-class>
| </servlet>
| <servlet-mapping>
| <servlet-name>login</servlet-name>
| <url-pattern>/Login</url-pattern>
| </servlet-mapping>
| 如何配置web应用
| <context-param>
| <param-name>user</param-name>
| <param-value>Trina</param-value>
| </context-param>
| <context-param>
| <param-name>password</param-name>
| <param-value>liufengshuang</param-value>
| </context-param>
| load-on-startup 这个参数的意思是使servlet随当前web应用的加载而加载。
|--------------------------------------------------------------------------------------
⑦out JSPWriter的对象调用out.println();将字符打印在浏览器上,如果想要打换行, out.println("<br>");
⑧ exception在一定的条件才可以用
在JSP页面的头部声明<%@ isErrorPage = "true"%> 说明这个JSP页面是一个错误页面,这个时候,JSP中的exception对象是可以用的
<4> 客户端---->服务器
① 客户端发送请求--->请求数据包
②服务器收到请求之后
>分析出请求的是哪台虚拟主机(查看Host请求头可以看出,如果没有Host请求头, 那么访问缺省主机)
>分析出请求访问的是当前主机的哪个web资源(从请求行中请求的资源部分分许出当前的那个应用)
>分析请求要访问的是WEB应用的哪个资源(从请求行的资源部分分析出访问的哪个资源)
>查看web.xml文件,查看有没有对应的虚拟路径,有责安虚拟路径所对应的资源加载,如果,没有访问缺省资源,如果没有缺省资源,浏览器打印404。
>服务器从response 对象中获取之前写入的数据,组织成HTTP响应数据,组织成HTTP响应消息打给浏览器。
*************************************************************************************************************************************************************************
-----------------------------------------------------------JSP基本语法---------------------------------------------------------------------
<1>模板元素:JSP页面中的静态HTML内容为JSP模板元素,在静态HTML内容中可以嵌套JSP的各种元素来产生动态的内容和业务逻辑。
JSP模板元素定义了网页的基本骨架,即定义了页面的结构和外观。
<2> 如何去改JSP页面的编码?
window--preferences --JSP --jsp Files--Encoding
(改为UTF-8)
这样每次新建JSP页面的时候页面的编码都会是UTF-8编码类型。相当于修改了如下内容
<%@ page language="java" contentType = "text/html; charset=UTF-8 " pageEnconding="UTF-8"%><!--JSP页面的又不声明,其实可以写在页面的任何地方,只是习惯性的写在头部-->
<3>JSP表达式
JSP表达式提供了一个将Java变量或表达式的计算结果传输给客户端的简化方式,他将输出的变量值封装在<%= %>中
例如: <%=request.getParameter("name")%>
JSP表达式中的变量或表达式后面不能有分号,该表达式被翻译为servlet中的out.print();语句
<4>如何查找JSP页面的错误?
①JSP页面语法错误,导致不能被翻译成servlet源文件,JSP引擎将提示这些错误即错误发生的位置
②JSP页面中JSP语法没有错,但是被翻译成servlet源文件中出现了Java语法错误,导致JSP页面翻译成的servlet不能完成编译,JSP引擎也会提示这些错误及其位置。
③翻译编译都没错,运行时粗线运行时异常,会提示错误在servletJava文件中的位置。
<5>脚本片段
JSP脚本是指在<% %>之间的Java代码,多个脚本之间可以相互访问,脚本中不可以写方法,如果要写方法,要用JSP声明的方式
<6>JSP声明
JSP声明将Java脚本片段封装在<%! %>之中,他里面的代码将插入到_jspService()方法的外面,而我们平时写的JSP脚本是插入到_jspService()方法体中的。里面是可以写函数什么的,JSP隐式对象时不可以在JSP声明中使用的。
<7>JSP标签
①JSP还提供了一种称作Action额元素,在JSP页面中使用Action元素可以完成各种通用的JSP页面功能,也可以实现和处理一些复杂业务逻辑的专用功能
②Action采用XML元素的语法格式,即每个Action元素在JSP页面中都以XML标签的形式出现
③<jsp:include> <jsp: forward>
<7> JSP动态包含:
通过<jsp:include>标签将另一资源的输出内容插入到当前页面的输出内容之中,这种在JSP页面执行时的引入成为动态引入
并不是像<%@page include=""%>一样生成一个servlet源文件,动态引入是生成两个servlet源文件然后通过方法的方式将另一个页面包含进来的。
<8><jsp: forward>标签,相当于在页面上写一个转发 <jsp: forward page="b.jsp">这样的转发可以写相对路径也可以写绝对路径
同时可以用<jsp: param value="" name=""></jsp: parma>自标签来传一些参数
<jsp: forward page="b.jsp">
<jsp: param name="name" value="Trina"></jsp:forward>
</jsp:forward>
然后用String name = request.getParameter("name");
------------------------------------------------------------------------------------------------------------------------
<1>和属性相关的几个方法
getAttribute(String name);
Enumeration getAttributeNames();
removeAttrbute(String name);
addAttribute(String key, Object value);
<2>哪些对象有这些方法
pageContext request session application都有这些方法
------------------------------------------------------------------------
request:如果没有离开该页面就算是一个请求
session: 一次会话,如果没有关闭浏览器就是一个会话
<3>
请求的转发 request.getRequestDispathcher(String url).forward(request, response);
请求的重定向 response.sendRedirect(String url);y
<4>如何是客户不能访问一个页面呢?
正常情况下,webContent目录下的都可以访问,但是在web-inf下是不能访问的,对于tomcat服务器而言,该目录下的文件是不可以通过浏览器直接输入地址直接访问的,但是是可以请求的转发来访问的,请求的转发是转发到当前web应用下的任何资源,请求的重定向呢,则是让浏览器再次发一次请求去请求所要转发到的地址,这里就可服务器没有关系了,是浏览器的事情了,而请求的转发呢,则是在服务器内部处理的,完全是服务器的事情。
<5>contentType是指定当前JSP页面的相应类型,实际调用的是:response.setContentType();在tomcat安装目录下的 conf--web.xml
CTRL+F+doc
<6>错误页面的全局配置
<error-page>
<error-code>404(这里也可以写错误类型)</error-code>
<location>/error.jsp</location>
</error-page>
<7>对于GET请求,默认参数在传输过程中使用的编码是ISO-8850-1可以先解再编
String value = request.getParameter("name");
String username = new String(name.getBytes("iso-8859-1"), "utf-8");
这个是tomcat的问题,tomcat-conf-server.xml中改,改之后在eclipse中重新映射一遍tomcat就可以了。
---------------------------------------------------------------------------------------------------------------------
<1>静态代码块只被执行一遍
---------------------------------------------------------------------------------------------------------------------
*************************************会话与状态管理**********************************
1.HTTP协议是一种无状态的协议,WEB服务器本身不能识别那些请求是来自同一个浏览器,浏览器每次的请求都是完全孤立的
2.HTTP1.1支持连续连接,但是当用户有一段时有提交请求的时候连接会自动的关闭
3.作为web服务器,必须采用一种机制来唯一的标示一个用户,同时标记该用户的状态
---------------------
会话与会话状态
1.WEB应用的会话是指一个客户端浏览器与WEB服务器之间连续发生的一系列请求与响应过程
2.WEB应用的会话状态是指WEB服务器与浏览器在会话过程中产生的状态信息,借助会话状态,WEB服务器能够把属于同一会话的一系列请求和响应过程关联起来。
3.如何实现由状态的会话??
在servlet规范中常用两种方法进行会话跟踪,
--cookie
--session
①cookie机制
> cookie机制是采用客户端保持HTTP状态信息的方案
>cookie是在浏览器访问web服务器的某个资源的时候,由服务器在HTTP响应消息头中附带传给浏览器的一个小文本文件
浏览器 HTTP请求头中将这个cookie回传给服务器
>底层原理:web服务器通过HTTP响应消息中增加set-cookie响应字段将cookie信息发送给浏览器,浏览器则通过在HTTP请求头中增加cookie请求头字段将cookie回传给服务器
>限制:一个cookie只能标示一种信息,他至少含有标识该信息的名称name和设置值Value(只有一对)
一个web站点可以给一个服务器发送多个cookie,一个浏览器也可以存储多个站点的cookie信息,但是----->
浏览器一般只允 许存放300个cookie,一个站点最多20个,每个cookie的大小限制为4kb
>存储:cookie可以存储在浏览器的内存中(因为默认情况下cookie是会话级别的cookie,会话级别的cookie存储在浏览器的内存中,当用户退出浏览器时会被删除),也可以存在硬盘上。一般的cookie存在浏览器的内存中,当cookie设置了setMaxAge(Second sec);(以秒为单位)的时候,cookie会保存在硬盘上。当maxAge设置为0的时候,是要求浏览器删除cookie
② 会话级别的cookie与持久cookie的区别?
>存储位置:会话级别的cookie存在浏览器的内存中,持久cookie存储在硬盘上
>如果设置了过期时间,浏览器关闭后再打开这些cookie仍然有效,但是会话cookie则失效
>存储在硬盘上的cookie可以在同一个浏览器的不同进程之间使用,而保存在内存中的cookie,不同的浏览器处理不同。
③自动登录的原理--不需要填写用户名和密码就可以登录:
>若获得请求参数LoginName,将他打印,把登陆信息存储在cookie中,并设置最大时效。
>从cookie中读取用户信息,若存在则打印欢迎信息
>若既没有请求参数,有没有cookie,则重定向到login.jsp
④设置cookie的作用路径
cookie的作用范围:当前目录和当前目录的子目录,但不能作用当前目录的上一级。
cookie.setPath(request.getContextPath()+"/*相对于当前web应用的绝对目录*/");
----------------------------------------------------------------------------------------------------------------------------
下面改写session了:
session中文翻译为会话,在web开发环境下的的语义又有了新的扩展,他的含义是一类用于客户端与服务器保持状态的一种解决方案,有时候也用来只这种解决方案的一种存储结构。
①session机制:
>session机制采用服务器端爆出HTTP状态信息的方案
>服务器使用一种类似于散列表的结构(也许。。。就是散列表呢)来存储信息
>当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否包含了一个session标识(jsessionid)如果包含了这个标识则将该session检索出来,若没有检索到,则会新创建一个,这种情况可能出现在服务器端已经删除了该用户对应的session对象,但是用户认为的在请求的url后面附加一个JSESSIONID的参数。
>如果客户端不包含色色死哦你的,则为用户创建一个session,并生成一个与此session相关联的sessionid ,这个sessionid在本次响应中返回给客户端保存。当客户端再次请求时,会将该sessionid放在cookie中回传给服务器,以此每次请求都这样。浏览器不关,带sessionid的cookie存在。 。。。。。。。。。。有一个问题就是,如果浏览器单方面的禁用cookie,那么用cookie承载sessionid的登录是登陆不上去的。
② 保存sessionid的两种方式:
一种是保存在cookie中,这样浏览器可以自动的按照规则的把这个标识发送给服务器。如果cookie被禁用,那么采用第二种, 将sessionid附加在URL路径的后面,但是最常用的还是放在cookie中。
③ session-cookie
session通过sessionID来区分不同的客户,session是以cookie 或者URL重写为基础的,默认为session-cookie来实现,系统会创造一个名为 JSESSIONID的输出cookie,这个称为session-cookie,以区分persistent cookies(也就是我们平时所说的cookie)session-cookie是存储于浏览器内存中的,并不是写到硬盘上的,通常看不到JSESSIONID但是把浏览器的cookie禁用之后web服务器采用URL重写的方式,这时我们可以在地址栏中看得到,但是并不是所有人在你禁止cookie。
④ session持久化
就是让session-cookie这个cookie持久化,那么session就会持久化了。
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(600);
response.addCookie(cookie);
⑤ HTTP session的生命周期(即session什么时候创建什么时候销毁)
<1>什么时候创建session对象?
是否浏览器访问服务器端的一个JSP或者servlet,服务器就会创建一个session对象呢?自然答案是否定的。
# 如果JSP页面的头部声明中,有这样的声明:<%@ page session="false"%> page 的session属性是false,说明该JSP页面不会创建session对象,也不可以用session对象。
# 如果当前的JSP或者servlet是客户端访问的当前web应用的第一个资源,且JSP页面的page 的session属性值为false,那么也不会创建session对象。
# 如果当前的JSP不是客户端访当前web应用的第一个资源,且其他的页面已经创建了一个HttpSession对象,那么访问当前JSP的时候是不会创建新的session对象的,而是返回一个会话session对象。(同一个会话,只用第一个创建的session对象)
<2>什么时候销毁session对象
#q直接调用session.invalidate();使当前session失效。
#服务器卸载当前web应用
#session过期,默认的session存在的时间是半个小时,但是可以设置的,session.setMaxInactiveInterval(100);以秒为单位。或者在web.xml中单独设置。
##########################################################################################################
# TOMCAT的web.xml是总的xml文件,如果一个项目中有些属性不设置的话,就会用tomcat的web.xml文件中设置的属性值, #
# 如果需要单独设置的话,那么就在自己的项目下面的web.xml文件中单独配置,相当于tomcat的配置是一个全局的配置, #
##########################################################################################################
⑥ 如何获取一个HttpSession对象
对于servlet而言,若servlet是客户端访问的第一个资源,只是调用了 request.getSession(true);或者request.getSession();才会创建session对象。
⑦ 并不是关闭了浏览器就会销毁了session,因为session是在服务器端保存的,session的好处就是可以跨页面
如果禁用cookie那么每次的jsessionid都是新的。