IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 入职一家初创公司第一周的血与泪 -> 正文阅读

[系统运维]入职一家初创公司第一周的血与泪

入职一家初创公司第一周的血与泪

也可用于面试题:

你在工作中遇到过哪些难题?你都是怎么解决的?

问题: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) {
        /** 图片访问映射地址  Linux*/
//        registry.addResourceHandler("/home/img/**").addResourceLocations("file:/home/img/");
        /** 图片访问映射地址 Window*/
        registry.addResourceHandler("/home/img/**").addResourceLocations("file:D:/dev/");

       
    }

还有一个问题是,如果我们在没有登录的情况下,去访问图片的接口地址时,是会被重定向到登录页面的。但图片一般是不用登录,就可以直接用连接访问的。然后我发现他用是Shiro,有个ShiroConfig.java的文件,在里面配置一下可以直接访问的参数路径就行了。代码块一第六行配置对应代码块二的第十六行配置。

代码块二,如下所示:

/**
 * Shiro过滤器配置
 */
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
    ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
    // Shiro的核心安全接口,这个属性是必须的
    shiroFilterFactoryBean.setSecurityManager(securityManager);
    // 身份认证失败,则跳转到登录页面的配置
    shiroFilterFactoryBean.setLoginUrl(loginUrl);
    // 权限认证失败,则跳转到指定页面
    shiroFilterFactoryBean.setUnauthorizedUrl(unauthorizedUrl);
    // Shiro连接约束配置,即过滤链的定义
    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");
    // 退出 logout地址,shiro去清除session
    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");
    // 系统权限列表
    // filterChainDefinitionMap.putAll(SpringUtils.getBean(IMenuService.class).selectPermsAll());

    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,最重要的肯定是效率。思路尽量捋清楚后,再回去接着干。还有就是不要加班到太晚,一个问题如果是停留了一个小时之久,一定是思路问题。加班也是没用的。还不如回去路上想一想,第二天养好精力再干。当然除了说,领导指定加班干完。不然还是回去吧。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-25 12:48:54  更:2021-10-25 12:50:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 23:02:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码