DNS解析过程&servlet源码分析&外网映射工具&cookie与session

       DNS解析过程&servlet源码分析&外网映射工具&cookie与session

 

一、JavaEE与JavaSE基础:

1、javaEE和javaSE区别:

javaee:主要是web开发,企业ee spring、mybatis、hibernate

javase:面向对象、多线程、io流、网络

 

2、B/S与C/S区别:

C/S(Client-Server):客户端-服务端

特点:1)必须下载特定的客户端程序

           2)服务器端升级,客户端升级

代表:QQ、 桌面网络游戏

 

B/S(Broswer-Server):浏览器-服务器

特点:1)不需要安装特定的客户端(只需要安装浏览器即可!!)

           2)服务器端升级,浏览器不需要升级!!

代表:某猫,某东页面购物网站。

 

总结:Javaweb的程序就是B/S软件结果!

3、服务器Server

服务器:

从物理上来说,服务器就是一台PC机器。8核,8G以上,T来计算,带宽100M

 

web服务器:PC机器安装一个具有web服务的软件,称之为web服务器

数据库服务器:PC机器安装一个具有数据管理件服务的软件,称之为数据库服务器。

邮件服务器:PC机器安装一个具有发送邮件服务的软件,称之为邮件服务器。

 

web服务软件:

web服务软件的作用:把本地的资源共享给外部访问。

常见的市面上web服务软件:

WebLogic: BEA公司的产品。 收费的。支持JavaEE规范。

WebSphere: IBM公司的产品。收费的。支持JavaEE规范

JBoss: Redhat公司的产品。收费的。支持JavaEE规范

Tomcat: 开源组织Apache的产品。免费的。支持部分的JavaEE规范。(servlet、jsp。jdbc,但 ejb, rmi不支持)

 

二、DNS域名解析(将域名解析成ip地址)过程

1、本地DNS域名解析配置:

本地DNS域名配置文件路径以及添加配置:

在后台并开启一个服务:

图示介绍:

三、内网和外网(内网、外网是两种Internet的接入方式)

1、内网:内网通俗的说就是局域网LAN网,外网通俗的说就是与因特网相通的WAN广域网或 MAN 城域网路。内网外网是相对而言的。一般外网的范围比内网大,也可以说内网是外网的子网。

2、外网:外网(广域网)上的每一台电脑(或其他网络设备)都有一个或多个广域网IP地址(或者说公网、外网IP地址),广域网IP地址不能重复;局域网(LAN)上的每一台电脑(或其他网络设备)都有一个或多个局域网IP地址(或者说私网、内网IP地址),局域网IP地址是局域网内部分配的,不同局域网的IP地址可以重复,不会相互影响。

3、外网发布工具:

项目背景:在做一些支付项目、微信开发、或对接第三方接口的时候,有些回调操作,可能会需要外网访问

外网映射工具:netapp(免费)、花生壳

推荐工具地址:https://natapp.cn/article/natapp_newbie

 

四、Servlet核心介绍:

1、servlet声明周期:

servlet声明:新建一个类extends HttpServlet然后在web.xml中进行配置

    <!-- 配置servlet容器 -->
    <servlet>
    	<servlet-name>DemoServlet</servlet-name>
    	<servlet-class>com.itmayi.DemoServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
    	<servlet-name>DemoServlet</servlet-name>
    	<url-pattern>/DemoServlet</url-pattern>
    </servlet-mapping>

 

构造方法:创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建servlet对象只调用1次。证明servlet对象在tomcat是单实例的。

init():创建完servlet对象的时候调用。只调用1次。

service():每次发出请求时调用。调用n次。

destory():销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象。只调用1次。

 

2、servlet源码分析:

eclipse中源码分析快捷键:

ctrl+o:可以快速看到该类的所有声明的变量和方法

ctrl+t:可以看到具体的类继承关系

源码分析类的关系图:具体的方法看源码

servlet执行流程和service方法与doget/dopost方法区别:

3、servlet安全性:

Servlet的多线程并发问题:

注意: servlet对象在tomcat服务器是单实例多线程的。

因为servlet是多线程的,所以当多个servlet的线程同时访问了servlet的共享数据,如成员变量,可能会引发线程安全问题。

解决办法:

1)把使用到共享数据的代码块进行同步(使用synchronized关键字进行同步)

