SpringBoot无法访问中文路径文件

SpringBoot中文路径映射访问400

SpringBoot项目如果路径中带有中文或者文件名带有中文会返回400报错,shiro版本的问题,解决方案如下:

1.自定义过滤器

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.filter.InvalidRequestFilter;
import org.apache.shiro.web.filter.mgt.DefaultFilter;
import org.apache.shiro.web.filter.mgt.FilterChainManager;
import org.apache.shiro.web.filter.mgt.FilterChainResolver;
import org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver;
import org.apache.shiro.web.mgt.WebSecurityManager;
import org.apache.shiro.web.servlet.AbstractShiroFilter;
import org.apache.shiro.mgt.SecurityManager;
import org.springframework.beans.factory.BeanInitializationException;
import javax.servlet.Filter;
import java.util.Map;

/**
 * 自定义ShiroFilterFactoryBean解决资源中文路径问题
 *
 * @author ruoyi
 */
public class CustomShiroFilterFactoryBean extends ShiroFilterFactoryBean
{
    @Override
    public Class<MySpringShiroFilter> getObjectType()
    {
        return MySpringShiroFilter.class;
    }

    @Override
    protected AbstractShiroFilter createInstance() throws Exception
    {

        SecurityManager securityManager = getSecurityManager();
        if (securityManager == null)
        {
            String msg = "SecurityManager property must be set.";
            throw new BeanInitializationException(msg);
        }

        if (!(securityManager instanceof WebSecurityManager))
        {
            String msg = "The security manager does not implement the WebSecurityManager interface.";
            throw new BeanInitializationException(msg);
        }

        FilterChainManager manager = createFilterChainManager();
        // Expose the constructed FilterChainManager by first wrapping it in a
        // FilterChainResolver implementation. The AbstractShiroFilter implementations
        // do not know about FilterChainManagers - only resolvers:
        PathMatchingFilterChainResolver chainResolver = new PathMatchingFilterChainResolver();
        chainResolver.setFilterChainManager(manager);

        Map<String, Filter> filterMap = manager.getFilters();
        Filter invalidRequestFilter = filterMap.get(DefaultFilter.invalidRequest.name());
        if (invalidRequestFilter instanceof InvalidRequestFilter)
        {
            // 此处是关键,设置false跳过URL携带中文400,servletPath中文校验bug
            ((InvalidRequestFilter) invalidRequestFilter).setBlockNonAscii(false);
        }
        // Now create a concrete ShiroFilter instance and apply the acquired SecurityManager and built
        // FilterChainResolver. It doesn't matter that the instance is an anonymous inner class
        // here - we're just using it because it is a concrete AbstractShiroFilter instance that accepts
        // injection of the SecurityManager and FilterChainResolver:
        return new MySpringShiroFilter((WebSecurityManager) securityManager, chainResolver);
    }

    private static final class MySpringShiroFilter extends AbstractShiroFilter
    {
        protected MySpringShiroFilter(WebSecurityManager webSecurityManager, FilterChainResolver resolver)
        {
            if (webSecurityManager == null)
            {
                throw new IllegalArgumentException("WebSecurityManager property cannot be null.");
            }
            else
            {
                this.setSecurityManager(webSecurityManager);
                if (resolver != null)
                {
                    this.setFilterChainResolver(resolver);
                }
            }
        }
    }
}

2.替换ShiroConfig.java中的过滤器配置为自定义配置类
shiroFilterFactoryBean方法中,将

ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

替换为:

CustomShiroFilterFactoryBean shiroFilterFactoryBean = new CustomShiroFilterFactoryBean();

再次访问正常

SpringBoot中,我们可以使用数据库存储文件路径的方式来管理文件。下面是一种简单的实现方法: 首先,我们需要创建一个数据库表,用来存储文件的相关信息,例如文件ID、文件名、文件路径等字段。这个表可以使用MySQL或者其他关系型数据库来创建。 接下来,在我们的SpringBoot应用中,我们可以使用JPA(Java Persistence API)来操作数据库。我们需要定义一个实体类,与数据库表对应,包含文件的相关字段。同时,我们还可以创建一个Repository接口,用来定义对该实体类的操作方法。 在上传文件的时候,我们可以使用SpringMVC的MultipartFile对象来接收文件并保存到指定的文件夹中。然后,我们将文件的相关信息插入到数据库中,包括文件名和文件路径等。可以使用文件路径的绝对路径或者相对路径,具体取决于我们的需求。 当需要访问文件时,我们可以通过文件的ID或者其他相关字段来从数据库中查询到文件路径。然后,我们可以使用Java NIO或者其他文件处理工具来读取文件内容或者进行其他操作。 同时,为了提高系统性能和安全性,我们还可以考虑对上传的文件进行一些处理,例如限制文件的类型和大小、生成文件下载链接、进行文件的压缩等。 总结起来,使用SpringBoot存储文件路径到数据库的方法主要包括创建数据库表、定义实体类和Repository接口、使用MultipartFile对象保存文件、将文件信息插入到数据库中、根据文件ID或其他字段查询文件路径、使用文件处理工具读取文件内容。这种方法可以方便地对文件进行管理,同时也能够提高系统的性能和安全性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值