Listener, interceptor, filter instance
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