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<String, String[]> parMap = request.getParameterMap();
|
Enumeration<String> parNames = request.getParameterNames();
|
Set<String> set = parMap.keySet();
|
|
MultiValueMap<String, String> 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 = request.getMethod();
|
log.info("请求方式:"+method);
|
HttpHeaders headers = new HttpHeaders();
|
String body = null;
|
String auth = request.getHeader("Authorization");
|
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
|
if(auth !=null){
|
mulMap.add("access_token",auth.substring(7));
|
headers.add("Authorization",auth);
|
}
|
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);
|
}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<String> entity = new HttpEntity<>(str, headers);
|
ResponseEntity<String> 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<String, String> map) {
|
Matcher mc = QUERY_PARAM_PATTREN.matcher(url);
|
StringBuilder sb =new StringBuilder(url);
|
if (!mc.find()){
|
sb.append("&");
|
}else {
|
sb.append("?");
|
}
|
Set<String> keys = map.keySet();
|
for (String key : keys) {
|
List<String> 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() {
|
|
}
|
|
}
|