package com.im.web.common.interceptor; import com.alibaba.dubbo.config.annotation.Reference; import com.alibaba.fastjson.util.TypeUtils; import com.im.mms.center.api.client.tools.UserLoginStatusService; import com.im.mms.center.dto.member.UserLoginStatusDto; import com.im.mms.center.dto.other.LoginDto; import com.im.monkey.redis.impl.ShardedJedisClientImpl; import com.im.web.common.utils.ShiroFilterMapUtil; import lombok.extern.slf4j.Slf4j; import org.apache.log4j.Logger; import org.apache.shiro.SecurityUtils; import org.apache.shiro.util.AntPathMatcher; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.Map; /** * 拦截器 */ @Component @Slf4j public class SessionInterceptor extends HandlerInterceptorAdapter { @Autowired private ShardedJedisClientImpl redisClient; @Reference(version = "1.0.0") private UserLoginStatusService userLoginStatusService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //获取请求类型是否为XMLHttpRequest String uri = request.getRequestURI(); //不需要被拦截的路径 Map<String, String> filterMap = ShiroFilterMapUtil.getFilterMap(); AntPathMatcher antPathMatcher = ShiroFilterMapUtil.getAntPathMatcher(); //判断该路径是否需要登录 for (Map.Entry<String, String> entry : filterMap.entrySet()) { String key = entry.getKey();String value = entry.getValue(); if("anon".equals(value) && antPathMatcher.match(key, uri)) { return true; } } //需要登录的路径 判断账号是否异常 if(!isAccountException(request, response)) { return false; } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView mav) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception excptn) throws Exception { } /** * 获取当前登录人用户ID * @return */ private LoginDto getLoginDto() { return (LoginDto) SecurityUtils.getSubject().getPrincipal(); } /** * 判断账号是否异常 * @param response * @return */ private boolean isAccountException(HttpServletRequest request, HttpServletResponse response) { LoginDto loginDto = getLoginDto(); String userId = TypeUtils.castToString(loginDto.getUserId()); String subUserId = TypeUtils.castToString(loginDto.getSubUserId()); if(!StringUtils.isEmpty(userId)) { UserLoginStatusDto userLoginStatusDto = new UserLoginStatusDto(); if(!StringUtils.isEmpty(subUserId)) { userLoginStatusDto.setUserId(subUserId); userLoginStatusDto.setSubFlag("1"); } else { userLoginStatusDto.setUserId(userId); } Map<String, Object> resultMap = userLoginStatusService.checkUserLoginStatus(userLoginStatusDto); String userAvailable = TypeUtils.castToString(resultMap.get("userAvailable")); if ("0".equals(userAvailable)) { String resultMsg = TypeUtils.castToString(resultMap.get("resultMsg")); try { //异步请求,无法直接进行页面跳转,需在jsp页面进行强制跳转 if (request.getHeader("X-Requested-With") != null && request.getHeader("X-Requested-With").equals("XMLHttpRequest")) { PrintWriter out = response.getWriter(); //输出脚本到页面,进行页面强制跳转 out.print("errorMsg*****"+resultMsg); } else { StringBuffer script = new StringBuffer("<script type=\"text/javascript\">"); if(!"".equals(resultMsg)){ script.append("alert('" + resultMsg + "');"); } script.append( " try{if(window.dialogArguments) {" + "window.close();" + " window.dialogArguments.parent.location.href='") .append(request.getContextPath()) .append("/modules/mms/system/login.html';} "); script.append(" else if(window.opener) {window.close(); window.opener.location.href='"); script.append(request.getContextPath()).append( "/modules/mms/system/login.html';} else "); script.append("parent.window.location.href='") .append(request.getContextPath()) .append("/modules/mms/system/login.html';").append("} catch(err){}"); script.append("</script>"); response.setContentType("text/html; charset=utf-8"); writeResponse(response, script.toString()); } } catch (Exception e) { e.printStackTrace(); } return false; } } return true; } private void writeResponse(HttpServletResponse httpResponse, String pageCode) { try { httpResponse.setContentType("text/html"); httpResponse.setCharacterEncoding("utf-8"); PrintWriter out = httpResponse.getWriter(); out.flush(); out.write(pageCode); out.flush(); out.close(); } catch (IOException e) { log.error(e.getMessage()); } } }
拦截器的简单使用
最新推荐文章于 2022-08-26 18:00:57 发布