package com.cloud.application.filter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; 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; @Value("${loginData.redUrl}") private String loginHost; @Value("${loginData.redPort}") private String loginPort; @Value("${fdfsImgUrl.server}") private String httpImageUrl; 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{ headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); body = restTemplate.postForEntity(url, reqEntity, String.class).getBody(); } 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(httpImageUrl+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() { } }