Java HTTP 高频面试题及详细答案(含Java代码示例)_第1页
Java HTTP 高频面试题及详细答案(含Java代码示例)_第2页
Java HTTP 高频面试题及详细答案(含Java代码示例)_第3页
Java HTTP 高频面试题及详细答案(含Java代码示例)_第4页
Java HTTP 高频面试题及详细答案(含Java代码示例)_第5页
已阅读5页,还剩6页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JavaHTTP高频面试题及详细答案(含Java代码示例)一、HTTP基础概念面试题1.简述HTTP协议的特点参考答案:HTTP是超文本传输协议,是应用层最常用的网络协议,用于客户端和服务端之间的数据交互,核心特点如下:1.无连接:HTTP1.0默认短连接,一次请求响应完成后立即断开连接,不持续占用通道;HTTP1.1默认长连接,一次连接可多次请求。2.无状态:协议本身不记录客户端的访问状态,每次请求都是独立的,服务端无法识别两次请求是否来自同一个客户端。需要依赖Cookie、Session、Token实现状态保持。3.基于请求-响应模型:必须由客户端主动发起请求,服务端被动响应,服务端无法主动推送数据给客户端(websocket可解决该问题)。4.明文传输:HTTP数据全部以明文形式传输,安全性低,容易被窃听、篡改。5.支持多种数据格式:可传输文本、图片、视频、JSON、表单等各类数据。2.HTTP1.0、HTTP1.1、HTTP2.0核心区别参考答案:HTTP1.0短连接为主,每次请求都要建立、断开TCP连接,开销极大;不支持断点续传、管道请求,并发请求需要开启多个端口,性能差。HTTP1.1(目前主流)1.默认开启长连接(Connection:keep-alive),一次TCP连接可多次请求响应,减少握手开销。2.支持管道化请求、断点续传、分块传输。3.新增大量状态码、请求头,支持缓存优化。4.队头阻塞问题:同一连接下,前一个请求未响应,后续请求全部阻塞。HTTP2.01.基于HTTPS,强制加密。2.二进制帧传输,替代文本格式,解析更快。3.多路复用:单连接多请求并行,彻底解决队头阻塞。4.支持头部压缩、服务端主动推送资源。3.HTTP无状态问题怎么解决?参考答案:HTTP无状态导致服务端不知道用户身份、无法记录登录状态、购物车等信息,行业主流三种解决方案:1.Cookie:客户端存储少量文本数据,每次请求自动携带给服务端,不安全、容量小。2.Session:服务端存储用户状态数据,通过SessionId关联客户端,安全但占用服务端内存,不适合分布式集群。3.Token(JWT):用户登录后服务端签发令牌,客户端保存,每次请求携带令牌,服务端校验,无服务端存储压力,适配分布式、微服务架构。二、HTTP请求方法面试题4.GET和POST区别(高频必问)参考答案:1.参数位置:GET参数拼接在URL地址栏;POST参数放在请求体中。2.数据大小:GET受限于浏览器URL长度限制,无法传输大数据;POST无明确限制,可传文件、大文本。3.安全性:GET参数明文可见,容易泄露、被缓存;POST请求体相对隐蔽,安全性更高。4.缓存特性:GET请求默认可被浏览器缓存;POST默认不缓存。5.幂等性:GET是幂等请求,多次请求结果一致;POST非幂等,多次提交可能产生多条数据(如重复下单)。6.使用场景:GET用于查询数据;POST用于新增、提交数据。5.什么是幂等性?哪些HTTP方法是幂等的?参考答案:幂等性指:一次请求和多次重复请求,对服务端产生的业务效果完全一致,不会产生脏数据。幂等方法:GET、HEAD、PUT、DELETE非幂等方法:POST业务场景:接口开发中,新增接口必须做幂等处理(唯一索引、令牌防重、分布式锁),防止重复提交。三、HTTP状态码面试题(高频)6.常用HTTP状态码分类及高频场景参考答案:1xx信息性:请求已接收,继续处理(如101协议切换,websocket升级)2xx成功200:请求成功,正常返回数据201:资源创建成功(新增数据成功)204:无返回内容,请求处理成功无数据返回3xx重定向301:永久重定向,浏览器永久缓存跳转地址302:临时重定向,本次请求跳转,不缓存304:资源未修改,走本地缓存,无需重新下载资源4xx客户端错误400:请求参数错误、格式错误401:未登录、未授权,需要身份认证403:权限不足,已登录但无访问权限404:请求资源不存在405:请求方法不支持(接口只支持GET,前端传POST)5xx服务端错误500:服务端代码异常、空指针、数据库报错502:网关错误,后端服务宕机/未启动503:服务不可用,服务过载、停机维护四、HTTP缓存面试题7.简述HTTP缓存机制(强缓存、协商缓存)参考答案:HTTP缓存用于减少重复请求、降低服务端压力、提升页面加载速度,分为两级缓存:1.强缓存(无需请求服务端)响应头:Cache-Control、Expires浏览器判断资源未过期,直接读取本地缓存,状态码304不出现,直接200(fromcache)。Cache-Control:max-age=xxx(优先级高于Expires,基于时间戳)2.协商缓存(需要请求服务端校验)强缓存失效后,浏览器携带资源标识询问服务端资源是否更新。两组规则:Last-Modified(响应头)/If-Modified-Since(请求头):基于文件修改时间ETag(响应头)/If-None-Match(请求头):基于文件唯一指纹,精度更高,优先级更高资源未更新:返回304,使用本地缓存;资源更新:返回200+最新资源。五、HTTPS面试题8.HTTP和HTTPS区别?HTTPS工作原理参考答案:核心区别1.HTTP明文传输,端口80;HTTPS加密传输,端口443。2.HTTPS=HTTP+SSL/TLS安全加密协议。3.HTTP无校验,数据可被篡改;HTTPS可防窃听、防篡改、防伪造。4.HTTPS需要CA证书,部署成本更高,握手速度略慢。HTTPS握手流程1.客户端发起请求,携带支持的加密套件、协议版本。2.服务端返回证书、选定加密套件。3.客户端校验证书合法性(CA机构校验)。4.客户端生成随机秘钥,用服务端公钥加密后发送。5.服务端私钥解密,获取随机秘钥。6.双方通过对称秘钥进行加密通信。六、跨域面试题9.什么是跨域?跨域产生原因及Java后端解决方案参考答案:跨域定义:浏览器同源策略限制,协议、域名、端口任意一个不同,即为跨域,浏览器会拦截响应。产生原因:浏览器安全同源策略,防止恶意网站窃取数据。Java后端常用解决方案1.全局跨域配置类(SpringBoot最常用)2.注解@CrossOrigin局部跨域3.自定义过滤器统一处理跨域响应头4.Nginx反向代理解决跨域七、Java实操代码题(面试手写/机试高频)10.Java原生HttpURLConnection发送GET/POST请求可直接运行,无框架依赖,基础面试必写代码java

importjava.io.BufferedReader;

importjava.io.InputStreamReader;

importjava.io.OutputStream;

import.HttpURLConnection;

import.URL;

/**

*原生JavaHTTP请求工具类

*面试高频手写代码

*/

publicclassHttpDemo{

/**

*发送GET请求

*/

publicstaticStringdoGet(StringhttpUrl){

HttpURLConnectionconnection=null;

BufferedReaderreader=null;

Stringresult="";

try{

URLurl=newURL(httpUrl);

connection=(HttpURLConnection)url.openConnection();

//设置请求方式

connection.setRequestMethod("GET");

//设置请求头

connection.setDoInput(true);

connection.setConnectTimeout(5000);

connection.setReadTimeout(5000);

//读取响应数据

reader=newBufferedReader(newInputStreamReader(connection.getInputStream(),"UTF-8"));

Stringline;

StringBuildersb=newStringBuilder();

while((line=reader.readLine())!=null){

sb.append(line);

}

result=sb.toString();

}catch(Exceptione){

e.printStackTrace();

}finally{

try{

if(reader!=null){

reader.close();

}

if(connection!=null){

connection.disconnect();

}

}catch(Exceptione){

e.printStackTrace();

}

}

returnresult;

}

/**

*发送POST请求

*/

publicstaticStringdoPost(StringhttpUrl,Stringparam){

HttpURLConnectionconnection=null;

OutputStreamoutputStream=null;

BufferedReaderreader=null;

Stringresult="";

try{

URLurl=newURL(httpUrl);

connection=(HttpURLConnection)url.openConnection();

//设置请求方式

connection.setRequestMethod("POST");

//设置请求头

connection.setDoInput(true);

connection.setDoOutput(true);

connection.setConnectTimeout(5000);

connection.setReadTimeout(5000);

connection.setRequestProperty("Content-Type","application/json;charset=UTF-8");

//发送请求参数

outputStream=connection.getOutputStream();

outputStream.write(param.getBytes("UTF-8"));

outputStream.flush();

//读取响应

reader=newBufferedReader(newInputStreamReader(connection.getInputStream(),"UTF-8"));

Stringline;

StringBuildersb=newStringBuilder();

while((line=reader.readLine())!=null){

sb.append(line);

}

result=sb.toString();

}catch(Exceptione){

e.printStackTrace();

}finally{

try{

if(reader!=null)reader.close();

if(outputStream!=null)outputStream.close();

if(connection!=null)connection.disconnect();

}catch(Exceptione){

e.printStackTrace();

}

}

returnresult;

}

//测试主方法

publicstaticvoidmain(String[]args){

//测试GET请求

StringgetResult=doGet("/get");

System.out.println("GET响应结果:"+getResult);

//测试POST请求

StringpostData="{\"name\":\"test\",\"age\":20}";

StringpostResult=doPost("/post",postData);

System.out.println("POST响应结果:"+postResult);

}

}

11.SpringBoot全局跨域配置代码(面试刚需)java

importorg.springframework.context.annotation.Configuration;

importorg.springframework.web.servlet.config.annotation.CorsRegistry;

importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**

*全局跨域配置类

*解决前端跨域请求问题

*/

@Configuration

publicclassCorsConfigimplementsWebMvcConfigurer{

@Override

publicvoidaddCorsMappings(CorsRegistryregistry){

registry.addMapping("/**")

//允许所有来源

.allowedOrigins("*")

//允许所有请求方法

.allowedMethods("GET","POST","PUT","DELETE","OPTIONS")

//允许所有请求头

.allowedHeaders("*")

//是否允许携带Cookie

.allowCredentials(true)

//缓存预检请求时长

.maxAge(3600);

}

}

12.手写HTTP请求拦截器获取请求头参数(面试拓展)java

importorg.springframework.web.servlet.HandlerInterceptor;

importorg.springframework.web.servlet.ModelAndView;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

/**

*自定义HTTP请求拦截器

*统一获取请求头、校验token

*/

publicclassHttpInterceptorimplementsHandlerInterceptor{

//控制器执行前

@Override

publicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{

//获取请求头参数

Stringtoken=request.getHeader("token");

Stringorigin=request.getHeader("Origin");

System.out.println("请求来源:"+origin);

System.out.println("请求令牌:"+token);

//

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论