基于Spring Security+Spring MVC的web应用,为了防止跨站提交攻击,通常会配置csrf,即:

1     <http ...>
2         ...
3         <csrf />
4     </http>

如果应用中有Post方式访问的Rest服务(参考下面的代码),会很不幸的发现,所有POST方式请求的服务会调用失败。

1     @RequestMapping(value = "/user/create", method = RequestMethod.POST)
2     @ResponseBody
3     public UserInfo createUser(@RequestBody(required = true) UserInfo user,
4             HttpServletRequest request, HttpServletResponse response)
5             throws Exception {
6         ...
7     }

原因在于:启用csrf后,所有http请求都被会CsrfFilter拦截,而CsrfFilter中有一个私有类DefaultRequiresCsrfMatcher

 1     private static final class DefaultRequiresCsrfMatcher implements RequestMatcher {
 2         private Pattern allowedMethods = Pattern.compile("^(GET|HEAD|TRACE|OPTIONS)$");
 3
 4         /* (non-Javadoc)
 5          * @see org.springframework.security.web.util.matcher.RequestMatcher#matches(javax.servlet.http.HttpServletRequest)
 6          */
 7         public boolean matches(HttpServletRequest request) {
 8             return !allowedMethods.matcher(request.getMethod()).matches();
 9         }
10     }

从这段源码可以发现,POST方法被排除在外了,也就是说只有GET|HEAD|TRACE|OPTIONS这4类方法会被放行,其它Method的http请求,都要验证_csrf的token是否正确,而通常post方式调用rest服务时,又没有_csrf的token,所以校验失败。

解决方法:自己弄一个Matcher

 1 package com.cnblogs.yjmyzz.utils;
 2
 3 import java.util.List;
 4 import java.util.regex.Pattern;
 5
 6 import javax.servlet.http.HttpServletRequest;
 7
 8 import org.springframework.security.web.util.matcher.RequestMatcher;
 9
10 public class CsrfSecurityRequestMatcher implements RequestMatcher {
11     private Pattern allowedMethods = Pattern
12             .compile("^(GET|HEAD|TRACE|OPTIONS)$");
13
14     public boolean matches(HttpServletRequest request) {
15
16         if (execludeUrls != null && execludeUrls.size() > 0) {
17             String servletPath = request.getServletPath();
18             for (String url : execludeUrls) {
19                 if (servletPath.contains(url)) {
20                     return false;
21                 }
22             }
23         }
24         return !allowedMethods.matcher(request.getMethod()).matches();
25     }
26
27     /**
28      * 需要排除的url列表
29      */
30     private List<String> execludeUrls;
31
32     public List<String> getExecludeUrls() {
33         return execludeUrls;
34     }
35
36     public void setExecludeUrls(List<String> execludeUrls) {
37         this.execludeUrls = execludeUrls;
38     }
39 }

这里添加了一个属性execludeUrls,允许人为排除哪些url。

然后在配置文件里,这样修改:

 1     <http entry-point-ref="loginEntryPoint" use-expressions="true">
 2         ...
 3         <intercept-url pattern="/rest/**" access="permitAll" />
 4         ...
 5         <csrf request-matcher-ref="csrfSecurityRequestMatcher"/>
 6     </http>
 7
 8     <beans:bean id="csrfSecurityRequestMatcher" class="com.cnblogs.yjmyzz.utils.CsrfSecurityRequestMatcher">
 9         <beans:property name="execludeUrls">
10             <beans:list>
11                 <beans:value>/rest/</beans:value>
12             </beans:list>
13         </beans:property>
14     </beans:bean>

这里约定所有/rest/开头的都是Rest服务地址,上面的配置就把/rest/排除在csrf验证的范围之外了.

