Java架构学习(十五)DNS解析过程&Servlet源码分析&外网映射工具&Cookie与Session实现原理

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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值