这周在调试代码的过程中遇到了一个问题

我们用浏览器访问后端接口时采用域名+URI的方式

http://localhost:9090/back/user/find?page=1

当我们需要从后台获取图片或者其他静态资源的时候,我们应当怎么做

不妨先直接这样访问

http://localhost:9090/static/upload/A.jpg

当我们输入一下格式URL的时候,后端会误认为当前访问的是一个不存在的接口

可能会需要token验证,或者404(一般都是路径不对)报错找不到资源

为此我们需要解决两个问题:

1 怎么让框架知道,我访问的是资源文件,而不是接口

2 访问资源文件的时候,和访问接口一样,都会被过滤器或者拦截器拦截,使用了jwt安全验证,需要带上token请求头,但是我们访问的时,不想验证,因此需要放行。

对症下药

一、创建配置类

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;///**没有生效的静态资源放行/
@Configuration
public class ResourceConfig implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");}
}

看到了这里有两个需要配置的路径:

注意

这一步完成了,标志着这个文件夹下的所有文件是静态资源,可以作为网络资源进行访问。

但是还有一个问题:

我们的jwt此时依然生效,需要验证登录的token,为了方便,我们直接将这些资源免密放行。

二、匹配器放行

这是我的WebSecurityConfigure配置类。

@EnableGlobalMethodSecurity(prePostEnabled = true) //至关重要的注解,缺失会导致验证不起效
@EnableWebSecurity
public class WebSecurityConfigure extends WebSecurityConfigurerAdapter {@Autowiredprivate UserDetailsService userDetailsService;//过滤器@Autowiredprivate JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;//入口@Autowiredprivate RestAuthenticationEntryPoint restAuthenticationEntryPoint;//访问拒绝处理器@Autowiredprivate RestfulAccessDeniedHandler restfulAccessDeniedHandler;// 参数: HttpSecurity http//**http.authorizeRequests()**// 下添加了多个匹配器,每个匹配器用来控制不同的URL接受不同的用户访问。// 简单讲,http.authorizeRequests()就是在进行请求的权限配置。@Overrideprotected void configure(HttpSecurity http) throws Exception {//第二步:我们用我们自己的数据库数据来完成权限验证// 开启跨域和关闭csrf保护http.cors().and().csrf().disable().sessionManagement()//允许配置会话管理.sessionCreationPolicy(SessionCreationPolicy.STATELESS)//Spring Security不会创建HttpSession,也不会使用它获取SecurityContext.and().authorizeRequests().antMatchers("/index","/login","/upload/**","/back/product/upload",//文件上传"/front/**",//公司详情  +  页面导航"/back/**/latest" //最新产品+新闻).permitAll()// 首页 和 登录页面 放行.antMatchers(HttpMethod.OPTIONS).permitAll()    //options 方法的请求放行.anyRequest().authenticated()               // 其它请求要认证.and()// 这一步,告诉Security 框架,我们要用自己的UserDetailsService实现类// 来传递UserDetails对象给框架,框架会把这些信息生成Authorization对象使用.userDetailsService(userDetailsService);// 过滤前,我们使用jwt进行过滤http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
//        http.authorizeRequests()
//                .antMatchers("/index").permitAll()//放行
//                .anyRequest().authenticated()
//                .and()
//                .formLogin()//访问security自带的login接口
//                .and()
//                // 这一步,告诉Security 框架,我们要用自己的UserDetailsService实现类
//                // 来传递UserDetails对象给框架,框架会把这些信息生成Authorization对象使用
//                .userDetailsService(userDetailsService);//添加自定义未授权和未登录结果返回http.exceptionHandling().accessDeniedHandler(restfulAccessDeniedHandler).authenticationEntryPoint(restAuthenticationEntryPoint);}

实际应用中只需要在匹配器中添加:

便实现了静态资源放行。

当我们能通过浏览器拿到图片,意味着这个静态资源时暴露到本地网络上的,说明配置是成功的

SpringBoot在使用Security和JWT时,应当怎么放行图片等静态资源#访问静态资源#静态资源放行#报错401相关推荐

  1. 【报错笔记】在做图片上传时上传图片后可以跳转到上传成功界面,也没有报错,数据库中也传入了值,可是eclipse中webapp下怎样都无法生存目录。

    在做图片上传时上传图片后可以跳转到上传成功界面,也没有报错,数据库中也传入了值,可是eclipse中webapp下怎样都无法生存目录. 我使用UUID生成8级目录,在webapp下创建目录,将图片传进 ...