2)建议在servlet类中尽量不要使用成员变量。如果确实要使用成员,必须同步。而且尽量缩小同步代码块的范围。(哪里使用到了成员变量,就同步哪里!!),以避免因为同步而导致并发效率降低。

Servlet学习:

 HttpServletRequest  请求对象:获取请求信息

 HttpServletResponse 响应对象: 设置响应对象

 ServletConfig对象    servlet配置对象

 ServletContext对象; servlet的上下文对象

 

servlet是单例的不安全,因为两个不同浏览器的同一个web请求,servlet的构造函数只执行了一次,且会发生线程安全问题。

线程安全问题解决:

public class DemoServlet extends HttpServlet{
	
    // volatile使得线程可见
	private volatile int i = 1;
	/**
	 * 无惨构造函数 只初始化一次说明DemoServet是一个单例。
	 */
	public DemoServlet() {
		System.out.println("DemoServlet无参构造函数");
	}
	
	@Override
	public void init() throws ServletException {
		System.out.println("初始化...");
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {	
			try {
				System.out.println("处理请求...");
				resp.setCharacterEncoding("utf-8");// 内容编码,防止出现中文乱码
				resp.setContentType("text/html;charset=utf-8");
				// 同步代码块
                synchronized (DemoServlet.class) {
					resp.getWriter().write("这是第" + i + "次访问...");
					Thread.sleep(5000);
					i++;
				}
				
			} catch (InterruptedException e) {
				e.printStackTrace();
			}					
	}
	
	@Override
	public void destroy() {
		System.out.println("销毁方法...");
	}

}

结论:在servlet中为了线程安全问题,减少全部变量的声明和使用。

4、Session和Cookie原理:

1、cookie介绍:

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

 

Cookie类:用于存储会话数据

1)构造Cookie对象

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

2)设置cookie

void setPath(java.lang.String uri)   :设置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

 

手动添加cookie信息:

@WebServlet("/addServletServlet")
//向浏览器添加cookie信息
public class AddCookieServlet extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		Cookie cookie = new Cookie("itmayi","yushengjun");
        //注意该处是resp
		resp.addCookie(cookie);
		System.out.println("添加cookie成功...");
	}

}

手动获取cookie信息:

@WebServlet("/getCookieServlet")
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());
		}
	}
}

cookie原理分析:

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

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

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

response.addCookie(cookie);

举例: set-cookie: name=eric  (隐藏发送了一个set-cookie名称的响应头)

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

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

    举例: cookie: name=eric  (隐藏带着一个叫cookie名称的请求头)

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

      request.getCookies();

 

Cookie的细节

1)void setPath(java.lang.String uri)   :设置cookie的有效访问路径。有效路径指的是cookie的有效路径保存在哪里,那么浏览器在有效路径下访问服务器时就会带着cookie信息,否则不带cookie信息。

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

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

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

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

3)Cookie数据类型只能保存非中文字符串类型的可以保存多个cookie,但是浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。

 

2、Session介绍:

session技术:服务器能够识别不同的浏览者!

手动添加session信息:

@WebServlet("/AddSessionServlet")
public class addSessionServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		HttpSession httpSession = req.getSession(true);
		httpSession.setAttribute("userName", "yinyuyou");
	}

}

手动接受session信息:

@WebServlet("/GetSessionServlet")
public class GetSessionServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //false读取本地sessionid没有的话会报nullpointer异常,true会创建一个新的sessionid,不会和本地的sessionid匹配上,故获取的session就为null
		HttpSession httpSession = req.getSession(false);
		String userName = (String) httpSession.getAttribute("userName");
		System.out.println("userName:"+userName);
	}
}

session原理图:

Sesson细节

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

 

2)两个getSession方法:

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

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

3)void 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对象

4)如何避免浏览器的JSESSIONID的cookie随着浏览器关闭而丢失的问题

 

/**

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

 */

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

c.setMaxAge(60*60);

response.addCookie(c);

 

总结:

1)会话管理: 浏览器和服务器会话过程中的产生的会话数据的管理。

2)Cookie技术:

new Cookie("name","value")

response.addCookie(coookie)

request.getCookies()

3)Session技术

request.getSession();

setAttrbute("name","会话数据");

getAttribute("会话数据")

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值