Spring Boot 2.X (десять): настраиваемый сервлет регистрации, фильтр, прослушиватель

Spring Boot

предисловие

Файл web.xml был удален в Spring Boot.Если вам нужно зарегистрировать и добавить Servlet, Filter и Listener в качестве Spring Bean, в Spring Boot есть два способа:

  • Используйте аннотации API Servlet 3.0 @WebServlet, @WebFilter, @Listener для настройки.
  • Аннотация Spring Boot JavaConfig настраивает bean-компонент для его настройки.

перед регистрацией

При использовании Servlet вам необходимо добавить аннотацию @ServletComponentScan в класс записи Spring Boot, чтобы указать Spring Boot сканировать и использовать Servlet, Filter и Listener, зарегистрированные ниже.

@SpringBootApplication
@ServletComponentScan
public class SpringBootServletApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringBootServletApplication.class, args);
	}

}

Регистрация сервлетов

1. Атрибут @WebServlet

Атрибуты Типы описывать
name String Укажите имя сервлета, которое эквивалентно
value String[] Эквивалентно свойству urlPatterns, оба не должны использоваться вместе.
urlPatterns String[] Указывает шаблон сопоставления URL для набора сервлетов. Эквивалент ярлыка
loadOnStartup int Указывает порядок загрузки сервлетов, эквивалентный тегу
initParams WebInitParam[] Задает набор параметров инициализации сервлета, эквивалентных тегам.
asyncSupported boolean Укажите, поддерживает ли сервлет асинхронный режим работы, эквивалентный тегу
smallIcon String Маленькая иконка для этого сервлета
largeIcon String Большой значок для этого сервлета
description String Описание сервлета, эквивалентное метке
displayName String Отображаемое имя сервлета, обычно используемое с инструментами, эквивалентное метке

2. Пример

@WebServlet(urlPatterns = "/TestServlet")
public class TestServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = -3325041776508043481L;

	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		doPost(req, resp);
	}
    /*
    *  实现请求uri和header打印,另外返回一个json
    */
	@Override
	public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		System.out.println("RequestURI:" + req.getRequestURI());

		System.out.println("Request Headers:");

		StringBuilder sb = new StringBuilder();
		Enumeration<?> names = req.getHeaderNames();
		while (names.hasMoreElements()) {
			String name = names.nextElement().toString();
			Enumeration<?> hs = req.getHeaders(name);
			sb.append(name).append(":");
			while (hs.hasMoreElements()) {
				sb.append(hs.nextElement()).append(";");
			}
		}
		System.out.println(sb);
		
		ObjectMapper om=new ObjectMapper();
		UserEntity user=new UserEntity();
		user.setId(1L);
		user.setUserName("zwqh");
		user.setUserSex("男");
		user.setHeaders(sb.toString());
		String resultJson=om.writeValueAsString(user);

		resp.setContentType("application/json;charset=UTF-8");
		
		resp.getWriter().print(resultJson);
	}

}

Где @WebServlet(urlPatterns = "/TestServlet") эквивалентен следующему коду:

<servlet>
<!-- 类名 -->
<servlet-name> TestServlet </servlet-name>
<!-- 所在的包 -->
<servlet-class> cn.zwqh.springbboot.servlet.TestServlet </servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name> TestServlet </servlet-name>
   <!-- 访问的url路径地址 -->
   <url-pattern> /TestServlet </url-pattern>
</servlet-mapping>

3. Тест

доступ через браузерhttp://127.0.0.1:8080/TestServlet

вывод журнала:

Регистрация Фильтр

1. Свойство @WebFilter

Атрибуты Типы описывать
filterName String Укажите имя фильтра, которое эквивалентно
value String[] Эквивалентно свойству urlPatterns, оба не должны использоваться вместе.
urlPatterns String[] Указывает набор шаблонов сопоставления URL-адресов фильтра. Эквивалент ярлыка
servletNames String[] Указывает, к каким сервлетам будет применяться фильтр. Значением является атрибут имени в @WebServlet или значение в web.xml.
initParams WebInitParam[] Укажите набор параметров инициализации фильтра, эквивалентных меткам
dispatcherTypes DispatcherType[] Укажите режим пересылки Фильтра, в том числе: ASYNC, ERROR, FORWARD, INCLUDE, REQUEST.
asyncSupported boolean Указывает, поддерживает ли фильтр асинхронный режим работы, эквивалентный метке
smallIcon String Маленькая иконка для этого фильтра
largeIcon String Большой значок для этого фильтра
description String Описание Фильтра, эквивалентное метке
displayName String Отображаемое имя фильтра, обычно используемое с инструментами, эквивалентно метке

2. Пример

@WebFilter(urlPatterns = { "/TestServlet" }) // 注册拦截器,并添加拦截路径‘/TestServlet’
public class TestFilter implements Filter {

	/**
	 * 初始化,只在项目启动的时候执行一次
	 */
	@Override
	public void init(FilterConfig filterConfig) {
		System.out.println("===> TestFilter init");
	}
	/**
	* 用于存放过滤器的业务逻辑实现代码
	*/
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {

		chain.doFilter(request, response);// 处理请求和响应的分界线
		System.out.println("===> chain.doFilter 后执行处理 response 的相关方法");
		// 在response header里设置一个token
		setToken(response);

	}

	private void setToken(ServletResponse response) {
		HttpServletResponse res = (HttpServletResponse) response;
		String token = UUID.randomUUID().toString();
		res.setHeader("Token", token);
		System.out.println("===> 设置了token:" + token);
	}

