package com.cloud.attendance.filter; import com.alibaba.fastjson.JSONObject; import com.cloud.attendance.utils.EnumStr; import com.cloud.model.common.Result; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.*; import org.springframework.stereotype.Component; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.HttpServerErrorException; import org.springframework.web.client.RestTemplate; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @Slf4j @Component @WebFilter(urlPatterns = "/*", filterName = "loginFilter") public class LoginDataFilter implements Filter { @Autowired private RestTemplate restTemplate; @Autowired private EnumStr enumStr; private static final Pattern QUERY_PARAM_PATTREN = Pattern.compile("([^&=]+)(=?)([^&]+)?"); @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain fc) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; String url = req.getRequestURI(); if (url.startsWith("/loginData")) { Map parMap = req.getParameterMap(); Enumeration names1 = req.getParameterNames(); Set set = parMap.keySet(); MultiValueMap mulMap = new LinkedMultiValueMap<>(); for (String key : parMap.keySet()) { String[] names = parMap.get(key); for (int i = 0; i < names.length; i++) { mulMap.add(key, names[i]); } } log.info(mulMap + "mulMap"); String method = req.getMethod(); log.info(method + "请求方式"); HttpHeaders headers = new HttpHeaders(); String body = null; String auth = req.getHeader("Authorization"); headers.add("Accept", MediaType.APPLICATION_JSON.toString()); // headers.add("content-type", req.getHeader("content-type")); if (auth != null) { mulMap.add("access_token", auth.substring(7)); headers.add("Authorization", auth); } // url = "http://"+ req.getServerName() +":"+enumStr.getUserHTTP_PORT()+"/data"+ url.substring(10) ; url = "http://" + enumStr.getUserHOSTNAME() + ":" + enumStr.getUserHTTP_PORT() + "/data" + url.substring(10); log.info(url + "查询url"); HttpEntity reqEntity = new HttpEntity(mulMap, headers); if ("get".equalsIgnoreCase(method)) { body = restTemplate.getForObject(expandURL(url, mulMap), String.class, mulMap); // body =restTemplate.exchange(url, HttpMethod.GET, reqEntity,String.class).getBody(); } else if ("post".equalsIgnoreCase(method)) { headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); body = restTemplate.postForEntity(url, reqEntity, String.class).getBody(); } else if ("put".equalsIgnoreCase(method)) { headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); ServletInputStream inputStream = req.getInputStream(); String str = IOUtils.toString(inputStream); log.info("put inputstream获取发送数据:"+str); StringBuilder sb = new StringBuilder(); if (StringUtils.isBlank(str)){ for (String key : mulMap.keySet()) { List values = mulMap.get(key); for (String value : values){ sb.append("&"+key+"="+value); } } if (sb.length() > 0)str = sb.substring(1); } log.info("put request getParamer获取发送数据:"+str); HttpEntity entity = new HttpEntity<>(str, headers); ResponseEntity resultEntity = null; try { resultEntity = restTemplate.exchange(url, HttpMethod.PUT, entity, String.class); body = resultEntity.getBody(); } catch (HttpClientErrorException e) { String responseBodyAsString = e.getResponseBodyAsString(); body = responseBodyAsString; // e.printStackTrace(); }catch (HttpServerErrorException e) { String responseBodyAsString = e.getResponseBodyAsString(); body = responseBodyAsString; // e.printStackTrace(); }catch (Exception e){ body = JSONObject.toJSONString(Result.error(e)); e.printStackTrace(); } // log.info("put返回数据:"+body); } log.info(body + "返回内容"); if (body != null) { resp.setContentType("application/json;charset=utf-8"); resp.setStatus(200); PrintWriter pw = resp.getWriter(); pw.write(body); pw.close(); } } else if (url.startsWith("/httpImage")) { log.info(url + "图片 跳转"); log.info(enumStr.getHttpImgUrl() + url.substring(11) + "图片 装换 跳转"); resp.sendRedirect(enumStr.getHttpImgUrl() + url.substring(11)); resp.setHeader("Access-Control-Allow-Origin", "*"); return; } else { log.info(url + "其他url 跳转"); fc.doFilter(request, response); } } // 添加url private static String expandURL(String url, MultiValueMap map) { Matcher mc = QUERY_PARAM_PATTREN.matcher(url); StringBuilder sb = new StringBuilder(url); if (!mc.find()) { sb.append("&"); } else { sb.append("?"); } Set keys = map.keySet(); for (String key : keys) { List value = map.get(key); for (String val : value) { sb.append(key).append("=").append(val).append("&"); // .append("}") } } return sb.deleteCharAt(sb.length() - 1).toString(); } @Override public void destroy() { } }