Статический контент Spring 4, такой как css / js, вызывает ошибку 405 Метод запроса GET не поддерживается

Я проверил эту проблему, но после 4 часов пробования многих вещей у меня ничего не работало.

Я получаю ошибку 405 при попытке доступа к моему файлу css. Вот мой Config.java

package com.myapp.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.JstlView;
import org.springframework.web.servlet.view.UrlBasedViewResolver;

@Configuration
@ComponentScan("com.myapp")
@EnableWebMvc
@EnableTransactionManagement
public class Config extends WebMvcConfigurerAdapter {

    @Bean
    public UrlBasedViewResolver setupViewResolver() {
        UrlBasedViewResolver resolver = new UrlBasedViewResolver();
        resolver.setPrefix("/WEB-INF/jsp/");
        resolver.setSuffix(".jsp");
        resolver.setViewClass(JstlView.class);
        return resolver;
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/","/css/","/js/");

    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

}

и структура справочников:

META-INF
WEB-INF
resources
    |-css
    |  |-myapp.css
    |-js
       |-myapp.js

Использование netbeans в качестве IDE. Я также пытался найти каталог ресурсов в WEB-INF. Те же результаты.

Изменить: мой контроллер по умолчанию ниже

@RequestMapping(value = "/", method = RequestMethod.GET)
public String index(ModelMap map) {
    map.put("msg", "Hello Spring 4 Web MVC!");
    return "index";
}

Изменить 2: вот мой WebinItalizer

public class WebInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {        
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();  
        ctx.register(Config.class);  
        ctx.setServletContext(servletContext);    
        Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));  
        servlet.addMapping("/");
        servlet.setLoadOnStartup(1);
    }
}

в этом инициализаторе, если я использую "/" для servlet.addMapping ("/"), я не могу получить доступ к CSS. Но если я изменю его на что-то другое, например servlet.addMapping ("/ app"), я могу получить доступ к css. Но проблема, если я сделаю это, будет в том, что весь мой URL-адрес будет начинаться с приложения / не очень круто: /


person Rony    schedule 10.02.2017    source источник
comment
Какой URL файла дает 405?   -  person Christopher Schneider    schedule 10.02.2017
comment
локальный: 8084 / myapp / ресурсы / css / myapp.css   -  person Rony    schedule 10.02.2017
comment
и каталог ресурсов находится в корне войны со всеми моими файлами css и js   -  person Rony    schedule 10.02.2017
comment
localhost:8084/myapp/resources/css/myapp.css ‹- По крайней мере, вы ошибаетесь, когда вызываете статические ресурсы. Это должно понравиться http://ocalhost:8084/myapp/css/myapp.css   -  person Do Nhu Vy    schedule 10.02.2017
comment
Да, я пробовал все из них (/myapp/myapp.css, /myapp/css/myapp.css), но все равно получаю ошибку 405. Но у меня есть этот контроллер по умолчанию (я редактировал свой исходный пост). Как вы думаете, мой контроллер по умолчанию может помешать мне получить доступ к моему CSS?   -  person Rony    schedule 10.02.2017
comment
Я обновился с помощью своего WebInitializer. Я не использую Spring boot, я использую Spring 4. У меня нет XML-файла в моем приложении, кроме них нет другого файла конфигурации.   -  person Rony    schedule 10.02.2017
comment
Разве аргументы addResourceLocations не следует читать "/resources/css/","/resources/js/"?   -  person crizzis    schedule 10.02.2017
comment
@crizzis Я тоже пробовал. Но я определенно думаю, что servlet.addMapping (/) в моем WebInitializer блокирует все запросы к css. Я не знаю, почему мой resourceHandler не может разрешить путь: /   -  person Rony    schedule 10.02.2017
comment
@ChristopherSchneider, если у вас есть решение, опубликуйте его в любом случае. Я сделаю это, потому что я не могу обойтись без этого, или мне придется сделать грязный хакер. Но один вопрос, это нормально с Srping? Я видел много людей, которые пытались решить эту проблему, но мне кажется, что я единственный, кто не может ее решить: /   -  person Rony    schedule 10.02.2017
comment
У Spring довольно крутая кривая обучения, если вы об этом спрашиваете, и довольно часто можно застрять. Мне потребовалось несколько месяцев работы с ним почти на полную ставку, чтобы действительно стать профессионалом.   -  person Christopher Schneider    schedule 10.02.2017
comment
Я приложил немного усилий к своему ответу. Это ответило на ваш вопрос? Я также могу попытаться уточнить, если что-то не имело смысла.   -  person Christopher Schneider    schedule 12.02.2017
comment
@ChristopherSchneider Извините за поздний ответ, вчера я пробовал что-то новое, чтобы заставить его работать. Единственное, что я нашел, - это добавить все контроллеры, которые у меня есть в WebInitializer, например, servlet.addMapping (/ login); servlet.addMapping (/ регистр); servlet.addMapping (/ test); Я не знаю, распространено ли это у Srping. Единственная проблема: теперь localhost: 8084 / myapp приводит к ошибке 404.   -  person Rony    schedule 12.02.2017


