servlet实现post请求,IP直接访问正常,用域名访问获取不到body里面json数据是什么原因?

http协议: 对浏览器客户端 和  服务器端 之间数据传输的格式规范

请求(浏览器-》服务器)

跨域原因产生:在当前域名请求网站中,默认不允许通过ajax请求发送其他域名。【XMLHttpRequest cannot load 跨域问题】

注意:谷歌浏览器 已经防止了XSS攻击,为了演示效果,最好使用火狐浏览器

公司的项目向用户提供接口,但是最近偶尔会出现超时的情况,用户的调用设置的超时时间是1分钟,所以首先要排查代码的执行时间是否超过一分钟

通过在代码中加上日志可以追踪到接收到用户超时请求的时间到接口返回的时间相差1S左右。那么就可以排除是代码执行时间的问题。经过沟通发现用户提交请求的时间是8:24分,但是接口提交打印的提交时间是8:28分,也就是说从用户提交到Controller层接收到请求有4分钟的延迟,那么就应该考虑:1.是否是服务器时间不同步引起的时差 2.是否是由于网络延迟导致的请求接收出现延迟 3.是否是tomcat接收到请求后没有立刻执行。

其中第三点的故障原因排查比较麻烦,因为我们都知道http协议是属于应用层的协议,它是通过TCP协议也就是传输层的协议把数据包传递到服务器。tomcat在接收到这个socket的请求以后,会从线程池中调用线程执行任务,因此就需要考虑是否是因为线程池的线程已满导致请求被加入到了任务队列所以没有立刻执行,通过查看tomcat的请求日志local_access_XXX.txt可以判断当时的并发数量并没有达到150(tomcat默认的线程数量)。

如果不是并发引起的问题,那只能考虑Servlet从接收到请求一直到controller层执行代码中间还需要经过一些参数解析和各种认证过滤器,因此就需要能记录用户post请求到servlet的时间和controller任务开始执行时间是否存在3分钟的时间差。但是tomcat的访问日志默认是只能够记录get请求的请求参数的,因此我们需要做一些改动

这里简单介绍一下pattern的几个参数的含义

%r参数只能打印GET请求的URL和参数,因为GET请求的参数是在URL后面的,那用户的POST请求应该如何打印参数呢,在上面的配置中有一个配置  [%{postdata}r]  这个配置就是用来打印POST的参数的,但是这个并不是官方提供的,所以需要我们自己定义一个过滤器往request中设置这个参数,在SpringBoot中定义一个自定义过滤器只需要实现Filter接口和配置几个注解

//将类声明为一个过滤器,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器 //配置过滤器的加载顺序,数值越低,表示优先级越高 因为这两种方法是把缓冲区的数据流读取出来,数据流是只能读一次的, 一旦这里把流读取出来缓冲区被清空,Controller层的请求就拿不到参数了*/ //从请求头中获取需要打印到日志中的post参数

 用postman提交post请求可以看到日志的打印内容,分别记录了我们放入的post参数,http响应状态码,执行时间(S)还有字节大小。

我要回帖

更多关于 域名 的文章

 

随机推荐