[Integration] Examples of listeners, interceptors, and filters



Listener implementation



SpringMC custom listener needs to implement the ServletContextListener interface

package com.my.dm.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.my.dm.service.DeviceService;

public class TestListener implements ServletContextListener {
    
    
    private Logger logger = LogManager.getLogger(TestListener.class);

    /**
     * 当容器启动完成之后
     */
    @Override
    public void contextInitialized(ServletContextEvent sce) {
    
    
        // TODO Auto-generated method stub
        ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext());

        DeviceService deviceService = ac.getBean(DeviceService.class);
        logger.error("This is test for TestListener!");
        logger.error(deviceService.getDeviceByNameIp("", "4.154.135.74").get(0));
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
    
    
        // TODO Auto-generated method stub

    }

}

Using listeners in Spring Boot

/**
 * 使用 HttpSessionListener 统计在线用户数的监听器
 * @author shengwu ni
 * @date 2018/07/05
 */
@Component
public class MyHttpSessionListener implements HttpSessionListener {
    
    

    private static final Logger logger = LoggerFactory.getLogger(MyHttpSessionListener.class);

    /**
     * 记录在线的用户数量
     */
    public Integer count = 0;

    @Override
    public synchronized void sessionCreated(HttpSessionEvent httpSessionEvent) {
    
    
        logger.info("新用户上线了");
        count++;
        httpSessionEvent.getSession().getServletContext().setAttribute("count", count);
    }

    @Override
    public synchronized void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
    
    
        logger.info("用户下线了");
        count--;
        httpSessionEvent.getSession().getServletContext().setAttribute("count", count);
    }
}

Interceptor instance

Examples of interceptors in SpringMVC

package com.ego.cart.interceptor;

import com.ego.common.pojo.EgoResult;
import com.ego.common.utils.CookieUtils;
import com.ego.common.utils.HttpClientUtil;
import com.ego.common.utils.JsonUtils;
import com.ego.pojo.TbUser;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {
    
    

   public final static ThreadLocal<EgoResult> threadLocal = new ThreadLocal<>();


    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
    
    
        String token = CookieUtils.getCookieValue(httpServletRequest, "TT_TOKEN");
        if(token!=null && !token.equals("")){
    
    
            String json = HttpClientUtil.doPost("http://localhost:8084/user/token/"+token);
            EgoResult er = JsonUtils.jsonToPojo(json, EgoResult.class);
            if(er.getStatus() == 200){
    
    
                threadLocal.set(er);
                return true;
            }
        }
        String num = httpServletRequest.getParameter("num");

        httpServletResponse.sendRedirect("http://localhost:8084/user/showLogin?interurl=" + httpServletRequest.getRequestURL() +"%3Fnum=" + num);;
        return false;
    }

    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
    
    

    }

    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
    
    

    }
}

<!-- 拦截器 -->
<mvc:interceptors>
	<bean class="com.ego.cart.interceptor.LoginInterceptor"></bean>		
</mvc:interceptors>

SpringBoot interceptor example

package com.leyou.cart.interceptor;
/**
 * @Project leyou
 * @Package com.leyou.cart.interceptor
 * @author Administrator
 * @date 2020/6/11 18:32
 * @version V1.0
 */

import com.leyou.cart.config.JwtProperties;
import com.leyou.common.entity.UserInfo;
import com.leyou.common.utils.JwtUtils;
import com.leyou.utils.CookieUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author Administrator
 * @ClassName UserInterceptor
 * @Description 用户信息拦截器
 * @date 2020/6/11 18:32
 **/
@Slf4j
public class UserInterceptor implements HandlerInterceptor {
    
    

    private JwtProperties jwtProperties;

    private static final ThreadLocal<UserInfo> t1 = new ThreadLocal<>();

    public UserInterceptor(JwtProperties jwtProperties) {
    
    
        this.jwtProperties = jwtProperties;
    }



    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        // 获取token
        String token = CookieUtils.getCookieValue(request, jwtProperties.getCookieName());
        try {
    
    
            UserInfo user = JwtUtils.getInfoFromToken(token, jwtProperties.getPublicKey());
            // 存入线程
            t1.set(user);
            return true;
        } catch (Exception e) {
    
    
            log.error("【购物车服务】 解析用户身份失败");
            return false;
        }
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
    
        // 清空线程域
        t1.remove();
    }

    // 提供外部获取线程中的user信息
    public static UserInfo getUser() {
    
    
        return t1.get();
    }
}

Filter example

Examples of filters in SSM

package com.how2java.filter;

import javax.servlet.Filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;

/**
 * @program: ssm
 * @description: 实现一个判断某值是否为空的过滤器
 * @author: LiuYing
 * @create: 2019-04-29 13:15
 **/

public class LoginFilter implements Filter {
    
    

    @Override
    public void destroy() {
    
    
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
    
    
        // TODO Auto-generated method stub
        HttpServletRequest request = (HttpServletRequest)arg0;
        HttpServletResponse response = (HttpServletResponse)arg1;
        HttpSession session = request.getSession();
        // 没有userName为空就转发到登陆页面
        if(session.getAttribute("userName")==null){
    
    

            request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);

//            response.sendRedirect(request.getContextPath()+"/index.jsp");  //重定向就相当于地址栏输入 也不能随便访问jsp
        }else{
    
    
            // 不为空,就继续请求下一级资源(继续访问)
            arg2.doFilter(arg0, arg1);
        }

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
    
    
        // TODO Auto-generated method stub

    }

}

<filter>
		<filter-name>SessionFilter</filter-name>
		<filter-class>com.how2java.filter.LoginFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>SessionFilter</filter-name>
		<!-- 所有的管理页面需要登录后才能访问 -->
		<!--<url-pattern>/jsp/*</url-pattern>-->
		<url-pattern>/jsp/success</url-pattern>
		<url-pattern>/jsp/login</url-pattern>
	</filter-mapping>


Examples of filters in SpringBoot

public class TokenFilter implements Filter {
    
    
    private static Logger logger = Logger.getLogger(TokenFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    
    
        logger.info("1.初始化过滤器");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
    
        logger.info("2.请求过滤");

        HttpServletRequest req = (HttpServletRequest)servletRequest;
        servletResponse.setCharacterEncoding("UTF-8");
        servletResponse.setContentType("application/json; charset=utf-8");
        String token = req.getHeader("token");
        
        //todo:业务逻辑
    }

    @Override
    public void destroy() {
    
    
        logger.info("3.过滤器被销毁");
    }
}

Configuration:

@Configuration
public class FilterConfig {
    
    

    @Bean
    public FilterRegistrationBean registFilter() {
    
    
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new TokenFilter());
        registration.addUrlPatterns("/*");
        registration.setName("TokenFilter");
        registration.setOrder(1);
        return registration;
    }

}
@ComponentScan(basePackages= {
    
    你的包})

The difference between listener, interceptor and filter

I won’t explain here, there are a lot of online, you can refer to:

Simply understand: https://www.jianshu.com/p/0d1f062dcd0d

In-depth understanding: https://www.cnblogs.com/lukelook/p/11079113.html#t1

Guess you like

Origin blog.csdn.net/qq_42380734/article/details/108462194
Recommended