记一次接口授权导致的500异常排查

接口测试中500报错排查:从日志分析到代码定位的完整指南 在软件开发和测试过程中,服务器端错误是常见的技术挑战,其中500 Internal Server Error作为HTTP状态码,代表服务器内部处理请求时发生意外错误。其原理在于服务器无法完成合法请求的处理,通常源于代码异常、资源瓶颈或配置问题。理解其排查方法对保障系统稳定性和提升排错效率具有重要技术价值,尤其在微服务架构和分布式系统中,快速定位根因能有效减少故障恢复时间。应用场景涵盖从开发调试、测试验证到生产环境监控的全生命周期。本文将聚焦于通过系统化的日志分析和代码审查,结合Postman、JMeter等 阅读详情

有一个导出的接口通过postman调用是返回正常的响应体,但是发布到测试环境,通过浏览器请求时,会返回500

通过浏览器请求

通过Postman请求

开始排查

整个链路为nginx -> spring cloud gateway -> 业务服务

首先从业务服务开始排查,增加一个log过滤器,打印下请求响应信息

2021-05-24 14:43:00.447 aom-platform-[,] [http-nio-9991-exec-9] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet][175] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.sf.mrm.core.exception.BaseException: 接口未授权] with root cause
com.sf.mrm.core.exception.BaseException: 接口未授权
	at com.sf.aom.platform.aop.RoleRightInterceptor.Interceptor(RoleRightInterceptor.java:70)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:174)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)
	at com.sf.aom.platform.controller.pc.CustomDeviceCategoryRest$$EnhancerBySpringCGLIB$$24c40d74.export(<generated>)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:981)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:884)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:858)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.github.xiaoymin.knife4j.spring.filter.ProductionSecurityFilter.doFilter(ProductionSecurityFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.github.xiaoymin.knife4j.spring.filter.SecurityBasicAuthFilter.doFilter(SecurityBasicAuthFilter.java:87)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.sf.aom.platform.filter.LogFilter.doFilterInternal(LogFilter.java:102)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:124)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:151)
	at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:81)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)
2021-05-24 14:43:00.447 aom-platform-[,] [http-nio-9991-exec-9] ERROR o.a.c.c.C.[Tomcat].[localhost][175] - Exception Processing ErrorPage[errorCode=0, location=/error]
java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.getHttpServletMapping()Ljavax/servlet/http/HttpServletMapping;
	at org.apache.catalina.core.ApplicationHttpRequest.setRequest(ApplicationHttpRequest.java:709)
	at org.apache.catalina.core.ApplicationHttpRequest.<init>(ApplicationHttpRequest.java:115)
	at org.apache.catalina.core.ApplicationDispatcher.wrapRequest(ApplicationDispatcher.java:911)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:358)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
	at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:394)
	at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:253)
	at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:348)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:173)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

这个错误信息又是从哪里报出来的呢,开始debug排查,是在LogFilter(可以参考另一篇博文)的

filterChain.doFilter(request, response);

这一行抛出来的,后面的请求响应日志也没有打印了

一路debug,终于找到了真正的中断的代码

org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor

引起中断的异常时 HttpMessageNotWritableException

