Cookie与Session

Posted wzscom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cookie与Session相关的知识,希望对你有一定的参考价值。

Servlet细节                    配置多个路              

第一种方式

在一个servlet-mapping中配置多个url-pattern

1. <servlet-mapping>

2. <servlet-name>hello</servlet-name>

3. <url-pattern>/hello</url-pattern>

4. <url-pattern>/hi</url-pattern>

5. </servlet-mapping>

 

第二种方式

配置多个servlet-mapping

1. <servlet-mapping>

2. <servlet-name>hello</servlet-name>

3. <url-pattern>/hello</url-pattern>

4. </servlet-mapping>

5. <servlet-mapping>

6. <servlet-name>hello</servlet-name>

7. <url-pattern>/hi</url-pattern>

8. </servlet-mapping>

 

访问网站的默认页面设置

大家想一下,我们访问的时候有一个默认页面(index.html),这是为什么呢?

在主web.xml中就有默认页面的配置,大家请看:

1. <welcome-file-list>

2. <welcome-file>index.html</welcome-file>

3. <welcome-file>index.htm</welcome-file>

4. <welcome-file>index.jsp</welcome-file>

5. </welcome-file-list>

Servlet初始化

之前我们学习过,Servlet的生命周期:

构造 -> init方法 -> [service](循环) -> distory(正常关闭)

也就是我们只有在访问的时候servlet才创建。

现在我们学一种方式,在启动的时候就创建Servlet

<load-on-startup>1</load-on-startup>

注意中间的数据:最小启动越早

 

使用注解配置Servlet

在开发中,我们针对一个Servlet配置,使用xml。最少需要8(如下)

1. <servlet>

2. <servlet-name>hello</servlet-name>

3. <servlet-class>cn.itsource._01_mapping.HelloServlet</servlet?class>

4. <init-param>

5. <param-name>encoding</param-name>

6. <param-value>utf-8</param-value>

7. </init-param>

8. <load-on-startup>1</load-on-startup>

9. </servlet>

10.

11. <servlet-mapping>

12. <servlet-name>hello</servlet-name>

13. <url-pattern>/hello</url-pattern>

14. </servlet-mapping>

 

JavaEE6(Tomcat7,Servlet3.0)开始,可以使用注解来取代部分web.xml配置.

 

1.metadata-complete="true": 是否不扫描类上的WebServlet注解. 不扫描

 

2.metadata-complete="false" 要扫描, 缺省值.

 

配置文件和注解的选择

从开发角度上:注解,简单:

从维护角度上:注解,维护困难.

使用注解又把硬编码再次拉回到代码中:

开发中:通用配置一般使用xml完成.(维护性好,清晰)

特殊/个体自身配置,使用注解.

 

线程安全

 

分析Servlet的优点和缺点:

 

优点: 动态网页,跨平台的,单例的(速度快).

 

缺点: 在面对多线程并发访问,Servlet线程不安全问题,输出界面恶心..

技术分享图片

解决方案:

1.Servlet实现javax.servlet.SingleThreadModel接口: 同时只能让一个线程来访问资源,若是多个资源, 进入等待(不推荐).

2.Servlet中不要使用成员变量.

注:struts1springmvc是线程不安全的,struts2是线程安全的

 

3.无状态的HTTP

Http:表示超文本的传输协议

特点:无状态的---多个请求之间,不会去共享信息

 

什么是会话

可简单理解为:用户开一个浏览器,访问某一个web站点,在这个站点点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一次会话。

 

会话跟踪

HTTP是无状态协议,没有记忆力,不知道哪一个客户端请求了自己,每个请求之间无法共享数据。这就无法知道会话什么时候开始,什么时候结束,也无法确定发出请求的用户身份。

在一次会话中多次请求共享数据即会话跟踪技术.

 

解决HTTP无状态的问题:参数传递

把我们需要保持状态的数据在每次跳转的时候都传到另一个页面上去

技术分享图片

这种方式有天生的缺陷:

1. 跳转的网页过多,传值会变得非常麻烦

2. 安全性太低,从地址栏就可以看到参数

3. 传值数据有限(地址栏参数是有限制的)

4. 不可以传递对象

3.Cookie

 

cookie的原理

Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookiekey/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。

Cookies最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入

此网站时保留用户信息以便简化登录手续,这些都是Cookies的功用。另一个重要应用场合是“购物车

”之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookies,以便在最后付款时提取信息。

技术分享图片

 创建cookie

 技术分享图片

得到cookie

技术分享图片

删除Cookie

很坑的就是,并没有提供删除Cookie给我们

cookie.setMaxAge(0);

 Cookie的生命周期(了解)

生:Cookie在创建之后放到浏览器中

死:关闭浏览器

我们可以自己去设置Cookie的存在时间

cookie.setMaxAge(int second);

 

 Cookie有什么问题

①它还是不安全(cookie存在客户端)

②操作中文太麻烦了

Cookie依然是有限制的

   Cookie大小限制在4KB之内;

    * 一台服务器在一个客户端最多保存20个Cookie;

* 一个浏览器最多可以保存300个Cookie;

Cookie不能操作对象

 

好处:可以设置保存很长的时间

技术分享图片

创建session

HttpSession session = req.getSession();技术分享图片

怎么能session里面设置值

语法:-session.setAttribute(String key, Object obj);

session.setAttribute("name", name);

session.setAttribute("user", user);

怎么从session里面取值

语法:req.getSession().getAttribute(String key);

req.getSession().getAttribute("name")

 

删除session中的值

根据一个key删除session中的一条记录

req.getSession().removeAttribute("name");(使用多一点 掌握)

销毁整个Session对象

req.getSession().invalidate();

 技术分享图片

session的生命周期(会话的生命周期)

从我们创建session开始,到关闭浏览器死亡

Session有超时时间,默认为30分钟

当我们没有操作开始计算.....

既然有默认的,那么我们就可以自定义一个时间(秒)...

 技术分享图片

 

 

 

 

 

 

 

以上是关于Cookie与Session的主要内容,如果未能解决你的问题,请参考以下文章

cookie与session

Web会话跟踪:Cookie与Session

1204 中间件以及cookie,session

[TimLinux] HTTP cookie与session技术

Session

cookie/session应用笔记