Есть GET http://localhost:8088/property/123
или
Есть GET http://localhost:8088/gaz-mas/1722
REST @GetMapping("/property/{id}")
Сделал фильтр который должен проверить в БД есть ли такой id
, прежде чем пропустить дальше.
@WebFilter(filterName = "SecurityRestFilter", urlPatterns = "/property")
public class SecurityRestFilter implements Filter {
@Autowired
PropertyService propertyService;
private final Logger log = LoggerFactory.getLogger(SecurityRestFilter.class);
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws ServletException, IOException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
Long id = (Long) servletRequest.getAttribute("id");
String login = SecurityUtils.getCurrentUserLogin();
if (!propertyService.getPropertyByIdAndPersonalAccount(id, login)) {
response.sendRedirect("/pageNotFound404");
}
chain.doFilter(servletRequest, servletResponse);
}
public void init(FilterConfig config) throws ServletException {
log.debug("Init SecurityRestFilter");
}
}
Проблема заключается в том, что не получается взять этот id
из реста
(property?id=123 - такой вариант знаю, но я не могу изменить передачу id в ресте)
знаю что можно еще задать типа в input id = "id"
, а в фильтре request.getAttribute("id")
но тоже менять формы и добавлять айдишники не желательно
Подскажите, пожалуйста, каким образом можно получить id
?
В данном случае id - это PathVariable. Вместо
Long id = (Long) servletRequest.getAttribute("id");
попробуйте сделать так:
Map pathVariables = (Map) servletRequest.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
Long id = Long.parseLong(pathVariables.get("id"));
Long id = (Long) servletRequest.getAttribute("id");
замените на
Long id = Long.parseLong(servletRequest.getParameter("id"));
Переменные пути доступны в контроллере, выполняющемся с помощью сервлета dispatcher
, но не доступны в фильтре. Поэтому вам надо парсить URL самостоятельно, чтобы извлечь оттуда требуемый параметр. Есть много способов это сделать, например с помощью регулярных выражений.
String path = servletRequest.getRequestPath();
Pattern pattern = Pattern.compile("/property/(\\\d)");
Matcher matcher = pattern.matcher(url);
matcher.find();
String id = matcher.group(1);
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Не могу разобраться уже несколько днейКак реализовать получение результата Android In-app billing в fragment? При совершении тестовой оплаты (после успешной...