package com.cloud.device.filter; import com.alibaba.fastjson.JSONObject; import com.cloud.device.utils.EnumStr; import com.cloud.model.common.Result; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; 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.Enumeration; import java.util.List; import java.util.Map; import java.util.Set; 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 servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; String url = request.getRequestURI(); if(url.startsWith("/loginData")){ Map parMap = request.getParameterMap(); Enumeration parNames = request.getParameterNames(); Set set = parMap.keySet(); MultiValueMap mulMap = new LinkedMultiValueMap<>(); for(String key: parMap.keySet()){ String[] names = parMap.get(key); for(int i=0;i(mulMap, headers); if("get".equalsIgnoreCase(method)){ body = restTemplate.getForObject(expandURL(url, mulMap),String.class, mulMap); }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 = request.getInputStream(); String str = IOUtils.toString(inputStream); log.info("put发送数据:"+str); // decodeReqParams( str, mulMap); // restTemplate.put(url, mulMap); 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){ response.setContentType("application/json;charset=utf-8"); response.setStatus(200); PrintWriter pw = response.getWriter(); pw.write(body.toString()); pw.close(); } }else if(url.startsWith("/httpImage")){ log.info("图片跳转url:"+url); response.sendRedirect(enumStr.getHttpImgUrl()+url.substring(11)); response.setHeader("Access-Control-Allow-Origin","*"); return; }else{ log.info("其他url跳转:"+url); filterChain.doFilter(servletRequest, servletResponse); } } // 添加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() { } }