簡體   English   中英

Spring Security未檢測到多部分配置

[英]Spring Security doesn't detect multi-part configuration

我在Spring MVC中正確配置了多部分表單,但是當我將Spring Security添加到項目中時,我無法再上傳文件。 我不知道是什么原因造成的,實際上我嘗試了在stackoverflow中找到的每個解決方案。

春季MVC:

public class MvcConfig extends WebMvcConfigurerAdapter {

@Bean
public InternalResourceViewResolver viewResolver(){
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setViewClass(JstlView.class);
    viewResolver.setPrefix("/WEB-INF/views/");
    viewResolver.setSuffix(".jsp");
    return viewResolver;
}

@Bean
public CommonsMultipartResolver filterMultipartResolver() {
    CommonsMultipartResolver resolver = new CommonsMultipartResolver();
    resolver.setDefaultEncoding("utf-8");
    return resolver;
}

@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}

ServletInitializer:

public class ServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

@Override
protected Class<?>[] getServletConfigClasses() {
    return new Class[]{MvcConfig.class};
}

@Override
protected String[] getServletMappings() {
    return new String[]{"/"};
}

@Override
protected Class<?>[] getRootConfigClasses() {
    return new Class[]{MessageSecurityWebApplicationInitializer.class, SecurityConfig.class};
}

安全配置:

public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth
            .inMemoryAuthentication()
            .withUser("user").password("password").roles("USER")
            .and()
            .withUser("admin").password("1234").roles("USER", "ADMIN");
}


@Override
public void configure(WebSecurity web) throws Exception {
    web
            .ignoring()
            .antMatchers("/resources/**"); // #3
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .authorizeRequests()
            .antMatchers("/", "/login", "/getPhoto/{id}", "/deletePhoto/{id}").permitAll()
            .antMatchers("/remove").hasRole("ADMIN")
            .antMatchers("/add/**", "/upload/**").hasAnyRole("ADMIN", "USER")
            .anyRequest().authenticated() // 7
            .and()
            .formLogin()
            .loginPage("/login")
            .successForwardUrl("/")
            .usernameParameter("userLogin")
            .passwordParameter("userPassword")
            .failureForwardUrl("/login?error=true");
}

MessageSecurityWebApplicationInitializer

public class MessageSecurityWebApplicationInitializer
    extends AbstractSecurityWebApplicationInitializer {


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

上傳映射:

 @RequestMapping(value = "/upload", method = RequestMethod.POST)
public String uploadWallpaper(@RequestParam("wallpaperFile") MultipartFile file,
                              @RequestParam("category") String category) {
    Wallpaper wallpaper = new Wallpaper();

    try {
        wallpaper.setName(file.getOriginalFilename());
        wallpaper.setData(file.getBytes());
        wallpaper.setCategory(category);
        serviceDAO.addObject(wallpaper);

        return "redirect:/";
    } catch (IOException e) {
        return "add_wallpaper";
    }
}

html形式:

<spring:url value="/upload?${_csrf.parameterName}=${_csrf.token}" var="formURL"/>
    <form method="post" enctype="multipart/form-data" action="/upload?${_csrf.parameterName}=${_csrf.token}">
...

我仍然收到的例外:

org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided
org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:111)
org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.<init>(StandardMultipartHttpServletRequest.java:85)
org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:76)
org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:112)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

我使用了這個配置:

@Bean
public CommonsMultipartResolver multipartResolver(){
    CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
    commonsMultipartResolver.setMaxInMemorySize(MEMORY_SIZE);
    commonsMultipartResolver.setMaxUploadSize(UPLOAD_SIZE);
    return commonsMultipartResolver;
}

. 如果我沒有創建擴展的類。 盡量不要使用該類並設置上述bean。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM