package com.cloud.retrieve.filter; import com.alibaba.fastjson.JSONObject; import com.cloud.model.common.Result; import com.cloud.retrieve.utils.EnumStr; 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.*; 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.io.StringReader; 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 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> reqEntity = new HttpEntity<>(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(); } 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()+":"+enumStr.getHttpImgPort()+url.substring(10)); response.setHeader("Access-Control-Allow-Origin","*"); return; }else if (url.contains("alarmWebSocketServer")){ filterChain.doFilter(servletRequest,servletResponse); }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(); } // 添加url private void decodeReqParams(String urlParams, MultiValueMap map) { // oldPassword=654321&newPassword=123123&id=195 数据格式 String[] params = urlParams.split("&"); for (String param : params) { String[] keys = param.split("="); if (keys.length==2){ map.put(keys[0], Arrays.asList(keys[1])); }else { log.info("本次解析请求(可能是put)参数异常:"+param); } } } @Override public void destroy() { } }