предисловие
Файл 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.
образец кода
Если не указано иное, авторские права на эту статью принадлежатутренний туманВсе, пожалуйста, указывайте источник при перепечатке.
Оригинальное название: Spring Boot 2.X (десять): сервлет пользовательской регистрации, фильтр, прослушиватель
Оригинальный адрес: https://www.zwqh.top/article/info/17
Если статья была вам полезна, отсканируйте код и подпишитесь на мой официальный аккаунт, статья постоянно обновляется...