spring security 에서 fileupload 업로드 파일 이 차단 되 었 습 니 다.

15843 단어 JavaWeb
fileupload 플러그 인 github 사이트 fileupload 플러그 인 jQuery 사이트 spring mvc + fileupload 예
자, js 파일 을 처음 도 입 했 을 때 부터 구덩이 에 들 어 갔 습 니 다.
<script src="js/jquery.1.9.1.min.js">script>
<script src="js/jquery.fileupload.js">script>
<script src="js/vendor/jquery.ui.widget.js">script>
<script src="js/jquery.iframe-transport.js">script>
<script src="bootstrap/js/bootstrap.min.js">script>
<link href="bootstrap/css/bootstrap.css" type="text/css" rel="stylesheet" />

제 가 도입 할 때 는 이 순서대로!!나중에 방법 을 찾 지 못 했 습 니 다.
$('#file').fileupload();

다음 순서 로
<script src="js/jquery.1.9.1.min.js">script>
<script src="js/vendor/jquery.ui.widget.js">script>
<script src="js/jquery.iframe-transport.js">script>
<script src="js/jquery.fileupload.js">script>
<script src="bootstrap/js/bootstrap.min.js">script>
<link href="bootstrap/css/bootstrap.css" type="text/css" rel="stylesheet" />

jquery. fileupload. js 를 맨 뒤에 두 어야 다른 js 파일 을 참조 할 수 있 습 니 다.
그러면 Security 에서 post 데 이 터 를 얻 으 려 면 csrf 의 token 이 있어 야 합 니 다. 그렇지 않 으 면 403 접근 을 거부 하 는 벽 이 부 딪 힐 수 있 습 니 다. 세 가지 방법 이 있 습 니 다. 1. multipartfilter 를 spring Security FilterChain 위 에 직접 놓 으 면 파일 을 업로드 할 때 multipartfilter 에 의 해 차단 되 고 security 의 보 호 를 받 지 않 습 니 다. 이 방법 을 다시 쓰 십시오.
public class SecurityApplicationInitializer extends AbstractSecurityWebApplicationInitializer {

    @Override
    protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
        insertFilters(servletContext, new MultipartFilter());
    }
}

xml 설정 에서 MultipartFilter 가 spring Security FilterChain 앞 에 놓 여 있 는 지 확인 합 니 다.
<filter>
    <filter-name>MultipartFilterfilter-name>
    <filter-class>org.springframework.web.multipart.support.MultipartFilterfilter-class>
filter>
<filter>
    <filter-name>springSecurityFilterChainfilter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxyfilter-class>
filter>
<filter-mapping>
    <filter-name>MultipartFilterfilter-name>
    /*
filter-mapping>
<filter-mapping>
    <filter-name>springSecurityFilterChainfilter-name>
    /*
filter-mapping>

이렇게 해서 간단 하고 거 칠 게 해결 되 었 습 니 다. (그 당시 에는 누구나 파일 을 서버 에 업로드 할 수 있 었 고 잠시 저장 되 었 습 니 다. 권한 을 수 여 받 은 사용자 만 이 처 리 된 파일 을 업로드 할 수 있 었 습 니 다. 대부분의 경우 잠시 저 장 된 파일 들 은 큰 문제 가 없 었 습 니 다. 프레임 워 크 가 정기 적 으로 자동 으로 정리 되 기 때 문 입 니 다.)
2. csrf 의 token 을 url 매개 변수 로 합 니 다.
<html>
<head>
    <meta name="_csrf" content="${_csrf.token}"/>
    
    <meta name="_csrf_header" content="${_csrf.headerName}"/>
    
head>

<form action="./upload?${_csrf.parameterName}=${_csrf.token}" method="post" enctype="multipart/form-data">

하지만 이 로 인해 토 큰 이 유출 되 었 다.숨겨 진 영역 에 넣 으 면:
type="hidden"
    name="${_csrf.parameterName}"
    value="${_csrf.token}"/>

comons - fileupload 구성 요소 가 request 를 패키지 할 때 csrf 지원 에 문제 가 있 는 지 csrf 값 을 전달 하지 않 았 습 니 다.그래서 오 버 에 떨 어 졌 는데...................................................
  • AjaxUpload 로 업로드:
  • var uploader = new AjaxUpload({
            url: '/file/upload',
            name: 'uploadfile',
            multipart: true,
            customHeaders: { '${_csrf.headerName}': '${_csrf.token}' },
            ...
            onComplete: function(filename, response) {
                ...
            },
            onError: function( filename, type, status, response ) {
                ...
            }
    });

    하지만 인터넷 에서 이 플러그 인 을 찾 지 못 했 습 니 다.
    4. fileupload 플러그 인:
    $('#file').fileupload({
                        dataType: 'json',
                        add: function (e, data) {
                            data.context = $('

    但是在jquery.fileupload.js里找了好久,发现了一个方法:_initXHRData: function (options) 跟设置request headers有点关系。可是怎么讲csrf的header和token传进去呢?!后来想到我可以直接用ajaxSend先设置requestHeader不就行了!!!
    解决Spring Security 表单上传文件CSRF失效的问题

    $(document).ready(function() {
                var token = $("meta[name='_csrf']").attr("content");
                var header = $("meta[name='_csrf_header']").attr("content");
                $(document).ajaxSend(function(e, xhr, options) {
                    xhr.setRequestHeader(header, token);
                });
                $('#file').fileupload({
                        dataType: 'json',
                        add: function (e, data) {
                            data.context = $('

    就酱紫,折腾了半天文档,还是用这种方法解决了!!!
    PS:如果用的是thymeleaf模板,注意用的是:th:content

    <html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta name="_csrf" th:content="${_csrf.token}"/>
        
        <meta name="_csrf_header" th:content="${_csrf.headerName}"/>
    head>

    참조: stackoverflow 에서 유사 한 해결 방법 stackoverflow 다른 사이트
    JSP 의 Taglib 솔 루 션 을 따로 지불 합 니 다.
    "sec" uri="http://www.springframework.org/security/tags" %>
        
    "post" action="/do/something"> Name:
    "text" name="name" /> ...

    좋은 웹페이지 즐겨찾기