Загрузка файла в Struts2 вместе с токеном Spring CSRF
Я использую,
Spring Framework 4.0.0 RELEASE (GA)Spring Security 3.2.0 RELEASE (GA)Struts 2.3.16В котором я использую встроенный токен безопасности для защиты от CSRF-атак.
Это многокомпонентный запрос, в котором токен CSRF недоступен для безопасности Spring, если толькоMultipartFilter
вместе сMultipartResolver
правильно настроен так, чтобы Spring-запрос обрабатывал составные запросы.
MultipartFilter
вweb.xml
настраивается следующим образом.
contextConfigLocation
/WEB-INF/applicationContext.xml
/WEB-INF/spring-security.xml
MultipartFilter
org.springframework.web.multipart.support.MultipartFilter
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
MultipartFilter
/*
springSecurityFilterChain
/*
AdminLoginNocacheFilter
filter.AdminLoginNocacheFilter
AdminLoginNocacheFilter
/admin_login/*
NoCacheFilter
filter.NoCacheFilter
NoCacheFilter
/admin_side/*
org.springframework.web.context.ContextLoaderListener
Description
org.springframework.web.context.request.RequestContextListener
org.springframework.security.web.session.HttpSessionEventPublisher
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts.devMode
true
struts2
/*
30
index.jsp
И в ,applicationContext.xml
MultipartResolver
регистрируется следующим образом.
Токен CSRF теперь получен Spring Security, но при этом возникает другая проблема в Struts.
Загруженные файлы сейчасnull
в Struts действие классов происходит следующим образом.
@Namespace("/admin_side")
@ResultPath("/WEB-INF/content")
@ParentPackage(value="struts-default")
public final class CategoryAction extends ActionSupport implements Serializable, ValidationAware, ModelDriven
{
private File fileUpload;
private String fileUploadContentType;
private String fileUploadFileName;
private static final long serialVersionUID = 1L;
//Getters and setters.
//Necessary validators as required.
@Action(value = "AddCategory",
results = {
@Result(name=ActionSupport.SUCCESS, type="redirectAction", params={"namespace", "/admin_side", "actionName", "Category"}),
@Result(name = ActionSupport.INPUT, location = "Category.jsp")},
interceptorRefs={
@InterceptorRef(value="defaultStack", "validation.validateAnnotatedMethodOnly", "true"})
})
public String insert(){
//fileUpload, fileUploadContentType and fileUploadFileName are null here after the form is submitted.
return ActionSupport.SUCCESS;
}
@Action(value = "Category",
results = {
@Result(name=ActionSupport.SUCCESS, location="Category.jsp"),
@Result(name = ActionSupport.INPUT, location = "Category.jsp")},
interceptorRefs={
@InterceptorRef(value="defaultStack", params={ "validation.validateAnnotatedMethodOnly", "true", "validation.excludeMethods", "load"})})
public String load() throws Exception{
//This method is just required to return an initial view on page load.
return ActionSupport.SUCCESS;
}
}
Это происходит потому, что, по моему мнению,многочастный запрос Spring уже обработан и используется, следовательно, он не доступен для Struts в качестве составного запроса и, следовательно, объект файла в классе действий Struts имеет значение.null
Есть ли способ обойти эту ситуацию? В противном случае, у меня осталась единственная возможность добавить токен к URL-адресу в качестве параметра строки запроса, который крайне не рекомендуется и не рекомендуется вообще.
...
Короче : Как получить файлы в классе действий Struts, если Spring создан для обработки многочастного запроса? С другой стороны, если веснане затем для обработки составного запроса создается токен безопасности. Как преодолеть эту ситуацию?