protected <T> void writeWithMessageConverters(@Nullable T value, MethodParameter returnType,
			ServletServerHttpRequest inputMessage, ServletServerHttpResponse outputMessage)
			throws IOException, HttpMediaTypeNotAcceptableException, HttpMessageNotWritableException {

		Object outputValue;
		Class<?> valueType;
		Type declaredType;

		if (value instanceof CharSequence) {
			outputValue = value.toString();
			valueType = String.class;
			declaredType = String.class;
		}
		else {
			outputValue = value;
			valueType = getReturnValueType(outputValue, returnType);
			declaredType = getGenericType(returnType);
		}

		if (isResourceType(value, returnType)) {
			outputMessage.getHeaders().set(HttpHeaders.ACCEPT_RANGES, "bytes");
			if (value != null && inputMessage.getHeaders().getFirst(HttpHeaders.RANGE) != null) {
				Resource resource = (Resource) value;
				try {
					List<HttpRange> httpRanges = inputMessage.getHeaders().getRange();
					outputMessage.getServletResponse().setStatus(HttpStatus.PARTIAL_CONTENT.value());
					outputValue = HttpRange.toResourceRegions(httpRanges, resource);
					valueType = outputValue.getClass();
					declaredType = RESOURCE_REGION_LIST_TYPE;
				}
				catch (IllegalArgumentException ex) {
					outputMessage.getHeaders().set(HttpHeaders.CONTENT_RANGE, "bytes */" + resource.contentLength());
					outputMessage.getServletResponse().setStatus(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE.value());
				}
			}
		}


		List<MediaType> mediaTypesToUse;

		MediaType contentType = outputMessage.getHeaders().getContentType();
		if (contentType != null && contentType.isConcrete()) {
			mediaTypesToUse = Collections.singletonList(contentType);
		}
		else {
			HttpServletRequest request = inputMessage.getServletRequest();
			List<MediaType> requestedMediaTypes = getAcceptableMediaTypes(request);
			List<MediaType> producibleMediaTypes = getProducibleMediaTypes(request, valueType, declaredType);

			if (outputValue != null && producibleMediaTypes.isEmpty()) {
				throw new HttpMessageNotWritableException(
						"No converter found for return value of type: " + valueType);
			}
			mediaTypesToUse = new ArrayList<>();
			for (MediaType requestedType : requestedMediaTypes) {
				for (MediaType producibleType : producibleMediaTypes) {
					if (requestedType.isCompatibleWith(producibleType)) {
						mediaTypesToUse.add(getMostSpecificMediaType(requestedType, producibleType));
					}
				}
			}
			if (mediaTypesToUse.isEmpty()) {
				if (outputValue != null) {
					throw new HttpMediaTypeNotAcceptableException(producibleMediaTypes);
				}
				return;
			}
			MediaType.sortBySpecificityAndQuality(mediaTypesToUse);
		}

		MediaType selectedMediaType = null;
		for (MediaType mediaType : mediaTypesToUse) {
			if (mediaType.isConcrete()) {
				selectedMediaType = mediaType;
				break;
			}
			else if (mediaType.equals(MediaType.ALL) || mediaType.equals(MEDIA_TYPE_APPLICATION)) {
				selectedMediaType = MediaType.APPLICATION_OCTET_STREAM;
				break;
			}
		}

		if (selectedMediaType != null) {
			selectedMediaType = selectedMediaType.removeQualityValue();
			for (HttpMessageConverter<?> converter : this.messageConverters) {
				GenericHttpMessageConverter genericConverter = (converter instanceof GenericHttpMessageConverter ?
						(GenericHttpMessageConverter<?>) converter : null);
				if (genericConverter != null ?
						((GenericHttpMessageConverter) converter).canWrite(declaredType, valueType, selectedMediaType) :
						converter.canWrite(valueType, selectedMediaType)) {
					outputValue = getAdvice().beforeBodyWrite(outputValue, returnType, selectedMediaType,
							(Class<? extends HttpMessageConverter<?>>) converter.getClass(),
							inputMessage, outputMessage);
					if (outputValue != null) {
						addContentDispositionHeader(inputMessage, outputMessage);
						if (genericConverter != null) {
							genericConverter.write(outputValue, declaredType, selectedMediaType, outputMessage);
						}
						else {
							((HttpMessageConverter) converter).write(outputValue, selectedMediaType, outputMessage);
						}
						if (logger.isDebugEnabled()) {
							logger.debug("Written [" + outputValue + "] as \"" + selectedMediaType +
									"\" using [" + converter + "]");
						}
					}
					return;
				}
			}
		}

		if (outputValue != null) {
			throw new HttpMediaTypeNotAcceptableException(this.allSupportedMediaTypes);
		}

度娘HttpMediaTypeNotAcceptableException异常出现的原因是

http请求报头[Request Headers]中的Accept字段,是否与服务器返回的响应报头[Response Headers]的Content-Type是否匹配,如不匹配,则会抛出该错误。
Accept表示浏览器期望请求得到资源类型
Content-Type表示服务器返回资源类型

得到一个有用的信息,是因为Accept请求头引起

浏览器中接口的请求头信息:

Accept:application/octet-stream

Postman中的请求头信息:

Postman默认是*/*,表示所有都接收

这就能解释为啥同一个接口,通过Postman返回正常,而通过浏览器返回不正常,原因仅仅是因为Accept请求头。

原因找到了,该怎么解决

方案1:让前端将导出的接口的Accept请求改成application/json,application/octet-stream(开发测试时使用)

通过charles模拟改写请求头

响应正常

方案2:在nginx上将Accept为application/octet-stream的请求头覆盖城application/json,application/octet-stream或*/*(nginx不允许在if块中使用请求头proxy_set_header)

方案3:在gateway中重写请求头

Consumer<HttpHeaders> httpHeaders = httpHeader -> {
    // 向下游转发accept请求头-处理导出接口,未授权时接口返回json信息
    boolean hasAcceptHeader = exchange.getRequest().getHeaders().getAccept().stream()
            .filter(o -> Objects.equals(o, MediaType.APPLICATION_OCTET_STREAM)).count() > 0;
    if (hasAcceptHeader) {
        httpHeader.setAccept(Lists.newArrayList(MediaType.ALL));
    }
};
ServerHttpRequest serverHttpRequest = exchange.getRequest().mutate().headers(httpHeaders).build();
exchange.mutate().request(serverHttpRequest).build();

 

 

接口测试中HTTP头部问题引发500错误的排查与防御指南 在软件开发和接口测试领域,HTTP协议是客户端与服务器通信的基石。其工作原理基于请求-响应模型,其中请求头(HTTP Header)承载了身份认证、内容格式、会话状态等关键元数据,对请求的正确处理至关重要。从技术价值看,健壮的头部处理能显著提升系统的安全性和稳定性,避免因非法或异常输入导致服务崩溃。在实际应用场景中,微服务架构、API网关和前后端分离模式都高度依赖头部传递上下文信息。本文将聚焦于接口测试中一个常见但易被忽视的痛点:由HTTP头部问题引发的服务器500内部错误。通过剖析身份认证令牌、内容类型、 阅读详情

相关推荐

全网多种方式解决Knife4j文档请求异常

全网多种方式解决Knife4j文档请求异常。

念兮为美 1万+

Spring--AOP实例2

一、配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http:...

慕村古楼诉 539

解决com.alibaba.fastjson.JSONException: write javaBean error问题以及解决Spring Boot加入Shiro导致spring aop失效的问题

解决com.alibaba.fastjson.JSONException: write javaBean error问题以及解决Spring Boot加入Shiro导致spring aop失效的问题。

念兮为美 1万+

【spring框架】AspectJ动态代理实现AOP

1 前言 在 spring2.0 以上版本中,可以使用基于 AspectJ 注解配置 AOP,常用的配置 AOP 的注解如下: @Aspect:标注一个类为切面 @Order:标注切面优先级 @Pointcut:标注一个公共切入点 @Before:前置通知,作用于方法执行之前 @After:后置通知,作用于方法的finally语句块,即不管方法有没有异常都会执行,通常用于关闭资源 @AfterReturning:返回通知,作用于方法执行之后 @AfterThrowing:异常通知,作用于方法

little_fat_sheep 1104

echarts 生成中国陕西省份(或其他省份)的地图,大屏使用

效果图: 一、首先第一步需要下载echarts和获取到陕西身份的地图信息。 1.下载echarts链接(官网): Apache ECharts 2.生成指定省份的地图数据信息,数据可以在阿里云获取。 DataV.GeoAtlas地理小工具系列 如图,点击左圈需要的省份,这里我选择的是陕西省,然后点击右圈复制下载链接,得到一个json格式的数据,可以在json转换网站转成js格式。 Json在线解析格式化-Json在线校验Json格式化压缩-Jsons在线工具 转成js格.

PrimaryColor 3889

STM32F103RC学习(一)

STM32F103RC学习(一)

Cat_South_North的博客 6055

SpringCloud微服务实战——搭建企业级开发框架(十九):Gateway使用knife4j聚合微服务文档

本章介绍Spring Cloud Gateway网关如何集成knife4j,通过网关聚合所有的Swagger微服务文档 1、gitegg-gateway中引入knife4j依赖,如果没有后端代码编写的话,仅仅引入一个swagger的前端ui模块就可以了 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagge

全栈程序猿的专栏 1591

量子城域网建设设备系列(三):网络管理系统(NMS)

本文对量子网络中的网络管理系统进行了初步的介绍。

量子领域相关话题 2012

【#】 那些接口报500的错误 你学废了吗

有时候遇上服务报500的错误,500错误是内部服务器错误。根据工作中所爬过的坑,小结一下目前遇到的服务报500的情况大致有下面几种: 1、数据库异常: 1)检查数据库服务器,是否能够正常连得上,数据库机器或者是否挂了; 2)检查服务上的数据库相关的配置,是否正确; 3)检查swagger,看swagger页面是否能够正常访问,swagger里面的后台接口能否正常获取到数据库里面的数据; 4)如果数据库正常、配置正常,swagger也能获取到数据,而且查看日志的时候,发现日志报某些表不存在,但是登上某一台数据

