扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
答:会话作用域ServletsJSP页面描述
我们提供的服务有:网站设计制作、网站建设、微信公众号开发、网站优化、网站认证、潼南ssl等。为成百上千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的潼南网站制作公司
page否是代表与一个页面相关的对象和属性。一个页面由一个编译好的Javaservlet类(可以带有任何的include指令,但是没有include动作)表示。这既包括servlet又包括被编译成servlet的JSP页面
request是是代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件(由于forward指令和include动作的关系)
session是是代表与用于某个Web客户机的一个用户体验相关的对象和属性。一个Web会话可以也经常会跨越多个客户机请求
application是是代表与整个Web应用程序相关的对象和属性。这实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域
何谓会话跟踪技术和ServletContext接口,我就简单的说一下。 会话跟踪技术就是服务器根据SessionId来判断与之交互的是不是同一个客户端。 ServletContext接口用于获取配置在web.xml文件中的初始化参数,可实现多个Servlet共享。 好吧,步入正题来说说你的问问。 ----------------------------------这是HTML中的代码---------------------------------------- 请输入姓名:input type="text" name="userName" ---------------------------------提交给Servlet--------------------------------------- String userName=request.getParameter("userName"); //取出HTML中姓名文本框中的值 request.getSession().setAttribute("userName",userName); //把姓名保存session中 this.getServletContext().setInitParameter("userName",userName); //把姓名保存到ServletContext中 说明: 放入Session中的数据在浏览器关闭之后就会消失。放入ServletContext中的数据,所有的Servlet都可以访问。 刚学完JSP,觉得Java有点小难。但是用心去领悟,必定会有所收获的。
HTTP是一种无连接的协议,如果一个客户端只是单纯地请求一个文件(HTML或GIF),服务器端可以响应给客户端,并不需要知道一连串的请求是否来自于相同的客户端,而且也不需要担心客户端是否处在连接状态。但是这样的通信协议使得服务器端难以判断所连接的客户端是否是同一个人。当进行Web程序开发时,我们必须想办法将相关的请求结合一起,并且努力维持用户的状态在服务器上,这就引出了会话追踪(session tracking)。
1:会话与会话追踪
session中文经常翻译为“会话”,其本来的含义是指有始有终的一系列动作或消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。有时候可以看到这样的话“在一个浏览器会话期间……”,这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间;如果说“用户在一次会话期间……”这样一句话,它指用户的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程;然而有时候也可能仅仅是指一次连接。session的含义很多,其中的差别只能靠上下文来推断。session tracking(会话追踪)是指一类用来在客户端与服务器之间保持状态的解决方案,简单地说,当一个客户在多个页面间切换时,服务器会保存该用户的信息。
2:实现会话追踪的4种方式会话追踪的实现方式有下列4种方式:
(1)使用持续Cookies(Persistent Cookies)。
(2)重写包含额外参数的URL(URL Rewriting)。
(3)建立含有数据的隐藏表单字段(Hidden Form Field)。
(4)使用内建session对象。
前三种会话追踪方式是传统的做法,每种做法都有缺点。最后一种方法是目前最常用,也是最有效的解决方案,因此在这里将把讨论重心放在第4种会话追踪方式上,然而为求彻底了解会话追踪的机制,还是先将传统的会话追踪方式先做一番介绍。(这里和我的理解不太一样,记录下我的理解,Session的机制是 Java Servlet 规范规定的,而tomcat container实现了这个规定,tomcat 是通过cookie 和 url rewriting的方式来实现的,也就是通过cookie 或url rewriting 保存一个seesionID, 这样在内部tomcat 把这个sesionID和一个Map联系起来,达到将变量和session联系起来的目的。所以第一和第二中方法是tomcat或其他servlet container实现session机制的手段,当然我们也可以自己实现。而第三种方法只是在两个页面跳转时传递变量的一种方式,要想用这种方式实现sesion机制还是不太现实,要每个页面都写下hidden数据,而且要写下所有要传的变量。)
2.1:使用Cookie
Cookie是一个小小的文本文件,它是将会话信息记录在这个文本文件内,每个页面都去Cookie中提取以前的会话信息。例如:
String sessionID = makeUniqueString();
HashMap sessionInfo = new HashMap();
HashMap globalTable = findTableStoringSessions();
globalTable.put(sessionID, sessionInfo);
Cookie sessionCookie =new Cookie("JSESSIONID", sessionID);
sessionCookie.setPath("/");
response.addCookie(sessionCookie);
上面这段代码先将会话信息记录在HashMap中,保存在服务器端,并用sessionID标识,然后把sessionID保存在名为“JSESSIONID”的Cookie中。
Cookie[] cookies = request.getCookies();
String sessionid = null;
HashMap sessionInfo = null;
HashMap globalTable = findTableStoringSessions();
if(cookies!=null){
for(int i=0;icookies.length;i++){
if(cookies[i].getName().equals("JSESSIONID")){
sessionid = cookies[i].getValue();
break;
}
}
if(sessionid!=null){
sessionInfo = globalTable.get(sessionid);
//We can use the sessionInfo to get value that we want
}
}
用户请求到达服务器后,先从Cookie中取出sessionID,然后从HashMap中取出会话信息。这样就实现了会话追踪。
虽然Cookie强大且持续性高,但是由于有些用户因为担心Cookie对个人隐私的威胁,会关闭Cookie,一旦如此,便无法利用Cookie来达到会话追踪的功能。
2.2:URL重写
URL重写是利用GET的方法,在URL的尾部添加一些额外的参数来达到会话追踪(session tracking)的目的,服务器将这个标识符与它所存储的有关会话的数据关联起来。URL看起来如下:
;jsessionid=1234,
使用URL重写的优点是Cookie被禁用或者根本不支持的情况下依旧能够工作。但也有很多缺点:
1. 必须对所有指向您的网站的URL进行编码。
2. 所有页面必须动态生成。
3. 不能使用预先记录下来的URL进行访问,或者从其他网站链接进行访问。
2.3:隐藏表单字段
隐藏表单字段的方法,是利用HTML内hidden的属性,把客户端的信息,在用户不察觉的情形下,偷偷地随着请求一起传送给到服务器处理,这样一来,就可以进行会话跟踪的任务了。可以下列的方法来做隐藏表单字段的会话追踪。
input type="hidden" name="userID" value="15"
然后将重要的用户信息,如ID之类独一无二的数据,以隐藏字段的方式传送给服务器。隐藏字段的优点在于session数据传送到服务器端时,并不象GET的方法,会将session数据保露在URL之上。不过这种做法还是有它的缺点:一旦session数据储存在隐藏字段中,就仍然有暴露数据的危机,因为只要用户直接观看HTML的源文件,session数据将会暴露无疑。这将造成安全上的漏洞,特别当用户数据是依赖于用户ID、密码来取得的时候,将会有被盗用的危险。另外这种方法只适用特定的一个流程,不适用于通常意义的会话跟踪。
2.4:使用内建session对象
传统的会话追踪方式使用比较麻烦,Servlet的会话机制基于Cookie或URL重写技术,融合了这两种技术的优点。当客户端允许使用Cookie时,内建session对象使用Cookie进行会话追踪;如果客户端禁用Cookie,则选择使用URL重写。
(1)获取session对象例如把购物车作为属性存储在session中,在其他JSP页面中可以通过session再获得购物车。
// 在JSP页面中可以直接使用session
ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
内建的session对象是javax.servlet.http.HttpSession类的实例,如果在JavaBean或者Servlet中使用session就需要先从当前的request对象中取得,例如:
// 得到用户session和购物篮
HttpSession session = request.getSession();
ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
(2)读写session中的数据向session中存入对象使用setAttribute方法,通过getAttribute方法读取对象。从session返回的值注意要转换成合适的类型,要注意检查结 果是否为null。例如下面一段代码:
HttpSession session = request.getSession();
SomeClass value = (SomeClass)session.getAttribute("someID");
if (value == null) {
value = new SomeClass(...);
session.setAttribute("someID", value);
}
doSomethingWith(value);
(3)废弃session数据调用removeAttribute废弃session中的值,即移除与名称关联的值。
调用invalidate废弃整个session,即废弃当前的session。
如果用户注销离开站点,注意废弃与用户相关联的所有session。
(4)session的生命周期由于没有办法知道HTTP客户端是否不再需要session,因此每个session都关联一个时间期限使它的资源可以被回收。setMaxInactiveInterval(int secondsToLive)
(5)服务器使用session时,默认使用Cookie技术进行会话追踪,通常,会话管理是通过服务器将 Session ID 作为一个 cookie 存储在用户的 Web 浏览器中,并用它来唯一标识每个用户会话。如果客户端不接受Cookie的时候,服务器可以利用URL重写的方式将sessionID作为参数附在URL后面,来实现会话管理。
当我们在进行forward,redirect时,一定要调用下边两个方法,以保持session一直有效(如果不调用的话,那么你到了新的页面时session就失效了,因为session ID没有传过来)
Servlet中Interface HttpServletResponse 规定了两个方法,response.encodeURL()或response.encodeRedirectURL()方法,这两个方法首先判断Cookies是否被浏览器支持;如果支持,则参数URL被原样返回,session ID将通过Cookies来维持;否则返回带有sessionID的URL。Tomcat服务器实现了这两个方法。
下面是使用encodeURL方法的示例,两个文件hello1.jsp和hello2.jsp。
a: hello1.jsp的完整程序代码如下:
%@ page contentType="text/html;charset=gb2312"%
%String url =response.encodeURL("hello2.jsp");%
a href='%=url%'进入到hello2.jsp/a
b: 解释:
hello1.jsp利用了response对象内的encodeURL方法,将URL做了一个编码动作。编码不是这里关心的重点,重点是如果浏览器的cookie被禁用的话那么象;jsessionid=A09F3A5583825EE787580106CC62A1E8 这样字符串就会被添加到 hello2.jsp 的后面,也就是告诉了下一个页面session的信息。
b: 若要使用重定向,例如:
response.sendRedirect("hello2.jsp");也应该改为:response.sendRedirect(response.encodeRedirectURL("hello2.jsp"));同时需要注意的是,将session的ID以URL的编码方式进行时,需将每一页都编码,才能保留住session的ID。如果遇到没有编码的URL,则无法进行会话跟踪。
c: hello2.jsp的完整程序代码如下:
%@ page contentType="text/html;charset=gb2312"%
% out.println("sessionID is "+session.getId());%
d: 可以看到如果服务器使用URL重写,它将会话信息附加到URL上,如下所示:
;jsessionid=A09F3A5583825EE787580106CC62A1E8
e: 实质上 URL 重写是通过向 URL 连接添加参数,并把 session ID 作为值包含在连接中,以便应用服务器可以根据sessionID从cache中的取回session.
TOMCAT服务器
SESSION实现会话跟踪通常是cookie和url重写,如果浏览器不禁止cookie的话,tomcat优先使用cookie实现,否则它将使用URL重写来支持SESSION.
URL重写的额外数据是服务器自动添加的,那么服务器是怎么添加的呢?Tomcat在返回Response的时候,检查JSP页面中所有的URL,包括所有的链接,和 Form的Action属性,在这些URL后面加上“;jsessionid=xxxxxx”。添加url后缀的代码片段如下:
org.apache.coyote.tomcat5.CoyoteResponse类的toEncoded()方法支持URL重写。
1 StringBuffer sb = new StringBuffer(path);
2 if( sb.length() 0 ) { // jsessionid can't be first.
3 sb.append(";jsessionid=");
4 sb.append(sessionId);
5 }
6 sb.append(anchor);
7 sb.append(query);
8 return (sb.toString());
多敲!!!多敲!!!多敲!!!
基本上每一个初学者都会遇到这样的问题,包括我之前也是一样,导致的原因就是自己不喜欢动手,就算自己有了思路,却不知道从何下手;因为在你的脑海中一直对这些题目都是存在于数学上面的操作,真的要使用代码去实现的时候你脑子就会一篇空白
一个代码写多了的人,不管你的需求再难,他也能写出一个基本的框架出来,也不至于无从下手,因为代码写多了的人都会总结出一套规律,开发都是这一个套路
《2020最新Java基础精讲视频教程和学习路线!》
就跟你建房子一样,基本的框架搭建完毕之后,只需要慢慢砌砖就行了
所以,学习Java最注重的就是实操,大家都知道去一个公司之后都是动手敲代码,而不是在旁边指挥,因为公司不会给你这么大的权力,你也达不到这样的级别,所以公司要的是能够写代码的人,你的理论在这里没有太大的作用
站在岸上学不会游泳的道理大家都应该知道
Java学习路线
第一阶段:
学习java首先是得安装配置jdk
下面开始我们愉快且掉头发的java之旅
1、入门的基本礼仪:HelloWord
2、Java基础语法
3、Java条件结构
4、Java循环结构
第二阶段:
数组:数组作为java里面的第一个可以存储数据的容器,也是后面集合的基础
第三阶段:
面向对象:万物皆可对象,这也是java的核心思想,编程的时候也要面向对象编程,符合Java的编程规范
JVM:了解Java中的变量、常量、引用在JVM中国的存储区域
第四阶段:
Java常用类库:String字符串的应用、Math和Date、集合框架、异常处理、反射
第五阶段:
IO流:字节流、字符流、其他流、文件读写及编辑、文件上传下载
第六阶段:
多线程与网络编程
第七阶段:数据库
Mysql数据库:
数据库基础
数据库的安装
使用语句建表
使用语句进行增、删、改、查
多表查询
子查询
复合查询
分页查询
分组查询
数据字典
访问控制
存储过程
可视化工具的使用
JDBC:
JDBC基础
ORM
JDBC高级
第八阶段:前端基础
HTML:
HTML基础
HTML常用标签
HTML表格
HTML表单
HTML多媒体
网页整体结构
CSS:
CSS选择的样式
CSS文本样式
CSS背景和列表
CSS盒子模型
Float浮动
CSS定位
CSS网页布局
CSS网页布局基础
JS:
JavaScript基础语法
JavaScript流程控制语句
JavaScript函数
JavaScript内置对象
JavaScriptDOM基础
JavaScriptDOM事件
JavaScript实现轮播效果
JQuery:
Ajax基础
JQuery选择器
JQuery属性操作
JQuery常用函数
JQuery事件处理
JQuery异步请求
第九阶段:Javaweb
JAVAWEB:
JAVAWEB核心基础
JAVAWEB中jsp及java脚本指令
Jsp中隐式对象
Servlet核心处理器
Jsp与servlet实现登录
JAVAWEB中的session
JAVAWEB的会话跟踪
Jsp动作应用
Jsp的EL表达式
JSTL标签使用
JSTL循环迭代
JSTL EL综合练习
AOP编程
Filter过滤器应用实例
JAVAWEB文件上传下载
MVC模型
第十阶段:高级框架
springFramework构建javaweb应用:
springFramework框架概述
使用注解把类托管给spring
Lod4j
Spring整合JDBC
JDBC Template实现数据操作
SpringMVC应用基础核心
视图解析器和RequestMapping注解
控制请求方法的参数设置
视图转发、重定向
Mybatis框架的应用:
Mybatis黑心基础概述
Mybatis全局配置
Mybatis基本查询映射
Mybatis更新映射和缓存
Mybatis查询结果的封装和高级映射
Mybatis动态SQL
SPring整合Mybatis
第十一阶段:扩展内容
Junit
设计模式
GIT/SVN代码管理器
Redis
Maven
Springboot
Springcloud
Linux
Shiro
springSecurity
Elasticsearch
Lucene
Vue
Oracle
Spring Data JPA
抄代码虽然是程序员的日常,但是初学者非常不建议去抄代码,抄的代码只会让你越抄越乱,从而使自己的思维就依赖在了百度上,自己一点思维都没有,那有如何去提升自己呢
代码一定要有自己的思路,然后再把自己的思路转为代码实现,这才是学习Java的正确方式
原文链接:网页链接
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流