Ниже приведен пример одного метода включения настраиваемого фильтра в приложение Spring Boot MVC. Не забудьте включить пакет в сканирование компонентов:
package com.dearheart.gtsc.filters;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
@Component
public class XClacksOverhead implements Filter {
public static final String X_CLACKS_OVERHEAD = "X-Clacks-Overhead";
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader(X_CLACKS_OVERHEAD, "GNU Terry Pratchett");
chain.doFilter(req, res);
}
@Override
public void destroy() {}
@Override
public void init(FilterConfig arg0) throws ServletException {}
}
В Windows это немного сложно. На самом деле различие между консольным приложением и приложением с графическим интерфейсом - это отдельный флаг в заголовке PE. Вы можете легко писать консольные приложения, которые создают окна, но таким образом у вас всегда есть окно консоли (хотя вы можете его скрыть, но это не будет хорошо, когда люди запускают вашу программу из cmd
).
Вы можете, , однако, написать приложение с графическим интерфейсом, которое создает консоль при необходимости, используя функцию AllocConsole
:
Процесс может быть связан только с одной консолью, поэтому функция AllocConsole завершается ошибкой, если вызывающий процесс уже имеет консоль. Процесс может использовать функцию FreeConsole , чтобы отсоединиться от своей текущей консоли, затем он может вызвать AllocConsole для создания новой консоли или AttachConsole для подключения к другой консоли.
Если вызывающий процесс создает дочерний процесс, дочерний процесс наследует новую консоль.
AllocConsole инициализирует стандартный ввод, стандартный вывод и стандартные дескрипторы ошибок для новой консоли. Стандартный дескриптор ввода - это дескриптор буфера ввода консоли, а стандартные дескрипторы вывода и стандартные ошибки - дескрипторы буфера экрана консоли. Чтобы получить эти дескрипторы, используйте функцию GetStdHandle .
Эта функция в основном используется приложением с графическим пользовательским интерфейсом для создания окна консоли. Приложения с графическим интерфейсом инициализируются без консоли. Консольные приложения инициализируются консолью, если они не созданы как отдельные процессы (путем вызова функции CreateProcess с флагом DETACHED_PROCESS).
Однако при запуске из cmd
это, скорее всего, вызовет появление другого окна консоли вместо повторного использования существующего. Я не знаю, существует ли там хорошее решение.
Windows имеет разные значения в заголовке исполняемого файла для консоли и приложения пользовательского интерфейса (подробнее см. здесь ). Поэтому кажется невозможным сделать один и тот же исполняемый файл для работы в обоих режимах.
В качестве альтернативы вы можете открыть консоль в своем приложении пользовательского интерфейса, но это будет новая консоль, а не та, с которой вы запустили приложение.
ИМО, лучший подход здесь - иметь невизуальные классы, которые фактически выполняют работу программы. Затем вы можете вызвать это из программы с графическим интерфейсом, а также вы можете вызвать его из отдельной программы командной строки. Обе программы являются просто оболочкой для функциональности вашего класса (ов).
Это заставляет дизайн также быть чистым - ваши классы обязательно отделены от уровня GUI вашего приложения.