Весеннее делегирование мобильного устройства для статических ресурсов (без тимелина)
Я знаю, что вы можете выполнить делегирование устройства с помощью 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);
}
}