面试题:你印象最深刻的两个bug是什么,你是怎么解决的?

面试题:你印象最深刻的两个bug是什么,你是怎么解决的?

在面试的时候,很多时候面试官都会问你这个问题,如果你没有准备或者最近没有在做项目的话,你短时间是很难想起你遇到的bug的。毕竟在做项目的时候遇到的问题会有很多,有些bug可能会卡你两天,或者更久。但是如果你不做记录,你过段时间就会把整个印象深刻的bug给想出来。想不出来,你这道面试题就会答得不好,这多少是会影响你的面试成绩的。最近我面试的时候就遇到这样一个问题,当时我想了很久都没想出来,后面答得自然也不是很好,回答的比较宽泛和笼统。所以我就写了这篇博客来记录一下我回想起来的一些bug。

1、http响应码403问题

当时这个问题卡了有点久,403错误就是浏览器禁止你跨域访问。为了解决这个问题,我在网上查了很多资料,而且得到了很多解决方案,主要的解决方案可以归为三种,分别为jsonp,nginx和cors。

  • Jsonp
    最早的解决方案,利用script标签可以跨域的原理实现。
    限制:
    • 需要服务的支持
    • 只能发起GET请求
  • nginx反向代理
    思路是:利用nginx把跨域反向代理为不跨域,支持各种请求方式
    缺点:需要在nginx进行额外配置,语义不清晰
  • CORS
    规范化的跨域请求解决方案,安全可靠。
    优势:
    • 在服务端进行控制是否允许跨域,可自定义规则
    • 支持各种请求方式
      缺点:
    • 会产生额外的请求

我们这里会采用cors的跨域方案。

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。

它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。

  • 浏览器端:
    目前,所有浏览器都支持该功能(IE10以下不行)。整个CORS通信过程,都是浏览器自动完成,不需要用户参与。
  • 服务端:
    CORS通信与AJAX没有任何差别,因此你不需要改变以前的业务逻辑。只不过,浏览器会在请求中携带一些头信息,我们需要以此判断是否允许其跨域,然后在响应头中加入一些信息即可。这一般通过过滤器完成即可。

CORS的原理很复杂,但是实现起来是比较简单的,只需要写一个配置类,放行你想要访问的域名或者方法就可以了。代码如下:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class LeyouCorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        //1.添加CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        //1) 允许的域,不要写*,否则cookie就无法使用了
        config.addAllowedOrigin("http://xxx.com");
        //2) 是否发送Cookie信息
        config.setAllowCredentials(true);
        //3) 允许的请求方式
        config.addAllowedMethod("OPTIONS");
        config.addAllowedMethod("HEAD");
        config.addAllowedMethod("GET");
        config.addAllowedMethod("PUT");
        config.addAllowedMethod("POST");
        config.addAllowedMethod("DELETE");
        config.addAllowedMethod("PATCH");
        // 4)允许的头信息
        config.addAllowedHeader("*");

        //2.添加映射路径,我们拦截一切请求
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);

        //3.返回新的CorsFilter.
        return new CorsFilter(configSource);
    }
}

之所以卡了比较久的时间,是因为对这个cors原理不是很熟悉,直接拷贝别人的代码并不能一次性保证自己的程序跑通,所以修改的时候如果没有了解cors的原理,修改起来是很费劲的。
原理复杂,实现简单。

2、中间件配置问题

这个问题经常碰的到,而且如果按照网上的教程,自己配置不成功,那就只能卡在那里。最要命的是,如果网上的资料查不到你想要的解决方案的时候,那你就真的不知道该怎么办了。我就遇到过很多这样的情况,就比如说在配置FastDFS的时候,我需要将我上传的图片保存在FastDFS中做分布式存储。当时经过我的重复检验,代码是完全没有问题的,问题就出在服务器上的FastDFS上,这个问题是真的卡了我一两天,网上查遍资料无果。问别人也不知道,我只能在那慢慢等死,无计可施。过了一两天后,我问了一个阿里的大佬,他就一眼看出了问题所在。当时我也是恍然大悟,因为我的请求组都是通过nginx代理服务器进行转发的,而且监测的端口号是80端口,我服务器上配置的tomcat也是80端口,问题就出现在这里。当发送上传文件到FastDFS请求的时候,它优先找的是tomcat的80端口,也就自然不会转发到FastDFS上了。改了tomcat的端口号之后,果然可以访问了。那时候我有想哭又想笑,真的是没想到这么小的问题卡了这么久,要是没有发现这个问题,我都可能还会一直卡在那里。

3、服务器的iptables问题

这个问题也卡了很久,一开始我不知道这个会影响外网访问服务器,一直以为防火墙是fireWall,我那时特别纳闷,就是我的Firewall已经是禁用状态,但是为什么我外网访问就是访问不了。这个问题导致我rabbitMQ,ElasticSearch,redis等等配置的中间件外网无法访问,网上差的资料,一大半都是跟我说把firewall关掉禁用,都是没有用的。最后才看到有iptables这个东西。如果想要外网访问,就需要放行端口,允许外网访问该端口,否则你是无法访问的。。。。。
具体的iptables的操作命令点击这里

总结:

比较难解决的bug无非就两种,一种就是程序的逻辑出现问题,导致得不到正确的结果,第二种就是一些中间件,开发环境的问题。
(1)如果是逻辑出现了问题,你项目比较大的话,那只能是通过单步调试,或者用System.out.println()打印出来想要得到的数据看看是哪步出了问题。
(2)如果是开发环境或者是中间件的问题,那只能是通过网上查阅资料来解决问题。如果你英语阅读能力还可以的话,我推荐使用Stack Overflow来查阅资料。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java干货仓库

觉得写的不错,就给博主投币吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值