原创

Java面试题p5

温馨提示:
本文最后更新于 2026年03月27日,已超过 78 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

tcp和udp区别

tcpudp
提供可靠的通信传输则常用于广播和细节控制交给应用的通信传输
面向连接面向非连接:即发送数据前不需要建立连接
提供可靠的服务(数据传输)无法保证   可靠的服务
面向字节流面向报文
数据传输慢数据传输快

tcp粘包

tcp粘包可能发生在发送端或者接收端

粘包的原因

  • 发送端粘包:需要等缓冲区满才发送出去,造成粘包
  • 接收端粘包:接收方不及时接收缓冲区的包,造成多个包未接收

OSI的7层模型



各层名字作用协议
物理层利用传输介质为数据链路层提供物理连接,实现比特流的透明传输线路、无线电、光纤  MAC地址(网卡固有)
数据链路层负责建立和管理节点间的链路以太网
网络层    通过路由选择算法,为报文或分组通过通信子网选择最适当的路径IP协议     MAC地址+IP地址
传输层    向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输TCP、UDP协议     MAC地址+IP地址+端口号
会话层向两个实体的表示层提供建立和使用连接的方法HTTPSSHFTP协议
表示层处理用户信息的表示问题,如:编码、数据格式转换和加解密等HTTP、SSH、FTP协议
应用层直接向用户提供服务,完成用户希望在网络上完成的各种工作HTTPSSHFTP协议

 

get和post请求

getpost
浏览器主动缓存不会
传递参数限制有    
安全性安全低,参数明文显示在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事务实现方式

声明式事务:

  1. xml配置文件
  2. 注解方式(类上加 @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三次握手

服务端没有收到来自客户端的再次确认,则就会知道客户端并没有要求建立请求,就不会浪费资源

正文到此结束