Cookie和Session,访问Web项目上的资源文件

Posted

tags:

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

WEB项目总路径问题总结:

背景:项目中的资源文件我们如何访问:(路径怎么写)

例子:webRoot目录下有一个目标资源: target.html,如何访问

 技术分享

 

 

 

思考:

目标资源是给谁使用的。

 * 给服务器使用的:   / 表示在当前web应用的根目录(webRoot下)

 * 给浏览器使用的: /  表示在webapps的根目录下

 

代码测试:

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html;charset=utf-8");

//目标资源: target.html

/**

 * 思考: 目标资源是给谁使用的。

 * 给服务器使用的:   / 表示在当前web应用的根目录(webRoot下)

 * 给浏览器使用的: /  表示在webapps的根目录下

 */

/**

 * 1.转发:服务器内部使用,直接访问,不要项目名

 */

// request.getRequestDispatcher("/target.html").forward(request, response);

 

/**

 * 2.请求重定向 : 浏览器访问项目,需要项目名

 */

// response.sendRedirect("/day11/target.html");

 

/**

 * 3.html页面的超连接href : 超链接,浏览器访问:需要项目名

 */

// response.getWriter().write("<html><body><a href=‘/day11/target.html‘>超链接</a></body></html>");

 

/**

 * 4.html页面中的form提交地址  : 浏览器范文,需要项目名

 */

response.getWriter().write("<html>"

+ "<body>"

+ "<form action=‘/day11/target.html‘>"

+ "<input type=‘submit‘/>"

+ "</form>"

+ "</body>"

+ "</html>");

}

 

获取Tomcat服务器项目路径

API介绍:

request.getSession().getServletContext().getRealPath("/")

 

 

打印的结果是:

 技术分享

 

代码:

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

System.out.println(request.getSession().getServletContext().getRealPath("/"));

}

读取Web应用路径下的配置文件:

代码一::

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

/**

 * 使用web应用下加载资源文件的方法

 */

/**

 * 1. getRealPath读取,返回资源文件的绝对路径(物理路径):服务器内部调用,不用项目名

 */

String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");

System.out.println(path);

File file = new File(path);

FileInputStream in = new FileInputStream(file);

 

Properties prop = new Properties();

// //读取资源文件

prop.load(in);

 

String user = prop.getProperty("user");

String password = prop.getProperty("password");

System.out.println("user="+user);

System.out.println("password="+password);

}

 

打印结果:

user=root

password=root

 

代码二,使用类加载器方式:

InputStream in=ResourceDemo.class.getClassLoader().getResourceAsStream("db.properties");

 

 

Properties prop = new Properties();

// //读取资源文件

prop.load(in);

//

String user = prop.getProperty("user");

String password = prop.getProperty("password");

System.out.println("user="+user);

System.out.println("password="+password);

 

打印结果一样

代码三:

/**

 * 2. getResourceAsStream() 得到资源文件,返回的是输入流

 */

InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");

Properties prop = new Properties();

//读取资源文件

prop.load(in);

 

String user = prop.getProperty("user");

String password = prop.getProperty("password");

System.out.println("user="+user);

System.out.println("password="+password);

 

注意一下,下面的代码效果是一样的:

request.getSession().getServletContext().getRealPath("/")

this.getServletContext().getRealPath("/");

ResourceDemo.class.getClassLoader().getResourceAsStream("db.properties")

this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");

 

会话管理

概念:

会话管理: 管理浏览器客户端 和 服务器端之间会话过程中产生的会话数据

会话技术:

Cookie技术:会话数据保存在浏览器客户端。

Session技术:会话数据保存在服务器端。

 

Cookie技术以及常用的API

特点:

Cookie技术:会话数据保存在浏览器客户端

 

Cookie类:用于存储会话数据

1)构造Cookie对象

Cookie(java.lang.String name, java.lang.String value)

2)设置cookie

void setMaxAge(int expiry) : 设置cookie的有效时间

void setValue(java.lang.String newValue) :设置cookie的值

3)发送cookie到浏览器端保存

void response.addCookie(Cookie cookie)  : 发送cookie

4)服务器接收cookie

Cookie[] request.getCookies()  : 接收cookie

 

代码演示

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//1.创建Cookie对象

Cookie cookie1 = new Cookie("name","eric");

cookie1.setValue("jerry");

 

/**

 * 2)设置cookie的有效时间

 * 正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。

负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!!

零:表示删除同名的cookie数据

 

 */

cookie1.setMaxAge(20); //20秒,从最后不调用cookie开始计算 数字表示时间

// cookie1.setMaxAge(-1); //cookie保存在浏览器内存(会话cookie)

// cookie1.setMaxAge(0);

 

 

//2.把cookie数据发送到浏览器(通过响应头发送: set-cookie名称)

response.addCookie(cookie1);

 

//3.接收浏览器发送的cookie信息

Cookie[] cookies = request.getCookies();

//注意:判断null,否则空指针

if(cookies!=null){

//遍历

for(Cookie c:cookies){

String name = c.getName();

String value = c.getValue();

System.out.println(name+"="+value);

}

}else{

System.out.println("没有接收cookie数据");

}

}

 

打印结果:

 技术分享

 

Cookie原理

1)服务器创建cookie对象,把会话数据存储到cookie对象中。

new Cookie("name","value");

2 服务器发送cookie信息到浏览器

response.addCookie(cookie);

3)浏览器得到服务器发送的cookie,然后保存在浏览器端。

4)浏览器在下次访问服务器时,会带着cookie信息

5)服务器接收到浏览器带来的cookie信息

request.getCookies();

 

删除Cookie

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

/**

 * 需求: 删除cookie

 */

Cookie cookie = new Cookie("name","xxxx");

 

