Весеннее делегирование мобильного устройства для статических ресурсов (без тимелина)

Я знаю, что вы можете выполнить делегирование устройства с помощью Spring Mobile для отображений контроллера Thymeleaf, следуя этому руководству: https://spring.io/guides/gs/serving-mobile-web-content/

Добавляя spring.mobile.devicedelegatingviewresolver.enabled: true собственность на ваш application.ymlпредставления будут отображаться на основе шаблонов, расположенных в templates, в teplates/mobile или в templates/tablet ресурсные блоки, основанные на том, какой тип устройства был обнаружен.

Однако, насколько мне известно, это не работает для статических ресурсов, расположенных в src/main/resources/static папка. Я пытался со следующей структурой папок:

└── src
    └── main
        └── resources
            └── static
                └── index.html
                └── mobile
                    └── index.html
                └── tablet
                    └── index.html

После некоторого возни я получил кое-что работающее, добавив специальный фильтр, который оборачивает запрос в HttpServletRequestWrapper, который добавляет префикс планшета или мобильного устройства в servletPath при обнаружении такого устройства.

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

У кого-нибудь есть советы, как сделать это более чистым способом?

Большое спасибо!

PS: код фильтра можно найти ниже

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.mobile.device.Device;
import org.springframework.mobile.device.DeviceResolver;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class DeviceResolutionFilter extends OncePerRequestFilter {

    private static final Logger LOGGER = LogManager.getLogger(DeviceResolutionFilter.class);

    private final DeviceResolver resolver;

    public DeviceResolutionFilter(DeviceResolver resolver) {
        this.resolver = resolver;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest httpRequest, HttpServletResponse httpResponse, FilterChain filterChain) throws ServletException, IOException {
        Device device = resolver.resolveDevice(httpRequest);
        HttpServletRequestWrapper wrapper;
        if (device.isMobile()) {
            wrapper = new HttpServletRequestWrapper(httpRequest) {
                @Override
                public String getServletPath() {
                    return "/mobile" + super.getServletPath();
                }
            };
        } else if (device.isTablet()) {
            wrapper = new HttpServletRequestWrapper(httpRequest) {
                @Override
                public String getServletPath() {
                    return "/tablet" + super.getServletPath();
                }
            };
        } else {
            wrapper = new HttpServletRequestWrapper(httpRequest);
        }
        filterChain.doFilter(wrapper, httpResponse);
    }
}

0 ответов

Другие вопросы по тегам