봄 부팅 2.X (X) : 사용자 정의 등록 서블릿, 필터, 리스너

머리말

등록 할 필요가 봄 콩에 대한 서블릿, 필터, 리스너를 추가 할 경우 봄에서 부팅 web.xml 파일이 제거 된, 봄 부팅의 두 가지 방법이 있습니다 :

  • 서블릿은 주석 @ WebServlet 3.0 API의, @ 웹 필터, @ 수신기 구성 할 수 있습니다.
  • 콩을 구성하는 봄 부팅 JavaConfig 방법을 구성 할 노트.

등록하기 전에

서블릿을 사용하는 경우, 우리는 봄 부팅 @ServletComponentScan 입구 클래스에 주석을 추가 다음 등록 서블릿, 필터, 리스너를 사용하여 스캔하는 봄 부팅을 알 필요가있다.

@SpringBootApplication
@ServletComponentScan
public class SpringBootServletApplication {

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

}

등록 서블릿

1. @ WebServlet 특성

재산 유형 기술
이름 서블릿 이름에 해당 지정
끈[] UrlPatterns 동등한 특성은 동시에 사용되어서는 안
urlPatterns 끈[] 서블릿 URL이 일치하는 패턴의 집합을 지정합니다. 상당 꼬리표
loadOnStartup INT 등가 서블릿 지정된 로딩 시퀀스 꼬리표
initParams WebInitParam [] 서블릿에 등가 초기화 매개 변수 집합을 지정 꼬리표
asyncSupported 부울 동등한 동작 명세서 서블릿 지원 비동기 모드 꼬리표
smallIcon 이 서블릿 작은 아이콘
largeIcon 이 서블릿 큰 아이콘
기술 동등한 서블릿 기술 정보, 꼬리표
이름 표시하기 서블릿의 이름을 표시, 일반적으로 도구의 사용과, 그것과 동일 꼬리표

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. @ 웹 필터 속성

재산 유형 기술
FILTERNAME 필터 이름에 해당 지정
끈[] UrlPatterns 동등한 특성은 동시에 사용되어서는 안
urlPatterns 끈[] 일치하는 패턴의 집합을 지정하는 URL을 필터링합니다. 상당 꼬리표
servletNames 끈[] 필터 서블릿을 지정인가된다. 이름의 값은 @WebServlet 속성, 또는 web.xml에
initParams WebInitParam [] 필터로, 동등한 초기 매개 변수 집합을 지정 꼬리표
dispatcherTypes DispatcherType [] 포함 필터 지정된 전달 모드 : ASYNC, ERROR, FORWARD는 요청을 포함
asyncSupported 부울 문 필터에 해당 작업의 비동기 모드를 지원합니다 꼬리표
smallIcon 이 작은 아이콘을 필터
largeIcon 이 큰 아이콘 필터
기술 에 해당하는 설명 정보를 필터 꼬리표
이름 표시하기 일반적으로 도구를 사용하여, 그것은에 해당, 표시 이름을 필터 꼬리표

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.Filter

  • 브라우저의 캐시 (캐싱 프로세스)를 해제
  • 중국어 왜곡의 문제를 해결
  • 로그인 인증 및 권한 관리
  • 사용자 권한 부여, 사용자의 요청을 확인하기위한 책임이있다, 요청시 요청 불법 사용자를 필터링
  • 日志记录,详细记录某些特殊的用户请求
  • 其他场景

注册 Listener

1.@Listener 属性

属性 类型 描述
value String 侦听器Listener的描述

2.示例

与 ServletContext 相关的监听

Servlet 的监听器 Listener 是实现了 javax.servlet.ServletContextListener 接口的服务器端程序,随着 Web 应用启动而启动,只初始化一次,也随着 Web 应用停止而销毁。其主要作用是做一些初始化的内容添加工作,如参数和对象等。

@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 方法在执行 TestFilter 类的 init 方法,
contextDestroyed 方法在 TestFilter 类 destroy 方法执行后执行。

示例代码

github

码云

非特殊说明,本文版权归 朝雾轻寒 所有,转载请注明出处.

原文标题:Spring Boot 2.X(十):自定义注册 Servlet、Filter、Listener

原文地址:https://www.zwqh.top/article/info/17

如果文章对您有帮助,请扫码关注下我的公众号,文章持续更新中...

추천

출처www.cnblogs.com/zwqh/p/11735755.html