Как настроить MultipartResolver для другого maxUploadSize для обычного пользователя и администратора?

Я могу определить MultipartResolver следующим образом с maxUploadSize размером 10 КБ (10000 байт):

<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="10000"/>
</bean

Однако, если администратору необходимо загрузить через интерфейс администратора несколько больших файлов, которые превышают это ограничение, необходимо временно перенастроить приложение, чтобы разрешить это – а затем повторно настроить, чтобы обычные пользователи не превышали это ограничение.

В то время как это происходит, обычный пользователь, конечно, потенциально может спрятать большой файл без предупреждения.

Есть ли способ настроить преобразователь для использования разных maxUploadSize в этих двух ситуациях?


person Tammen    schedule 07.07.2011    source источник


Ответы (3)


Самый простой способ — использовать по-разному сконфигурированные реализации bean-компонента для администраторов, а не для обычных пользователей. Самый элегантный способ сделать это — использовать компонент Spring 3.0 @Configuration, который создает экземпляр компонента с областью действия сеанса (ниже я также добавляю прокси с областью действия, если вы не используете его в компоненте с областью действия сеанса; в противном случае вы можно просто использовать более простую аннотацию вроде этой: @Scope(WebApplicationContext.SCOPE_SESSION)).

@Configuration
public class MultipartResolverBuilder {
    @Bean @Scope(value = WebApplicationContext.SCOPE_SESSION,
           proxyMode = ScopedProxyMode.TARGET_CLASS)
    public CommonsMultipartResolver getMultipartResolver() {
        CommonsMultipartResolver mr = new CommonsMultipartResolver();
        if (user_is_not_admin) {
            mr.setMaxUploadSize(10000);
        }
        return mr;
    }
}

Конечно, вам нужно будет добавить код, чтобы определить, является ли пользователь администратором или нет, и вам нужно будет добавить поддержку сканирования для конфигурации на основе аннотаций (если вы еще этого не сделали; <context:annotation-config/>/ <context:component-scan .../> довольно распространенные вещи).

person Donal Fellows    schedule 07.07.2011
comment
Стоит отметить этот ответ: если я вызываю свой метод bean-компонента getMultipartResolver, Spring жалуется. Я должен позвонить своему multipartResolver. На всякий случай, если у кого-то еще возникнет эта проблема. - person Robin Jonsson; 22.03.2014

Возможно, вам потребуется создать два bean-компонента multipartResolver, один для обычных пользователей и один для администраторов. В вашем приложении вы можете выбрать, какой компонент использовать, в зависимости от роли пользователя.

person Qwerky    schedule 07.07.2011
comment
In your app you can pick which bean to use based on the user's role. -> Как это сделать, поскольку преобразователь определен для ответа на все составные запросы, полученные приложением? - person Tammen; 07.07.2011
comment
@Tammen, возможно, вы можете увидеть ветку весеннего форума для ответа: :forum.spring.io/forum/spring-projects/web/. Вы можете просто определить два bean-компонента MultiparResolver, а затем использовать DI Spring для вставки соответствующего bean-компонента. Как и в приведенном выше сообщении. - person andy; 23.08.2014

Как насчет решения этой проблемы с помощью бизнес-логики? Просто установите значение maxUploadSize, достаточное для администратора, и проверьте, является ли пользователь администратором или нет, и размер файла.

person Whiteship    schedule 07.07.2011