解决CsrfFilter与Rest服务Post方式的矛盾相关推荐

  1. Spring Security笔记:解决CsrfFilter与Rest服务Post方式的矛盾

    基于Spring Security+Spring MVC的web应用,为了防止跨站提交攻击,通常会配置csrf,即: 1 <http ...> 2 ... 3 <csrf /> ...

  2. 【转载】nginx for windows: 让nginx以服务的方式运行

    nginx for windows: 让nginx以服务的方式运行 在windows下安装了nginx, 郁闷是发现它没有以服务方式运行, 也就是说当用户注销后,程序 会终止.因此需要将nginx作为 ...

  3. [秘技]解决QQ音乐超出服务区域问题

    使用大陆音乐APP,通常会发现其他地区无法使用问题,连QQ音乐也不例外,为什么会只有限制大陆能够使用? 听传闻说这些音乐其实他们是有买公开版权,但只有局限在于大陆地区,否则怎么会这么制订这机制呢? 但 ...

  4. mysql star item 失败_解决CentOS7下MySQL服务启动失败的问题.md

    --- title: 解决CentOs7下MySQL服务启动失败的问题 date: 2021-01-06 15:21:31 tags: MySQL --- 老夫前几天才在虚拟机的CentOS安装好My ...

  5. Nacos注册中心和服务消费方式

    哈喽朋友们本次小無分享Nacos注册中心和服务消费方式 前言:本期文章操作性不多,多在于详细的理论说明 还各位看官耐心看完 一,服务治理介绍 目录 一,服务治理介绍 二,nacos简介 nacos实战 ...

  6. 自动和手动开启无障碍服务的方式

    自动开启 条件:系统应用 方式:通过Settings.Secure.putString. 代码如下:最好在开启和关闭前进行判断当前无障碍服务是否已经开启. //自动开启无障碍服务 private fu ...

  7. JAVA物联所需技术_基于JAVA多线程技术解决物联云端服务雪崩效应的方法与流程...

    本发明涉及互联网技术领域,特别涉及一种基于JAVA多线程技术解决物联云端服务雪崩效应的方法. 背景技术: 目前,物联云系统已经作为普遍的智能电视平台出现在我们面前,而细致分析物联云系统我们可以发现,当 ...

  8. SpringBoot解决跨域问题的六种方式

    一.同源策略 同源,就是咱们域名.端口号.ip.采用的协议都相同,那么我们就是同源的 反之就是不同源的!!! 出于浏览器的同源策略限制.同源策略(Sameoriginpolicy)是一种约定,它是浏览 ...

  9. Spring Cloud Alibaba基础教程:几种服务消费方式(RestTemplate、WebClient、Feign)

    热门:Spring Cloud Greenwich.RELEASE 正式发布!一个非常有看头的版本! 通过<Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现&g ...

最新文章

  1. jQuery和dom的相互转换
  2. tts代表_Text-to-Speech (TTS) Synthesis语音合成----控制语言合成
  3. C++编码中减少内存缺陷的方法和工具
  4. Linux下C编程入门(.h文件,.c文件,以及多文件调用的方式)
  5. Linux版本_linux版本信息解析
  6. 神经网络快速搭建之一站式访问
  7. maven 多仓库和镜像设置
  8. vivo X27发布日期官宣: 3月19日 三亚见!
  9. android 内存溢出检查,Android Handler使用导致内存溢出附带LeakCanary排查
  10. 电脑桌面打开计算机后出现两部分,为什么当打开电脑时,桌面会出现两个我的文档的窗口,是不是中病毒了,怎么处理啊...
  11. 微信终于良心一回,更新了语音识别功能可识别粤语,广东人有福了
  12. delphi之鼠标模拟
  13. java android 读写西门子PLC数据,包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC...
  14. 初学C语言2--C语言项目的基本框架
  15. <一起JS(基础篇)>4.标识符、字符串、Number、波尔值、Null和Undefined
  16. 程序员必看:7个接外包私活网站
  17. oracle blob 24909,imp导入含blob字段的大表时不成功
  18. LeetCode:Confusing Number II
  19. java 高效列转行,java 列转行
  20. SpringBoot缓存@Cacheable

热门文章

  1. Linux如何安装iperf软件,Linux 下网络性能测试工具 iperf 的安装和使用
  2. spring学习笔记四(注入Bean属性)
  3. 【BZOJ2813】奇妙的Fibonacci
  4. bzoj 1151: [CTSC2007]动物园zoo
  5. Script component 用法
  6. hdu 4496 D-City 并查集
  7. java多线程知识汇总(三)如何选择锁?如何加锁
  8. 各种字符串合并处理示例.sql
  9. linux java执行_linux下运行java
  10. Netty线程模型和核心概念