package com.apobates.forum.thrones.controller.helper; import com.apobates.forum.member.entity.MemberOnline; import com.apobates.forum.member.service.MemberOnlineService; import com.apobates.forum.member.storage.OnlineMemberStorage; import com.apobates.forum.member.storage.core.MemberSessionBean; import com.apobates.forum.member.storage.core.MemberSessionBeanBuilder; import com.apobates.forum.utils.Commons; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.SmartView; import org.springframework.web.servlet.View; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; /** * 在线会员记录拦截器 * * @author xiaofanku * @since 20200607 */ public class MemberOnlineInterceptor extends HandlerInterceptorAdapter{ @Autowired private OnlineMemberStorage onlineMemberStorage; @Autowired private MemberOnlineService memberOnlineService; private final static Logger logger = LoggerFactory.getLogger(MemberOnlineInterceptor.class); @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { logger.info("[MOI][AFT]after handle start"); } /** * Executed before after handler is executed.If view is a redirect view, we don't need to execute postHandle * @param request * @param response * @param handler * @param modelAndView * @throws java.lang.Exception **/ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { logger.info("[MOI][PST]post handle start"); if (modelAndView != null && !isRedirectView(modelAndView)) { logger.info(String.format("[MOI][PST]mapping view:%s", modelAndView.getViewName())); //------------------------------------------会员在线记录 MemberSessionBean mbean = getMemberBean(request); memberOnlineService.create(new MemberOnline(request.getSession().getId(), mbean.getMid(), mbean.getNames(), mbean.getNickname(), null)); //------------------------------------------ } } /** * Executed before actual handler is executed * @param request * @param response * @param handler * @return * @throws java.lang.Exception **/ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.info(String.format("[MOI][PRE]request uri:%s", request.getRequestURI())); return true; } private MemberSessionBean getMemberBean(HttpServletRequest request){ MemberSessionBean mbean = onlineMemberStorage.getInstance(request, "MemberOnlineInterceptor").orElse(null); if (null == mbean || !mbean.isOnline()) { String ipAddr = Commons.getRequestIp(request); String gnick = String.format("Guest#%d", Commons.ipHashcode(ipAddr)); mbean = MemberSessionBeanBuilder.empty().setNickname(gnick).build(Commons.getRequestIp(request), "MOI"); } return mbean; } public static boolean isRedirectView(ModelAndView mv) { String viewName = mv.getViewName(); if (viewName.startsWith("redirect:/")) { return true; } View view = mv.getView(); return (view != null && view instanceof SmartView && ((SmartView) view).isRedirectView()); } }