Ответы (2)


Во-первых, если это неверно, извините. Я часто использую Spring, но обычно это только конфигурация XML.

Начнем здесь:

     registry.addResourceHandler("/resources/**")
             .addResourceLocations("/resources/","/css/","/js/");

Это говорит о том, что «когда я запрашиваю что-то с путем http://localhost/resources/**, посмотрите /resources/, /css/ или /js/.

Ну, /css/ и /js/ не существуют. Только /resources/ умеет.

В этом случае вам следует сопоставить это

registry.addResourceHandler("/resources/**")
                 .addResourceLocations("/resources/");

И получите доступ таким образом:

<script src="/resources/js/myapp.js"></script>

В качестве альтернативы вы можете просто сделать это:

registry.addResourceHandler("/js/**")
                 .addResourceLocations("/resources/js/");
registry.addResourceHandler("/css/**")
                 .addResourceLocations("/resources/css/");

и получить доступ к статическому контенту следующим образом:

<script src="/js/myapp.js"></script>

Что касается того, почему сработало изменение корневого контекста, это связано с этим:

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}

Это пытается направить запросы статического содержимого через сервлет по умолчанию с корневым контекстом /. Поскольку вы создаете свой DispatcherServlet в /, сервлет по умолчанию никогда не будет задействован, поскольку по умолчанию для него установлен самый низкий приоритет.

Если вы используете registry.addResourceHandler, вам не нужно настраивать сервлет по умолчанию, и наоборот. Как вы обнаружили, вы никогда не попадаете в него, так как по умолчанию это самый низкий приоритет.

Если у вас все еще есть проблемы, даже после исправления ResourceHandler, вы можете попробовать полностью опустить конфигурацию обработчика ресурсов или установить для сервлета по умолчанию более высокий приоритет (что я бы не рекомендовал).

person Christopher Schneider    schedule 10.02.2017
comment
Привет Спасибо за ответ. Это не сработало, я загрузил в github github.com/ronyyu/myapp, чтобы вы может лучше видно, если я где-то ошибся. - person Rony; 12.02.2017
comment
Я следовал этому руководству, чтобы создать свое приложение outbottle.com/ - person Rony; 12.02.2017
comment
Извините, я так и не ответил. Просто не было времени. Судя по всему, я предполагаю, что ваша папка ресурсов находится не в том месте. Вы получили это в src/main/webapp/resources. Стандарт вообще src/main/resources. - person Christopher Schneider; 08.03.2017

Следующее решение сработало для меня. Я добавил обработчики ресурсов в свой класс конфигурации, который расширяет WebMvcConfigurerAdapter.

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

Затем я импортировал свой файл bootstrap.min.js в свой jsp, как показано ниже:

<script type="text/javascript" src="<c:url value="/bootstrap/js/bootstrap.min.js"/>" ></script>

Обратите внимание, что папка начальной загрузки, указанная в Resourcehandler, находится в папке WebContent.

Изменить:

Посмотрев на ваш код в GitHub, я ясно вижу, что в вашем обработчике ресурсов есть лишний *. Это должно выглядеть так:

Ясно, что я не вижу, чтобы вы использовали <c:url> в своем jsp. Выполните следующие действия и посмотрите, работает ли это:

  1. Удалите лишний * из обработчика ресурсов, как показано ниже:

registry.addResourceHandler ("/ ресурсы / **"). addResourceLocations ("/ ресурсы /");

  1. В вашем index.jsp файле измените теги ссылки и скрипта, чтобы они выглядели следующим образом:

<script type="text/javascript" src="<c:url value="/resources/js/js.js"/>" ></script>
<link rel="stylesheet" href="<c:url value="/resources/css/site.css"/>"  type="text/css">

Больше не используйте контекстный путь ${cp} для тегов скриптов и ссылок. <c:url> - причина, по которой у меня это сработало.

person Ashish    schedule 14.02.2017
comment
Я тоже пробовал это. У меня это не сработало. Вы можете найти мой источник здесь: github.com/ronyyu/myapp - person Rony; 15.02.2017
comment
Ага! Я уже пытался удалить лишний «», но он все равно не работает. Я поставил xtra '', потому что отчаялся и перепробовал все. Я все еще не могу получить доступ к CSS. Это странно, потому что я все следил, и моя конфигурация кажется правильной. Единственный способ получить доступ к css / js - это поместить весь мой контроллер в веб-инициализатор следующим образом: servlet.addMapping (/ login); servlet.addMapping (/ регистр); но проблема в том, что у меня нет доступа к /. - person Rony; 15.02.2017