weixin_43251902的博客 2万+

海康机器人ID5000 系列智能读码器(三)

又過了兩個月,漸漸的對這個攝像頭的功能更加熟悉了,而實際上,我要做的功能也越來越複雜,從一開始的讀碼,到後來的通過讀二維碼控制設備,再到未讀到二維碼控制設備等,下面就對具體的細項做一個總結。了解完這些就能對ID5000這個設備,乃至很多海康的設備都能做一個二次開發。

qq_54359036的博客 3071

天祥TX-1C单片机开发板-秒表程序

郭天祥TX-1C开发板实现秒表程序 附开发板图片和原理图 代码 #include <reg52.h> sbit key1=P3^4; //按键S2 sbit key2=P3^5; //按键S3 sbit U1=P2^6; //LED位选 sbit U2=P2^7; //LED片选 unsigned char code ledchar[]={ /...

Run_long_road 3512

【原创总结】页面上出现服务报500的原因和排查

有时候遇上服务报500,特别是后台服务会经常出现,500错误是内部服务器错误。遇上错误首先想到的肯定是先看看服务的进程还在不在,然后查看日志,从日志里面找原因。 根据工作中所爬过的坑,小结一下,可以从下面的方向进行排查: 1、数据库异常: 1)检查数据库服务器,是否能够正常连得上,数据库机器是否挂了; 2)检查服务上的数据库相关的配置,是否正确; 3)检查swagger,看swagger

site008的博客 3万+

【从0到1实战】C# WinForm开发工业级PLC监控系统(完整串口+Modbus RTU/TCP+数据库存储+源码+避坑指南)

做C#工控上位机开发的工程师,尤其是刚入行的新人,最核心的刚需就是开发一套完整的PLC监控系统。这也是工控领域最基础、最核心、应用最广的项目类型——小到单台PLC的设备测控,大到整线的产线监控,本质都是「上位机与PLC通讯,实现数据采集、参数下发、状态监控、数据存储」。碎片化的知识点学了很多,串口会用了、Modbus协议看了、数据库也懂点,但是始终无法把这些知识点串联起来,做出一套能落地的工业级PLC监控系统。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1559

Java过滤器全局拦截引发500错误的排查与修复实录

这次事故让我深刻体会到​​过滤器配置的重要性​​和​​全局拦截的风险​​。在后端应用中,过滤器是强大的工具,但需要谨慎使用。关键要点包括:​​始终为安全过滤器设置排除规则​​,放行登录、健康检查等必要接口实现完善的异常处理​​,避免直接抛出未处理异常导致500错误使用配置化方式管理排除列表​​,提高灵活性​​记录详细日志​​,便于问题排查编写充分测试​​,覆盖各种请求场景通过这次经历,我更加理解了Java后端应用中过滤器的正确使用方式,希望我的经验能帮助你避免类似的坑。

m0_74463556的博客 1482

道家学派创始人老子,对 SAP ABAP 这门编程语言的客观评价

SAP HANA 之引入,使 ABAP 于处理大数据,云计算等新兴领域,展现新的生命力,如老吾老以及人之老,幼吾幼以及人之幼,扩展其在信息技术领域的应用,以涵养更广之需。ABAP 能以数据为基,流转于系统之中,如道法自然,顺应企业之生态,助之以高效运转,减少冗杂,简化管理,使企之运营,如小国寡民,无为而治。然 ABAP 如老树盘根,更替不易,面对新兴技术,如云计算、大数据等,其更新之速,未能与时俱进。如水之于渊,柔而能胜刚,ABAP 之发展,顺时而动,应需而变,其在编程领域,犹如道之于万物,渐不可或缺矣。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1021

基于Simulink的PID控制汽车巡航控制系统建模与仿真

汽车巡航控制系统(Cruise Control System)是一种通过自动调节发动机输出功率来维持车辆以恒定速度行驶的技术。这种系统能够减轻驾驶员在长途驾驶中的疲劳,同时提高燃油经济性和行车安全性。PID(比例-积分-微分)控制器因其结构简单、性能稳定且易于实现而被广泛应用于汽车巡航控制系统中。本项目旨在通过MATLAB/Simulink平台设计和验证一个基于PID控制的汽车巡航控制系统,重点研究PID参数调优方法、系统动态响应特性以及稳态误差消除能力。

MHD0815的博客 196

服务为什么报500错误?

有时候遇上服务报500的错误,500错误是内部服务器错误。根据工作中所爬过的坑,小结一下目前遇到的服务报500的情况大致有下面几种: 1、数据库异常:1)检查数据库服务器,是否能够正常连得上,数据库机器或者是否挂了;2)检查服务上的数据库相关的配置,是否正确;3)检查swagger,看swagger页面是否能够正常访问,swagger里面的后台接口能否正常获取到数据库里面的数据;4)如果数据库正常...

weixin_33984032的博客 9854

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

团队长撤销报错500,因字段取消导致的查询异常

在团队管理里面可以给团队设置团队长,然后还可以点击"撤销按钮"进行撤销操作。但是撤销的时候一点击"撤销"按钮就直接报500服务器异常了。点击撤销按钮时,显示详细信息。进撤销方法 调这个接口。.........

SSHLY3的博客 313

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

接口测试中HTTP头部字段引发500错误的排查与解决指南

HTTP协议作为Web应用通信的基石,其请求与响应结构中的头部字段承载着元数据信息,控制着内容协商、身份认证、缓存机制等核心功能。从原理上讲,服务器端框架依赖这些头部来正确解析请求、路由处理并生成响应,若头部信息缺失、格式错误或值不符合预期,就可能在框架层触发未处理的异常,进而返回500 Internal Server Error。这一问题的技术价值在于,它揭示了客户端与服务器端交互中一个常被忽视的校验盲区,高效的头部问题排查能力是保障接口测试与系统集成质量的关键。在实际应用场景中,无论是测试RESTful

chunqingtai2922的博客 500

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【原创总结】服务为什么会报500的错误?

有时候遇上服务报500,特别是后台服务会经常出现,500错误是内部服务器错误。遇上错误首先想到的肯定是先看看服务的进程还在不在,然后查看日志,从日志里面找原因。 根据工作中所爬过的坑,小结一下,可以从下面的方向进行排查: 1、数据库异常: 1)检查数据库服务器,是否能够正常连得上,数据库机器是否挂了; 2)检查服务上的数据库相关的配置,是否正确; 3)检查swagger,看swagger...

weixin_30780649的博客 3982

记一次 vue-router 动态加载菜单的bug

图中后端接口中返回的每个组件中都包含 props 属性,默认是"{}",询问后端为啥会返回这样的数据,回答是这是个预留字段,打算存储后续新增的设置项(事实上后续也确实用上了),格式为 JSON,因此默认是一个"{}"。直到仔细查看后端接口返回的数据,总算找到了问题所在。根据图中信息说明某个组件设置了以"0"为key的属性,再通过查看chrome Vue插件的组件展示页面,发现Home(当前系统的首页)组件的 attrs 对象非常奇怪,里面包含"0"、"1" 两个key,分别对应值"{"、"}"。

kebin2012的博客 1129

关于500错误,我踩了这些坑

关于500错误的踩坑总结

SRE成长记 2375

接口调不通,如何排查?

一.接口调不通,如何排查? 答:①接口没有任何响应 1检查接口IP地址是否正确,ping一下接口地址。 2检查被测接口端口号是否正确,可以在本机Telnet接口的IP和端口号,检查端口号能否连通 3检查项目是否启动或部署成功,可以找研发确认,或者自己登录到服务器上,通过ps检查项目的进程是否存在,然后用tail命令查看部署日志 4检查服务器的防火墙是否关闭,如果是以为安全或者权限问题不能关闭,需要找运维进行策略配置,开放对应的IP和端口。 5检查你的客户端(浏览器、测试工具),是否设置了网络代理,网络代理可

CrazyEdamame的博客 1万+

测试时发现接口调不通如何排查

接口调不通

Testfan_zhou的博客 3866

终极解决方案:Hoppscotch Magic Link授权500错误深度排查与修复指南

Hoppscotch作为一款开源的API开发工具,其Magic Link授权功能为用户提供了便捷的登录体验,但500错误可能会阻碍这一流程。本文将从错误根源出发,提供从排查到修复的完整解决方案,帮助开发者和用户快速解决这一问题。 ## 🧐 Magic Link授权500错误的常见表现 当用户尝试通过Magic Link登录Hoppscotch时,可能会遇到以下情况: - 点击邮件中的Magi

gitblog_00893的博客 365

SpringBoot 接口开发报错全集|前后端联调必看,404/400/500全解决

SpringBoot 接口开发报错全集|前后端联调必看,404/400/500全解决

大家好,我是一名深耕 Java 后端多年的老程序员,目前专注于 SpringBoot / SpringCloud / 微服务 / 分布式 方向开发。 多年企业级项目实战经验,踩过无数线上坑、填过无数架构坑,对 Spring 全家桶、MyBa 564
上一篇: 记一次nginx 504排查
下一篇: SpringCloudGateway&SpringBoot开启accesslog
路飞说AI
博客等级 码龄10年 214粉丝 24原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值