Закодированная косая черта (% 2F) с параметром пути Spring RequestMapping дает HTTP 400

Если вы используете параметр -onefile (то есть, связывая все в один исполняемый файл), при запуске your_app_name.exe Pyinstaller распаковывает ваши данные во временную папку, и путь устанавливается как sys._MEIPASS.

def path_to_temp(relative_path):
    try:
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)

Таким образом, ваши файлы данных, которые вы указываете в вашем spec-файле, также будут извлечены во временное место при запуске приложения.

a.datas.append(('sqlite.db', 'sqlite.db', 'DATA'))

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

print  base_path

. Теперь вы также увидите файл своей базы данных. Теперь внесите в него некоторые изменения. Затем закройте приложение и запустите его снова. Получите новое временное местоположение и проверьте, не отразились ли сделанные вами изменения. Ответ № Нет, потому что он не переупаковывает извлеченный файл.

Таким образом, файлы данных могут быть такими файлами, как изображения или звуковые файлы или даже файлы базы данных, которые программа не будет изменять.

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

Пример для приложения с использованием sqlite3.

dir_path = os.path.join(os.environ['APPDATA'], 'YOUR_APP_NAME')
if not os.path.exists(dir_path):
     os.makedirs(dir_path)
file_path = os.path.join(dir_path, 'your_database_file.sqlite')
sqlite3.connect(file_path)

Это создаст папку по имени вашего приложения в каталоге AppData\roaming и файл базы данных будет храниться там.

30
задан Community 23 May 2017 в 12:34
поделиться

1 ответ

Обновление 2019 года для Начальной загрузки Spring 2 + / Spring (безопасность) 5 + / Java 8 +:

Как мое редактирование к ответ iamiddy был отклонен, я хочу также предоставить полное решение для Начальной загрузки Spring 2 + как отдельный ответ.

Эти WebMvcConfigurerAdapter удерживается от использования с Spring5 / Java8 и может быть заменен непосредственно с Интерфейсом WebMvcConfigurer окончание с:

@SpringBootApplication
public class Application extends WebMvcConfigurer {

    public static void main(String[] args) throws Exception {
        System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper urlPathHelper = new UrlPathHelper();
        urlPathHelper.setUrlDecode(false);
        configurer.setUrlPathHelper(urlPathHelper);
    }
}

Плюс Вы также должен настроить Spring (Strict)HttpFirewall, чтобы избежать, чтобы блокирование закодированных наклонных черт с Начальной загрузкой Spring сообщения об ошибке The request was rejected because the URL contained a potentially malicious String "%2F"

@Bean
public HttpFirewall allowUrlEncodedSlashHttpFirewall() {
    StrictHttpFirewall firewall = new StrictHttpFirewall();
    firewall.setAllowUrlEncodedSlash(true);    
    return firewall;
}

использовало вышеупомянутое HttpFirewall Боб, когда доступный - иначе могло бы быть необходимо настроить WebSecurity, как упомянуто здесь :

0
ответ дан mineralf 11 October 2019 в 08:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: