Обслуживание sitemap.xml и robots.txt с помощью Spring MVC

Как лучше всего серверировать sitemap.xml и robots.txt с Spring MVC? Я хочу серверировать эти файлы через Controller самым чистым способом.


person michal.kreuzman    schedule 05.09.2012    source источник


Ответы (2)


Я полагаюсь на JAXB для создания файла sitemap.xml для меня.

Мой контроллер выглядит примерно так, как показано ниже, и у меня есть несколько таблиц базы данных для отслеживания ссылок, которые я хочу отображать в карте сайта:

SitemapController.java

@Controller
public class SitemapController {

    @RequestMapping(value = "/sitemap.xml", method = RequestMethod.GET)
    @ResponseBody
    public XmlUrlSet main() {
        XmlUrlSet xmlUrlSet = new XmlUrlSet();
        create(xmlUrlSet, "", XmlUrl.Priority.HIGH);
        create(xmlUrlSet, "/link-1", XmlUrl.Priority.HIGH);
        create(xmlUrlSet, "/link-2", XmlUrl.Priority.MEDIUM);

        // for loop to generate all the links by querying against database
        ...

        return xmlUrlSet;
    }

    private void create(XmlUrlSet xmlUrlSet, String link, XmlUrl.Priority priority) {
        xmlUrlSet.addUrl(new XmlUrl("http://www.mysite.com" + link, priority));
    }

}

XmlUrl.java

@XmlAccessorType(value = XmlAccessType.NONE)
@XmlRootElement(name = "url")
public class XmlUrl {
    public enum Priority {
        HIGH("1.0"), MEDIUM("0.5");

        private String value;

        Priority(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }
    }

    @XmlElement
    private String loc;

    @XmlElement
    private String lastmod = new DateTime().toString(DateTimeFormat.forPattern("yyyy-MM-dd"));

    @XmlElement
    private String changefreq = "daily";

    @XmlElement
    private String priority;

    public XmlUrl() {
    }

    public XmlUrl(String loc, Priority priority) {
        this.loc = loc;
        this.priority = priority.getValue();
    }

    public String getLoc() {
        return loc;
    }

    public String getPriority() {
        return priority;
    }

    public String getChangefreq() {
        return changefreq;
    }

    public String getLastmod() {
        return lastmod;
    }
}

XmlUrlSet.java

@XmlAccessorType(value = XmlAccessType.NONE)
@XmlRootElement(name = "urlset", namespace = "http://www.sitemaps.org/schemas/sitemap/0.9")
public class XmlUrlSet {

    @XmlElements({@XmlElement(name = "url", type = XmlUrl.class)})
    private Collection<XmlUrl> xmlUrls = new ArrayList<XmlUrl>();

    public void addUrl(XmlUrl xmlUrl) {
        xmlUrls.add(xmlUrl);
    }

    public Collection<XmlUrl> getXmlUrls() {
        return xmlUrls;
    }
}

Для robots.txt это выглядит примерно так, как показано ниже, и, очевидно, вам нужно будет настроить его по своему вкусу:

RobotsController.java

@Controller
public class RobotsController {

    @RequestMapping(value = "/robots.txt", method = RequestMethod.GET)
    public String getRobots(HttpServletRequest request) {
        return (Arrays.asList("mysite.com", "www.mysite.com").contains(request.getServerName())) ?
                "robotsAllowed" : "robotsDisallowed";
    }
}
person limc    schedule 05.09.2012
comment
Спасибо за хороший ответ, я немного подожду с закрытием вопроса, чтобы увидеть, будут ли другие люди вносить свой вклад ... - person michal.kreuzman; 06.09.2012
comment
Вам нужно будет убедиться, что эти методы контроллера сильно закешированы. Обычно эти запросы не должны даже попадать на сервер приложений, а вместо этого обслуживаются apache как статический контент. - person Solubris; 06.09.2012
comment
@Lithium Также хорошая идея, что вы можете разместить его как ответ вместо чата. В любом случае мне нужно, чтобы мой sitemap.xml создавался динамически, но для роботов этого должно быть больше, чем необходимо. - person michal.kreuzman; 06.09.2012
comment
Я написал, как я это делаю, в качестве ответа здесь: stackoverflow.com/a/34939877/1410035. Он использует sitemapgen4j: github.com/dfabulich/sitemapgen4j - person Tom Saleeba; 22.01.2016
comment
Если кто-то получает ‹ns2:urlset› ‹/ns2:urlset› в сгенерированном XML, проверьте этот ответ stackoverflow.com/a/43517159/ 1583815 - person Piyush; 20.04.2017
comment
цикл for для генерации всех ссылок путем запроса к базе данных ?? можешь пожалуйста написать пример - person Cesar; 20.01.2020
comment
Очень здорово и очень полезно, большое спасибо. - person Michael Hegner; 14.03.2020

Добавьте эту строку в XML-файл сервлета диспетчера:

<mvc:resources mapping="/robots.txt" location="/WEB-INF/robots.txt" order="0"/> 

Поместите robots.txt в WEB-INF/robots.txt. Файл будет доступен по адресу yoursite.com/robots.txt.

person v0ld3m0rt    schedule 06.06.2019