入职一家初创公司第一周的血与泪
也可用于面试题:
你在工作中遇到过哪些难题?你都是怎么解决的?
问题:Springboot在Window与Linux中图片回显不出来
小程序后台管理系统,学员页面,学员编辑信息时,头像上传提示成功后,没有回显出来。返回的用户头像图片地址也是404。而且还要实现不登录的情况下,可以访问到图片资源。然后这个问题也是改了两天天。
处理过程: 第一天,想看后台报错日志,但是服务器连接不上去,因为这个服务器是只有内网才能访问,外部访问需要借助他们提供的VPN工具,用账号密码登录,还要发送短信后,才能进去里面的堡垒机。然后再在这个堡垒机平台上设置我们本地的ssh和ftp工具的本地地址。进行连接和传输文件。然后我的电脑是前同事刚刚刷机后的机子,前面用的是linux的系统,刷成了WIN10给我,我自己重新又搭了一套环境。然后第一天就是堡垒机平台登录上去,本地的ssh、ftp工具一直调不起来,连接不上内网服务器,而且用户也一直在催,也是搞到凌晨一点半 第二天,请教医院提供这个VNP的技术,说这个VPN工具是基于IE内核开发的,只能用IE浏览器。然后还是调不起来ssh工具,后面换了一台电脑尝试,是可以的,是我的电脑问题。开始正式排查,日志里面是没有报错的。上传图片后地址也是返回的,就是报的404,没有这个资源。然后我们就开始改Nginx的配置文件,考虑是不是配置路径的问题。中午还来了个被老板叫来帮忙的之前已经面过试的人过来帮忙。也没帮上什么忙,只能自己想办法。最后是在晚上凌晨开始陆续解决问题,四点钟到的家。花了半个小时总结。
最后解决:映射与Shiro拦截 是找资料,发现需要在Spring的一个ResourcesConfig.java文件中,可以重写addResourceHandlers()方法,然后在里面加一个访问参数,用于映射本地路径的配置,这样他就可以访问到本地的图片了。 代码块一,如下所示:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/home/img/**").addResourceLocations("file:D:/dev/");
}
还有一个问题是,如果我们在没有登录的情况下,去访问图片的接口地址时,是会被重定向到登录页面的。但图片一般是不用登录,就可以直接用连接访问的。然后我发现他用是Shiro,有个ShiroConfig.java的文件,在里面配置一下可以直接访问的参数路径就行了。代码块一第六行配置对应代码块二的第十六行配置。
代码块二,如下所示:
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
shiroFilterFactoryBean.setLoginUrl(loginUrl);
shiroFilterFactoryBean.setUnauthorizedUrl(unauthorizedUrl);
LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/home/img/**" , "anon");
filterChainDefinitionMap.put("/favicon.ico**" , "anon");
filterChainDefinitionMap.put("/ruoyi.png**" , "anon");
filterChainDefinitionMap.put("/login.png**" , "anon");
filterChainDefinitionMap.put("/IMvideo/**" , "anon");
filterChainDefinitionMap.put("/css/**" , "anon");
filterChainDefinitionMap.put("/docs/**" , "anon");
filterChainDefinitionMap.put("/fonts/**" , "anon");
filterChainDefinitionMap.put("/img/**" , "anon");
filterChainDefinitionMap.put("/ajax/**" , "anon");
filterChainDefinitionMap.put("/js/**" , "anon");
filterChainDefinitionMap.put("/ruoyi/**" , "anon");
filterChainDefinitionMap.put("/captcha/captchaImage**" , "anon");
filterChainDefinitionMap.put("/logout" , "logout");
filterChainDefinitionMap.put("/system/file/**" , "anon,captchaValidate");
filterChainDefinitionMap.put("/login" , "anon,captchaValidate");
filterChainDefinitionMap.put("/system/SzjjCurriculum/idQuertUserCurriculum" , "anon,captchaValidate");
filterChainDefinitionMap.put("/wx/minproject/**" , "anon,captchaValidate");
filterChainDefinitionMap.put("/wx/getopenid/**" , "anon,captchaValidate");
filterChainDefinitionMap.put("/wx/im/**" , "anon,captchaValidate");
filterChainDefinitionMap.put("/wx/model/**" , "anon,captchaValidate");
filterChainDefinitionMap.put("/wx/guard/**" , "anon,captchaValidate");
Map<String, Filter> filters = new LinkedHashMap<String, Filter>();
filters.put("onlineSession" , onlineSessionFilter());
filters.put("syncOnlineSession" , syncOnlineSessionFilter());
filters.put("captchaValidate" , captchaValidateFilter());
filters.put("kickout" , kickoutSessionFilter());
filters.put("logout" , logoutFilter());
shiroFilterFactoryBean.setFilters(filters);
filterChainDefinitionMap.put("/**" , "user,kickout,onlineSession,syncOnlineSession");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
}
注意:上传路径 上面两个代码块只是用于映射路径和访问权限的配置,还有一个需要注意的是,“返回的用户头像图片地址也是404”,这个问题排查思路是: 1、首先是排查,图片有没有上传成功,服务器或者本地磁盘有没有这个图片。 2、没有的话,是不是路径有问题,上传的路径有问题,路径推荐用绝对路径:例如:“D:/imges/“,一下其中一条用户数据的头像地址变成了这样: 3、文件确认是上传成功后,访问图片地址还是404,那就需要排查,这个用户信息中的图片地址是不是正确的,有可能是这样的:http://localhost:8099D:/imges/20211023165144/47e84d7a-7bb1-47d7-8e69-6b57148c96ee.jpg, 4、其中的“D:/imges/” 是图片存放的实际地址,发现也被拼到图片访问地址中去啦。 这种问题,我们就需要调用接口来debug调试了,也可以着重看是不是编辑用户信息时,选择完照片上传后,点击保存,保存的时候,拼错啦, 5、正确做法应该是,这个路径中,”D:/imges/“,这个拼接的参数,实际应该是需要和代码块一的图片访问映射地址对应上的。正确拼法应该是: http://localhost:8099/home/img/20211023165144/47e84d7a-7bb1-47d7-8e69-6b57148c96ee.jpg, 6、到这里可能还是会有疑惑,一个是实际存放图片的地址,一个是域名参数,这个两个东西,我在上传头像点击保存后,具体怎么配置呢?很简单,两点,第一是用户在编辑页面的时候,点击图片 > 选择图片 > 确定上传图片后,后端需要将图片存储到实际的目录地址下。然后返回给前端一个拼接了域名参数的图片地址(可以着重对比第三点和第五点的两个地址),用户点击保存后,到数据的信息,
学到的经验:面对经验要放松,冷静、适当逃离压力区 这个问题实际上是挺简单的,也就是 一个域名参数与Shiro拦截的问题,处理了两天,主要的问题是抗压能力的问题,什么是抗压能力呢?我觉得是在客户、老板、上级、同事给到任务进度提醒或者工作质量问题的时候,能够较好的立马改成处理好, 那么,我现在就是没有处理好,我面对这种问题的时候,表现的是无助、无奈、甚至是有点自我放弃的想法与心态。还好自己是坚持了下来。这一点非常好。那么,我现在把这个问题处理了,我下次应该怎么处理呢?第一点就是,接手到问题的时候,应该将问题分析清楚,具体包括、问题的具体展现,是什么错?正常应该是什么样的?那么不正常的时候、大概是哪一步不正常。尽量分析清楚再进行排查。第二步、就是实际排查,一般都是做了什么操作然后才会造成什么样的问题,那么就在本地重现问题,然后改好问题,本地重现不了,那么肯定是数据或者环境问题。再逐一排查就行。就这两步。 其中排查问题的时候,最容易出现的问题,就是以上我出现的问题,无助、无奈、自我放弃,遇到这种情况最好的办法是。不要一直坐在电脑显示屏前,苦思冥想,或者到处寻思问诊。我觉得最好的办法是,逃离这个压力区。去上个洗手间,然后去个阳台吹吹风,好好缕一缕,是不是排查思路的问题,现在定位的问题点是不是定位错啦、没有错的话,除了现在已经想到的办法,还有没有其他立刻可以改好的方案。线上bug,最重要的肯定是效率。思路尽量捋清楚后,再回去接着干。还有就是不要加班到太晚,一个问题如果是停留了一个小时之久,一定是思路问题。加班也是没用的。还不如回去路上想一想,第二天养好精力再干。当然除了说,领导指定加班干完。不然还是回去吧。
|