Обслужване на 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