  2. vue 项目在编译时,总是出现系统崩的状态,node 命令框也会报错,报错信息中有v7 或者 v8 的样式。

    项目场景: 背景: vue 项目在编译时,总是出现系统崩的状态,node 命令框也会报错. 问题描述 问题: vue 项目在编译时,总是出现系统崩的状态,node 命令框也会报错,如下图:有v7 或者 ...

  3. python打开文件时,找不到文件 FileNotFoundError: [Errno 2] No such file or directory报错

    小白一枚,记录学习错误,共同进步 python打开文件时,找不到文件 FileNotFoundError: [Errno 2] No such file or directory报错 UnicodeD ...

  4. 当在 终端 中用 npm 安装 Vant 组件库时,发生“npm ERR code ERESOLVE ;npm ERRERESOLVE could not resolve;”报错时,该怎么办?

    出现的问题: 当在 终端 中用 npm 安装 Vant 组件库时,发生 npm ERR! code ERESOLVE: npm ERR! ERESOLVE could not resolve:报错时, ...

  5. SpringBoot 2 + Spring Security 5 + JWT 的单页应用 Restful 解决方案

    此前我已经写过一篇类似的教程,但那时候使用了投机的方法,没有尊重 Spring Security 的官方设计,自己并不感到满意.这段时间比较空,故重新研究了一遍. 特性 使用 JWT 进行鉴权,支持 ...

  6. springboot的yml配置文件绑定时必须和相应的类中的属性类型对应,不然启动报错

    今天启动springboot应用时一开始一直是error,访问localhost也无法打开: 此时自己的Person.java: package boot.bean; import lombok.Da ...

  7. sqlserver安装时尽量少的占用c盘_安装3dmax出现command line option 报错,如何解决

    安装3dmax出现command line option syntax error./type command for help错误解决办法!如果点击确定,安装直接结束~安装不成功! 解决方案信息: ...

  8. new一个xssfworkbook时出错_java用poi操作excel的时候,new XSSFWorkbook,总是报错?

    问 题 走到箭头那一步的时候,总是调到handlerMehtodInvoker.class 这里 为什么捕捉不到异常? 解决方案 看你的代码,貌似实现的是要读取Excel文件吧.代码如下:具体的跟你的 ...

  9. jwt 例子 java_spring boot 入门之security oauth2 jwt完美整合例子-java编程

    一.本文简介 本文主要讲解Java编程中spring boot框架+spring security框架+spring security oauth2框架整合的例子,并且oauth2整合使用jwt方式存 ...

最新文章

  1. 某程序员为方便老婆工作,写了一些小工具给老婆用!如今老婆要离职,公司老板却要求必须把工具留下!网友:跟他收费!...
  2. Android开发之Activity转场动画
  3. java 张龙_张龙 JAVA5新特性学习笔记
  4. Javaweb学习笔记——(三)——————JavaScript基础DOM基础
  5. matlab四维图程序,Matlab 四维图形绘制
  6. 部署DNS split分离解析服务
  7. php 类自动执行,php类中的魔术方法及类的自动加载
  8. hypermesh10的安装
  9. 好看的按钮集合HTML + CSS各种好看按钮组件
  10. 盛夏七月,欢迎来京城看“火烧云”
  11. 图解排序算法之堆排序(Java)
  12. 输入一行字符,统计其中的英文字符、数字字符、空格和其他字符的个数。
  13. 【Proteus仿真】DAC0832+51单片机汇编实现三角波输出
  14. 2021年4月4日新增
  15. springboot+java农家乐系统-住宿-美食-活动vue
  16. PMP项目管理培训总结
  17. git版本回退(git reset、git revert、git stash)
  18. 用计算机设计购物小票,商友星云系统软件票据和条码标签设计和打印
  19. 计算机网络 — VLAN
  20. Git忽略文件(.ignore)以及git status,git diff,git rm命令

热门文章

  1. 微电子所等在二维材料异质结构光电器件研究中取得进展
  2. Java正则匹配 以某个汉字开头和结束
  3. 97整数小波压缩的FPGA实现过程
  4. API网关Kong(三):功能梳理和插件使用-基本使用过程
  5. 数学基础(2)~ 数理统计基础知识
  6. 关于Linux系统指令 top 之 %wa 占用高,用`iostat`探个究竟
  7. 第十三届蓝桥杯大赛 python B组题解交流
  8. selenium 下拉框失焦定位
  9. Doo-Sabin细分算法
  10. 智慧城市水质在线蓝绿藻监测传感器