	/**
	 * 销毁,在项目关闭,Servlet 容器销毁前调用
	 */
	@Override
	public void destroy() {
		System.out.println("===> TestFilter destroy");
	}

}

3. Тест

доступ через браузерhttp://127.0.0.1:8080/TestServlet:

печать журнала:

4. Отфильтруйте основные сценарии использования

  • Отключить кеш браузера (обработка кеша)
  • Решить проблему искаженных китайских иероглифов
  • Аутентификация при входе и управление полномочиями
  • Авторизация пользователя, отвечающая за проверку запросов пользователей и фильтрацию незаконных запросов пользователей на основе запросов.
  • Ведение журнала, которое подробно записывает некоторые специальные запросы пользователей.
  • другие сцены

Зарегистрировать слушателя

1. Свойство @Listener

Атрибуты Типы описывать
value String Описание слушателя

2. Пример

Слушатели, связанные с ServletContext

Слушатель сервлета Слушатель — это серверная программа, реализующая интерфейс javax.servlet.ServletContextListener, которая запускается при запуске веб-приложения, инициализируется только один раз и уничтожается при остановке веб-приложения. Его основная функция — добавить некоторый инициализированный контент, такой как параметры и объекты.

@WebListener
public class ContextListener implements ServletContextListener, ServletContextAttributeListener{

	public static final String INITIAL_CONTENT = "Content created in servlet Context";

	/**
	 * ServletContext创建
	 */
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("===> context initialized");
		ServletContext servletContext = sce.getServletContext();
		servletContext.setAttribute("content", INITIAL_CONTENT);
	}

	/**
	 * ServletContext销毁
	 */
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("===> context destroyed");
	}

	/**
	 * context属性新增
	 */
	@Override
	public void attributeAdded(ServletContextAttributeEvent scae) {
		System.out.println("===> context attribute added");
	}

	/**
	 * context属性移除
	 */
	@Override
	public void attributeRemoved(ServletContextAttributeEvent scae) {
		System.out.println("===> context attribute removed");
	}

	/**
	 * context属性替换
	 */
	@Override
	public void attributeReplaced(ServletContextAttributeEvent scae) {
		System.out.println("===> context attribute replaced");
	}
}
Слушатели, связанные с HttpSession
@WebListener
public class SessionListener implements HttpSessionListener, HttpSessionIdListener, HttpSessionAttributeListener,
		HttpSessionActivationListener {

	/**
	 * session被创建时
	 */
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		System.out.println("===> session created");
	}

	/**
	 * session被销毁时
	 */
	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		System.out.println("===> session destroyed");
	}

	/**
	 * sessionId改变
	 */
	@Override
	public void sessionIdChanged(HttpSessionEvent se, String oldSessionId) {
		System.out.println("===> session id changed");
	}

	/**
	 * session属性新增
	 */
	@Override
	public void attributeAdded(HttpSessionBindingEvent se) {
		System.out.println("===> session attribute added");
	}

	/**
	 * session属性移除
	 */
	@Override
	public void attributeRemoved(HttpSessionBindingEvent se) {
		System.out.println("===> session attribute removed");
	}

	/**
	 * session属性替换
	 */
	@Override
	public void attributeReplaced(HttpSessionBindingEvent se) {
		System.out.println("===> session attribute replaced");
	}
	/**
	 * session的钝化,内存的数据写入到硬盘上的过程。
	 */
	@Override
	public void sessionWillPassivate(HttpSessionEvent se) {
		System.out.println("===> session will passivate");
	}
	/**
	 * session的活化,将硬盘的数据恢复到内存中。
	 */
	@Override
	public void sessionDidActivate(HttpSessionEvent se) {
		System.out.println("===> session did activate");
	}

}
Слушатели, связанные с ServletRequest
@WebListener
public class RequestListener implements ServletRequestListener,ServletRequestAttributeListener {
	/**
	 * 请求即将进入Web应用程序的范围/请求初始化时
	 */
	@Override
	public void requestInitialized(ServletRequestEvent sre) {
		System.out.println("===> request initialized");
	}
	/**
	 * 请求即将进入Web应用程序的范围/请求销毁时
	 */
	@Override
	public void requestDestroyed(ServletRequestEvent sre) {
		System.out.println("===> request destroyed");
	}
	/**
	 * request属性新增
	 */
	@Override
	public void attributeAdded(ServletRequestAttributeEvent srae) {
		System.out.println("===> request attribute added");
	}
	/**
	 * request属性移除
	 */
	@Override
	public void attributeRemoved(ServletRequestAttributeEvent srae) {
		System.out.println("===> request attribute removed");
	}
	/**
	 * request属性替换
	 */
	@Override
	public void attributeReplaced(ServletRequestAttributeEvent srae) {
		System.out.println("===> request attribute replaced");
	}
}

3. Вход в журнал, связанный с проектом (запуск и остановка)

Сначала выполните метод contextInitialzed перед выполнением метода init класса TestFilter, Метод contextDestroyed выполняется после выполнения метода destroy класса TestFilter.

образец кода

github

Облако кода

Если не указано иное, авторские права на эту статью принадлежатутренний туманВсе, пожалуйста, указывайте источник при перепечатке.

Оригинальное название: Spring Boot 2.X (десять): сервлет пользовательской регистрации, фильтр, прослушиватель

Оригинальный адрес: https://www.zwqh.top/article/info/17

Если статья была вам полезна, отсканируйте код и подпишитесь на мой официальный аккаунт, статья постоянно обновляется...