DNS解析过程&Servlet源码分析&外网映射工具&Cookie与Session实现原理
一、javaee与javase的区别
javaee:主要面向web开发,企业ee 比如有Spring、Mybatis、Hibernate
javase:主要是面向对象,多线程、IO流、集合、网络编程等。后面有Netty NIO
B/S:就是web程序,使用浏览器可以访问的
C/S:就是需要下载安装包。是桌面应用程序
二、web服务器
服务器概念理解:
种类:web服务器:PC机器上安装具有一个web服务器的软件。
数据库服务器:在PC机上安装具有一个数据管理服务器。
邮件服务器:在PC机器上安装具有发送邮件的功能。
web服务器的作用:就是将本地资源共享给外部访问。
市面上的web服务器:
tomcat:
jetty
webloic
jobss
三、DSN解析过程
什么是DNS域名解析?
答:
DNS:就是将域名转换程IP地址。
IP+端口号/路径=http tcp 三次握手、短连接、面向连接
同步:就是及时请求与响应的过程。
本地host文件路径 C:\Windows\System32\drivers\etc
DNS解析步骤:
四、Servlet生命周期&源码分析
init--service(doGet或者doPost)-->destory()
Servlet:是单例模式,因为只初始化了一次。节约内存。
定义抽象类就是让子类重写。
Servlet执行流程:
1、读取web.xml文件,解析servlet类
2、使用java反射机制初始化类。
3、走HttpServlet父类调用service方法。
4、通过service方法判断请求方式。
5、具体实现子类方法。
service()方法与doGet()方法有什么区别?
答:
1:service()方法作用是判断请求方式,如何是Get请求就调用doGet方法。如果
是doPost方法就调用Post方法。
五、Servlet是否是线程安全
Servlet:线程是不安全的,因为Servlet是单例的。
解决方案就是要加锁,加sychronized同步代码块。
使用Servlet注意不要定义成员变量,否则会出现线程不安全。
六、cookie底层实现原理
cookie底层执行原理:
1、创建cookie过程使用响应头返回给客户端
2、客户端获取服务器创建饿cookie信息保存在本地
3、每次请求浏览器会将本地cookie信息放入请求头中。
4、服务器端直接从请求头中获取我们的cookie信息。
注意:cookie不能跨浏览器查询。
因为浏览器不能。cookie位置不同,差不到。
servlet代码:
package com.leeue.cookie;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @classDesc: 功能描述:(cookie底层实现原理 服务器端创建cookie)
* @author:<a href="leeue@foxmail.com">李月</a>
* @Version:v1.0
* @createTime:2018年8月2日 上午10:08:50
*/
@WebServlet("/addcookie")
public class AddCookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("leeue", "哈哈哈");
//响应头添加cookie
resp.addCookie(cookie);
System.out.println("添加cookie成功");
}
}
通过响应头
通过控制台查看:
查看cookie
在客户端获取cookie
代码实现:
package com.leeue.cookie;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @classDesc: 功能描述:(客户端 获取cookie)
* @author:<a href="leeue@foxmail.com">李月</a>
* @Version:v1.0
* @createTime:2018年8月2日 上午10:11:06
*/
@WebServlet("/getcookie")
public class GetCookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
for(Cookie cookie:cookies) {
System.out.println(cookie.getName() +"-----"+cookie.getValue());
}
}
}
七、session底层实现原理
1、创建session的时候调用=req.getSession(true);
HttpSession session = req.getSession(true);
2、创建session值成功后,将sessionId返回给客户端(是通过响应头返回给客户端)
这个sessionId值是存放在服务器端的,JVM内存中的。
3、本地sessionid放入请求头中。
4、服务器端使用请求头获取sessionId找到对应的session值信息。
服务器端获取:
换个浏览器也不能获取到session的,因为改浏览器没有对应的sessionID
创建session代码:
package com.leeue.session;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
*
* @classDesc: 功能描述:(创建session )
* @author:<a href="leeue@foxmail.com">李月</a>
* @Version:v1.0
* @createTime:2018年8月2日 上午10:43:58
*/
@WebServlet("/addsession")
public class AddSessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//默认不传为true 没有sessionid,就会自己创建一个sessionid,否则就不会创建一个sessionid
HttpSession httpSession = req.getSession(true);
httpSession.setAttribute("userName", "leeue");
System.out.println("创建session...");
}
}
获取session
package com.leeue.session;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
*
* @classDesc: 功能描述:(获取session)
* @author:<a href="leeue@foxmail.com">李月</a>
* @Version:v1.0
* @createTime:2018年8月2日 上午10:44:30
*/
@WebServlet("/getsession")
public class GetSessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取session的时候,如果这里设置为false,就不会自动创建sessionID
//如果这里设置成true,没有从浏览器上获取sessionId的时候会自己创建
一个sessionId.
HttpSession session = req.getSession(false);
String userName = (String) session.getAttribute("userName");
System.out.println("userName:"+userName);
}
}