Вот пример моего настраиваемого класса фильтра:
package com.dawson.controller.filter;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.GenericFilterBean;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
public class DawsonApiFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
if (req.getHeader("x-dawson-nonce") == null || req.getHeader("x-dawson-signature") == null) {
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setContentType("application/json");
httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, "Required headers not specified in the request");
return;
}
chain.doFilter(request, response);
}
}
И я добавил его в конфигурацию загрузки Spring, добавив его в класс конфигурации следующим образом:
package com.dawson.configuration;
import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
import com.dawson.controller.filter.DawsonApiFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
@SpringBootApplication
public class ApplicationConfiguration {
@Bean
public FilterRegistrationBean dawsonApiFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new DawsonApiFilter());
// In case you want the filter to apply to specific URL patterns only
registration.addUrlPatterns("/dawson/*");
return registration;
}
}
Существуют за и против:
Эта статья касается всего.
Профессионалы GUID
Недостатки GUID
Я записал сообщение об этом на прошлой неделе с некоторым кодом, чтобы показать Вам, что происходит: Некоторый Простой Код Для Показа Различия Между Newid И Newsequentialid
В основном при использовании newid () вместо Newsequentialid () Вы получаете ужасные расщепления страницы, если Ваш PK является кластерным индексом (которым это будет по умолчанию)
Лично, я использовал бы интервал или bigint для PK, но просто вставил бы другой столбец "Guid" для тех ситуаций, где Вы нуждаетесь в неотгадываемом "ключе" для той записи и генерируете Гуид при вставке строки.
Это будет плохо, если необходимо будет сделать соединения по большим наборам (скажем, 100 000 тыс). Там, перенес это.
Более позднее Редактирование: Я также встретился, еще худший провал (не может назвать это "подходом"): хранение GUID в символе (36) столбцы!!
GUID является мощным типом данных для идентификации строки, так как это, как почти гарантируют, будет уникально, это позволяет большую гибкость, например, можно генерировать Гуид на уровне приложений, который может значительно упростить сохранение отношений.
, Как был сказан, большая оборотная сторона является расщеплениями страницы, которые произойдут, если Ваш PK будет кластерным индексом; однако, можно решить это двумя путями. Вы могли использовать NewSequentialId (), или можно установить PK, который будет не кластеризироваться. Я рекомендовал бы создать базу данных на основе требований к данным, и если Вам нужен GUID, используют его и затем оптимизируют вокруг него. И проверьте его производительность в своей среде.
Jimmy Nilsson написал фантастическую статью о GUID по сравнению с INTs и объединил ГУИДЫ . Заключения... не боятся, что GUID... хорошо составляет гуиды так или иначе.
Это - "плохая" идея. Это может быть медленно. Вы это не действительно хорошо для быстрого поиска с индексами также. Единственное реальное время, когда мы используем GUID или UniqueIDs, - когда мы должны связать элементы данных через базы данных, обычно когда у нас есть база данных сервера и локальная база данных для приложения (для разъединенных систем). У Вас действительно нет никакого другого способа держать вещи вместе кроме гуидов. Для индексов и первичных ключей, Вы хотите использовать целочисленное значение и попытку связать вещи с таблицами ассоциации вместо того, чтобы использовать гуиды повсеместно.
Это плохо, если Вы хотите сделать быстрые записи к базе данных. Если Вы собираетесь сделать значительные вставки затем, лучше использовать другой тип данных.
Это может также действительно замедлить Ваши чтения базы данных, потому что первичные ключи создаются с кластерными индексами, если не сказали иначе. Гуид является худшим типом, чтобы иметь как Ваш кластерный индекс и интервал, или bigint служил бы лучшим первичным ключом или кластерным индексом
Я не сказал бы плохой по сути. Я говорил с большим количеством людей, которые клянутся им, хотя я нахожу его немного подробным. Я согласился бы с routeNpingme
и сказал бы, что необходимо использовать регулярное целое число для идентификатора, но также и включать GUID (в котором Вы нуждаетесь для репликации так или иначе), "на всякий случай"
При выполнении какого-либо вида репликации баз данных, GUID являются лучшим другом!
Лучшая причина, которую я нашел для использования их, при тиражировании баз данных. Даже затем могут быть лучшие способы обработать это как многослойные первичные ключи, которые включают идентификатор и возможно местоположение. Если Вам не нужна та возможность, я предлагаю придерживаться некоторой формы целого числа.