Java面试题p5
tcp和udp区别
| tcp | udp |
|---|---|
| 提供可靠的通信传输 | 则常用于广播和细节控制交给应用的通信传输 |
| 面向连接 | 面向非连接:即发送数据前不需要建立连接 |
| 提供可靠的服务(数据传输) | 无法保证 可靠的服务 |
| 面向字节流 | 面向报文 |
| 数据传输慢 | 数据传输快 |
tcp粘包
tcp粘包可能发生在发送端或者接收端
粘包的原因
- 发送端粘包:需要等缓冲区满才发送出去,造成粘包
- 接收端粘包:接收方不及时接收缓冲区的包,造成多个包未接收
OSI的7层模型
| 各层名字 | 作用 | 协议 |
|---|---|---|
| 物理层 | 利用传输介质为数据链路层提供物理连接,实现比特流的透明传输 | 线路、无线电、光纤 MAC地址(网卡固有) |
| 数据链路层 | 负责建立和管理节点间的链路 | 以太网 |
| 网络层 | 通过路由选择算法,为报文或分组通过通信子网选择最适当的路径 | IP协议 MAC地址+IP地址 |
| 传输层 | 向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输 | TCP、UDP协议 MAC地址+IP地址+端口号 |
| 会话层 | 向两个实体的表示层提供建立和使用连接的方法 | HTTP、SSH、FTP协议 |
| 表示层 | 处理用户信息的表示问题,如:编码、数据格式转换和加解密等 | HTTP、SSH、FTP协议 |
| 应用层 | 直接向用户提供服务,完成用户希望在网络上完成的各种工作 | HTTP、SSH、FTP协议 |
get和post请求
| get | post | |
|---|---|---|
| 浏览器主动缓存 | 会 | 不会 |
| 传递参数限制 | 有 | 无 |
| 安全性 | 安全 | 低,参数明文显示在url中 |
get请求会被浏览器主动缓存,post不会
get传递参数有大小限制,post没有
post参数传输更安全,get参数会明文显示在url中。
实现跨域
全局设置 跨域
使用WebMvcConfigurer
@Configuration
@EnableWebMvc
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://localhost:3000", "https://example.com")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
} 使用Filter过滤器
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", "http://localhost:3000");
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers",
"Content-Type, Authorization, X-Requested-With");
response.setHeader("Access-Control-Allow-Credentials", "true");
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
} else {
chain.doFilter(req, res);
}
}
} NGINX配置跨域
server {
listen 80;
server_name api.example.com;
location / {
# 添加 CORS 头
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization';
# 处理预检请求
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
proxy_pass http://backend_server;
}
} * 在 nacos 分布式中 可使用getway 网关实现跨域*
服务器端运行跨域,设置CORS等于*
在单个接口使用注解@CrossOrigin,进行跨越
使用 jsonp 跨域
JSONP实现原理
jsonp:JSON with Padding,它是利用script标签的src连接可以访问不同源的特性,加载远程返回的“JS 函数”来执行的
设计模式-熟悉的设计模式
单例模式:保证被创建一次,节省系统开销
工厂模式(简单工厂,抽象工厂):解耦代码
观察者模式:定义了对象直接一对多的依赖,这样依赖,当一个对象改变时,它的所有的依赖者会收到通知并自动更新
外观模式:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层的接口,让子系统更容易使用
模板方法模式:定义了一个算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤
状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像改变了它的类
简单工厂、抽象工厂
简单工厂:用来生产统一等级结构的任意产品,对于增加新的产品,无能为力
工厂方法:用来生产统一等级结构中的固定产品,支持增加任意产品
抽象工厂:用来生产不同产品族的全部产品,对于新增的产品,无能为力,支持增加产品族
为何使用spring
- spring提供ioc技术,容器会帮你管理依赖的对象,从而不需要自己创建和管理依赖对象了,更轻松的实现了程序的解耦
- sping提供了事务支持,简单方便
- spring提供了面向切面编程,更方便处理某一类问题
- 更方便的框架集成:如MyBatis、hibernate等
aop
aop:面向切面编程,通过预编译和运行期动态代理实现程序功能的统一维护的一种技术。
统一处理某一“切面”(类)的问题的编程思想,如:统一处理日志、异常等
ioc
Inversion of Control:控制反转:是spring的核心,对于spring框架来说,由spring来负责控制对象的生命周期和对象间的关系
控制:指的是当前对象对内部成员的控制权;
控制反转指:这种控制权不由当前对象管理了,由其他(类、第三方容器)来管理
spring的主要模块
spring core:框架最基础的部分,提供ioc和依赖注入特性
spring context:构建于core封装包基础上的context封装包,提供了一种框架式的对象访问方法
spring data:Data Acess Object提供了JDBC的抽象层
spring aop:提供了面向切面的编程实现,可自定义拦截器、切点等
spring Web:提供了针对Web开发的集成特性,如:文件上传、利用 servlet listeners进行ioc容器初始化和针对web的ApplicationContext
spring Web mvc:spring中的mvc封装包提供Web应用的Model-View-Controller(mvc)的实现
spring常用注入方式
setter属性注入
构造方式注入
注解方式注入
spring中的bean是线程安全吗
spring中的bean默认是单例模式,spring框架并没有对单例bean进行多线程的封装处理
实际上,大部分时候 spring bean 无状态的(如:dao类),所以某种程度上来说bean是安全的。若bean有状态的话,(如 view model对象),就要开发者自己保证线程安全。最简单就是改变bean的作用于,把“singleton”变更为“prototype”,这样请求bean相当于new bean()了,所以可以保证线程安全
- 有状态:有数据存储功能
- 无状态:不会存储数据
spring支持bean作用域
singleton:spring ioc容器中只存在一个bean实例,bean以单例模式存在,是系统默认值
prototype:每次从容器中调用bean时都会创建一个新的实例,即每次 getBean()相当于执行 new bean()操作
web环境下的作用域:
request:每次http请求都会创建一个bean
session:同一个http ,session共享一个bean实例
global-session:用于portlet容器,因为每个portlet有单独的session,globalsession提供一个全局性的http session
* 使用prototype作用域要慎重考虑,频繁创建和销毁bean会带来很大的性能开销
spring自动装配bean方式
no :默认值,表示没有自动装配,应使用显式bean引用进行装配
byName:它根据bean的名字注入对象依赖项
byType:根据类型注入对象依赖项
构造函数:通过构造函数来注入依赖项,需要设置大量参数
autodetect:容器首先通过构造函数使用autowire装配,不成功,则使用byType自动装配
spring事务实现方式
声明式事务:
- xml配置文件
- 注解方式(类上加 @Transaction)
编码方式:提供编码的形式管理和维护事务
spring事务隔离
spring有5大事务隔离。
ISOLATION_DEFAULT:用底层数据库的设置隔离级别。
ISOLATION_READUNCOMMITTED:未读提交,最低隔离级别,事务未提交前,就可被其他事务读取(出现 脏读、幻读、不可重复读)
ISOLATION_READCOMMITED:提交读;一个事务提交后才能被其他事务读取到(幻读、不可重复读),SQL server默认级别
ISOLATION_REPEATABLEREAD:可重复读;保证多次读取同一个数据时,其值都和事务开始时候的内容是一致的,禁止读取到其他事务未提交的数据(会造成幻读),Mysql的默认级别
ISOLATION_SERIZABLE:序列化;代价最高最可靠的级别,该级别防止脏读、幻读、不可重复读
脏读:一个事务能读取到另一个事务中还未提交的数据。
幻读:指同一个事务内多次查询返回的结果集不一样。
spring mvc运行流程
spring mvc先将请求发送给DispatcherServlet
DispatcherServlet查询一个或多个HanderMapping,找到处理请求的Controller
DispatcherServlet再把请求提交到对应的Controller
Controller进行业务逻辑处理后,返回一个ModelAndView
DispatcherServlet查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
视图对象负责渲染返回给客户端
tcp三次握手
服务端没有收到来自客户端的再次确认,则就会知道客户端并没有要求建立请求,就不会浪费资源

- 本文标签: Java
- 本文链接: http://119.91.109.247:8443//article/53
- 版权声明: 本文由张亚东原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权