cookie.setMaxAge(0);//删除同名的cookies   这个位置不要和下面那一行到代码换位置

 

// 把cookie数据发送到浏览器(通过响应头发送: set-cookie名称)

response.addCookie(cookie);

 

System.out.println("删除成功");

 

//3.接收浏览器发送的cookie信息

Cookie[] cookies = request.getCookies();

//注意:判断null,否则空指针

if(cookies!=null){

//遍历

for(Cookie c:cookies){

String name = c.getName();

String value = c.getValue();

System.out.println(name+"="+value);

}

}else{

System.out.println("没有接收cookie数据");

}

}

 

打印结果:

 技术分享

 

 

Cookie应用:用户上次访问的时间

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html;charset=utf-8");

 

//获取当前时间

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

String curTime = format.format(new Date());

 

//取得cookie

Cookie[] cookies = request.getCookies();

String lastTime = null;

if(cookies!=null){

for (Cookie cookie : cookies) {

if(cookie.getName().equals("lastTime")){

//有lastTime的cookie,已经是第n次访问

lastTime = cookie.getValue();//上次访问的时间

//第n次访问

//1.把上次显示时间显示到浏览器

response.getWriter().write("欢迎回来,你上次访问的时间为:"+lastTime+",当前时间为:"+curTime);

//2.更新cookie

cookie.setValue(curTime);

cookie.setMaxAge(1*30*24*60*60);

//3.把更新后的cookie发送到浏览器

response.addCookie(cookie);

break;

}

}

}

 

 

Session技术

引入

Cookie的局限:

1Cookie只能存字符串类型。不能保存对象

2)只能存非中文。

31Cookie的容量不超过4KB

如果要保存非字符串,超过4kb内容,只能使用session技术!!!

 

Session技术的特点:

Session特点:

会话数据保存在服务器端。(内存中)

 

Session技术主要的类和API

HttpSession类:用于保存会话数据

 

1)创建或得到session对象

HttpSession getSession()  

HttpSession getSession(boolean create)  

2)设置session对象

void setMaxInactiveInterval(int interval)  : 设置session的有效时间

void invalidate()     : 销毁session对象

java.lang.String getId()  : 得到session编号

3)保存会话数据到session对象

void setAttribute(java.lang.String name, java.lang.Object value)  : 保存数据

java.lang.Object getAttribute(java.lang.String name)  : 获取数据

void removeAttribute(java.lang.String name) : 清除数据

 

代码测试:

SessionDemo1.java

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//1.创建session对象

HttpSession session = request.getSession();

 

/**

 * 得到session编号

 */

System.out.println("id="+session.getId());

 

/**

 * 修改session的有效时间 单位  :秒

 */

session.setMaxInactiveInterval(10);

 

/**

 * 手动发送一个硬盘保存的cookie给浏览器

 */

Cookie c = new Cookie("JSESSIONID",session.getId());

c.setMaxAge(60*60);

response.addCookie(c);

 

 

//2.保存会话数据

session.setAttribute("name", "rose");

}

 

SessionDemo2.java

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//1.得到session对象  

HttpSession session = request.getSession(false);

 

if(session==null){

System.out.println("没有找到对应的sessino对象");

// return;

}

 

//3.接收浏览器发送的cookie信息

Cookie[] cookies = request.getCookies();

//注意:判断null,否则空指针

if(cookies!=null){

//遍历

for(Cookie c:cookies){

String name = c.getName();

String value = c.getValue();

System.out.println(name+"="+value);

}

}else{

System.out.println("没有接收cookie数据");

}

 

/**

 * 得到session编号

 */

if(session  != null){

System.out.println("id="+session.getId());

//2.取出数据

String name = (String)session.getAttribute("name");

System.out.println("name="+name);

}

}

 

Session的一些细节:

1java.lang.String getId()  : 得到session编号

2)两个getSession方法:

getSession(true) / getSession()  : 创建或得到session对象。没有匹配                         的session编号,自动创建新的session对象。

   getSession(false):  得到session对象。没有匹配的session编号,返回null

3void setMaxInactiveInterval(int interval)  : 设置session的有效时间

session对象销毁时间:

3.1 默认情况30分服务器自动回收

3.2 修改session回收时间

3.3 全局修改session有效时间

<!-- 修改session全局有效时间:分钟 -->

<session-config>

<session-timeout>1</session-timeout>

</session-config>

3.4.手动销毁session对象

void invalidate()     : 销毁session对象

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

HttpSession session = request.getSession(false);

if(session!=null){

session.invalidate();//手动销毁

System.out.println("手动销毁");

}

System.out.println("销毁成功");

}

 

Session的原理

问题: 服务器能够识别不同的浏览者!!!

  现象:

   前提: 在哪个session域对象保存数据,就必须从哪个域对象取出!!!!

浏览器1(s1分配一个唯一的标记:s001,s001发送给浏览器)

1)创建session对象,保存会话数据

HttpSession session = request.getSession();   --保存会话数据 s1

浏览器1 的新窗口(带着s001的标记到服务器查询,s001->s1,返回s1

1)得到session对象的会话数据

    HttpSession session = request.getSession();   --可以取出  s1

 

新的浏览器1(没有带s001,不能返回s1)

1)得到session对象的会话数据

  HttpSession session = request.getSession();   --不可以取出  s2

 

浏览器2(没有带s001,不能返回s1)

1)得到session对象的会话数据

 HttpSession session = request.getSession();  --不可以取出  s3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以上是关于Cookie和Session,访问Web项目上的资源文件的主要内容,如果未能解决你的问题,请参考以下文章

cookie和session

session 和 cookie

Java Web 深入分析 Session 和 Cookie

cookie与session

认证 协议 JWT OAuth Session Cookie

如何获取SWT的browser组件的cookie或者session信息