package com.qxueyou.scc.web; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.lang3.ArrayUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.data.redis.core.StringRedisTemplate; import com.alibaba.druid.util.StringUtils; import com.alibaba.fastjson.JSONObject; import com.qxueyou.scc.base.model.Result; import com.qxueyou.scc.base.model.UserInfoWrapper; import com.qxueyou.scc.base.service.ILicenseService; import com.qxueyou.scc.config.SccConfig; import com.qxueyou.scc.sys.service.IAuthorizeService; @WebFilter(urlPatterns = "/*", filterName = "authorizeFilter") @EnableConfigurationProperties(SccConfig.class) public class AuthorizeFilter implements Filter { private final Logger log = LogManager.getLogger("AuthorizeFilter"); @Autowired private IAuthorizeService authorizeService; @Autowired private SccConfig sccConfig; @Autowired ILicenseService licenseService; @Autowired private StringRedisTemplate stringRedisTemplate; private String[] excludeUrls; /** * 非法请求返回结果 */ private String forbidden = JSONObject.toJSONString(new Result(false,Result.CODE_FORBIDDEN)); private String forbiddenOfInvalidLicense = JSONObject.toJSONString(new Result(false,Result.CODE_FORBIDDEN,"license invalid")); @Override public void init(FilterConfig filterConfig) throws ServletException { // 从配置文件中获取excludeUrls String excludeUrl = sccConfig.getExcludeUrl(); if (!StringUtils.isEmpty(excludeUrl)) { excludeUrls = excludeUrl.split(";"); String root = filterConfig.getServletContext().getContextPath(); for (int i = 0; i < excludeUrls.length; i++) { excludeUrls[i] = excludeUrls[i].replace("\n", "").replace("\t", "").replace(" ", ""); excludeUrls[i] = root.concat(excludeUrls[i]); } } log.debug("license info: valid:{0},companyName:{1},productName:{2},expiredDate{3}", licenseService.isValid(), licenseService.getCustomerName(), licenseService.getProductName(), licenseService.getExpiredDate() ); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; String url = httpRequest.getRequestURI(); log.debug("request URI:" + url); // 是否略过 if (ArrayUtils.isEmpty(excludeUrls) || isExclude(httpRequest)) { filterChain.doFilter(httpRequest, httpResponse); return; } //是否合法 // if(!licenseService.isValid()) { // log.debug("license invalid"); // forbiddenAsLicense(httpResponse); // return; // } if (!addClientInfo(httpRequest)) { log.debug("非法请求:" + httpRequest.getRequestURI()); forbidden(httpResponse); return; } filterChain.doFilter(request, response); } private void forbidden(HttpServletResponse httpResponse) { try { httpResponse.getWriter().append(forbidden); } catch (IOException e) { log.error(e,e); } } private void forbiddenAsLicense(HttpServletResponse httpResponse) { try { httpResponse.getWriter().append(forbiddenOfInvalidLicense); } catch (IOException e) { log.error(e,e); } } /** * 绑定客户端信息 * * @param httpRequest * @param cookieKey * @return */ private boolean addClientInfo(HttpServletRequest httpRequest) { HttpSession session = httpRequest.getSession(true); UserInfoWrapper wrapper = (UserInfoWrapper) session.getAttribute(UserInfoWrapper.SESSION_USER_INFO_KEY); if (wrapper == null) { return false; } //获取用户对应的sessionId是否与保存在redis中的一致,如果不一致,如果不一致则跳转到登录页面 //String currOnlineSessinId = (String) stringRedisTemplate.opsForHash().get(UserInfoWrapper.REDIS_USER_ONLINE_MAP_KEY, wrapper.getInfo(UserInfoWrapper.INF_USER_ID)); //如果不存在,则返回 // if(!session.getId().equalsIgnoreCase(currOnlineSessinId)){ // session.invalidate(); // return false; // } authorizeService.addClientInfo(wrapper); return true; } /** * 是否过滤掉 * * @param httpRequest * @return */ private boolean isExclude(HttpServletRequest httpRequest) { String url = httpRequest.getRequestURI(); for (String excludeUrl : excludeUrls) { if (url.startsWith(excludeUrl)) { return true; } } return false; } @Override public void destroy() { System.out.println("destroy authorizeFilter"); } }