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("会话数据")