Взятие id из GET запроса

173
07 ноября 2018, 15:50

Есть 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?

Answer 1

В данном случае 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"));
Answer 2
Long id = (Long) servletRequest.getAttribute("id");

замените на

Long id = Long.parseLong(servletRequest.getParameter("id"));
Answer 3

Переменные пути доступны в контроллере, выполняющемся с помощью сервлета dispatcher, но не доступны в фильтре. Поэтому вам надо парсить URL самостоятельно, чтобы извлечь оттуда требуемый параметр. Есть много способов это сделать, например с помощью регулярных выражений.

String path = servletRequest.getRequestPath();
Pattern pattern = Pattern.compile("/property/(\\\d)");
Matcher matcher = pattern.matcher(url);
matcher.find();        
String id = matcher.group(1);
READ ALSO
Как реализовать получение результата Android In-app billing в fragment?

Как реализовать получение результата Android In-app billing в fragment?

Не могу разобраться уже несколько днейКак реализовать получение результата Android In-app billing в fragment? При совершении тестовой оплаты (после успешной...

159
Хранение файлов на сервере java

Хранение файлов на сервере java

Загружаю файл на сервер java

189
Почему @RequestParam отсутствует

Почему @RequestParam отсутствует

есть метод который вернет ответы с помощью id

214