当前位置: 首页 > news >正文

Spring Boot项目的控制器貌似只能get不能post问题

我这2天新建了一个Spring Boot项目测试,在控制器上写了两个接口,一个是支持Get方式访问,另一个支持Post方式访问,发现Get可以,而Post不行。前端Post后,报403,找不到这个方法。

一、原因

原因是spring boot的防csrf(跨站点请求伪造)机制导致。

当我们新建一个Spring Boot项目的时候,如果有添加了 spring-boot-starter-security 依赖,系统就会默认启用基本认证来保护所有端点,这是为了增加应用的安全性。如果没有配置显式的安全规则,Spring Security 将会要求进行身份验证。表现在前端,就是访问这个接口的时候,会弹出一个窗口让我们输入账号密码,而且这个窗口还不是我们自己做的。通常我们会在项目里添加一个配置类,然后里面加一些白名单。比如获取验证码、登录这些接口应设置为免身份认证,否则没法玩。

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/captcha","/verify").permitAll().anyRequest().authenticated().and().httpBasic();  // 使用 HTTP 基本认证}
}

但这段代码只解决了"/captcha","/verify"被允许无须身份验证就能访问的问题,但没有解决get可以访问,而post不能访问的问题。也许 Spring Security 认为,GET 请求相对于 POST 请求的行为通常会有所不同,所以对GET比较宽容,而POST就较为严格。这涉及到对CSRF的理解。

二、解决

解决之道就是在上面的Security配置中禁止对CSRF防范的限制,加上http.csrf().disable():

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests().antMatchers("/slideCaptcha","/slideVerify")//.antMatchers("/**").permitAll().anyRequest().authenticated().and().httpBasic();  // 使用 HTTP 基本认证}
}

三、小结

去除防CSRF限制,好像有点不安全。但事实上,通常post方式访问的接口,都需要进行身份验证。身份验证的安全性要高于CSRF防范。另外,现在微服务架构大行其道,前后端分离,二者地址、端口都不一样。前端向后端请求、提交的地址,几乎都经过nginx转发。也就是说,跨域请求是常态,防范没有太多意义。

相关拙作:
防御CSRF问题
WEB项目的安全性注意事项

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Scala之基础面向对象编程
  • [Linux CMD] 文件编辑 nano (待更新)
  • WSL-Ubuntu20.04训练环境配置
  • 所有权与生命周期:Rust 内存管理的哲学
  • 什么是跨链交换,以bitget钱包为例
  • 谷歌Gmail账号又被封了?原因与解决方法
  • excel及panda的部分内容
  • ffmpeg 时间相关--时间基,timebase,pts,dts,duration
  • 充气膜游泳馆安全吗—轻空间
  • Log4j的原理及应用详解(四)
  • 基于单片机的智能医疗监护系统设计
  • EasyAnimate-v3版本支持I2V及超长视频生成
  • Netty一文搞懂——核心原理篇<随手笔记>
  • flink 配置表
  • buuctf-web
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【mysql】环境安装、服务启动、密码设置
  • Angular6错误 Service: No provider for Renderer2
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • ES6系列(二)变量的解构赋值
  • js操作时间(持续更新)
  • mysql外键的使用
  • PHP的类修饰符与访问修饰符
  • python学习笔记 - ThreadLocal
  • V4L2视频输入框架概述
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 欢迎参加第二届中国游戏开发者大会
  • 数据科学 第 3 章 11 字符串处理
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​如何在iOS手机上查看应用日志
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (06)Hive——正则表达式
  • (1)Android开发优化---------UI优化
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (pycharm)安装python库函数Matplotlib步骤
  • (Python第六天)文件处理
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (四)事件系统
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (译)2019年前端性能优化清单 — 下篇
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .form文件_SSM框架文件上传篇
  • .jks文件(JAVA KeyStore)
  • .NET IoC 容器(三)Autofac
  • .Net Memory Profiler的使用举例
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET企业级应用架构设计系列之技术选型
  • .net中的Queue和Stack