您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)使用Filter攔截器怎么實(shí)現(xiàn)請(qǐng)求跨域轉(zhuǎn)發(fā),小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
因?yàn)楣卷?xiàng)目需求,項(xiàng)目中前端請(qǐng)求需要通過一個(gè)類似中轉(zhuǎn)的服務(wù)轉(zhuǎn)發(fā)(請(qǐng)求在該服務(wù)中會(huì)重新包裝一些通用參數(shù))
package com.unicloud.cce.Filter; import com.alibaba.fastjson.JSON; import com.unicloud.cce.common.RestfulEntity; import com.unicloud.cce.service.CloudosService; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.*; import org.springframework.stereotype.Component; import org.springframework.util.AntPathMatcher; import org.springframework.util.StringUtils; 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.*; /** * @author skyxt * Created 2019-06-11 18:46 * Email skyxt.yang@gmail.com */ @WebFilter(filterName = "authFilter", urlPatterns = { "/*" }) @Component public class RequestFilter implements Filter { //該處配置需要轉(zhuǎn)發(fā)的路徑 public static final Set<String> FILTER_URL = Collections.unmodifiableSet(new HashSet<>(Arrays.asList( "/config/*" ))); @Autowired private RestTemplate restTemplate; @Autowired private CloudosService cloudosService; private final static Logger logger = LoggerFactory.getLogger(RequestFilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (!(request instanceof HttpServletRequest) || !(response instanceof HttpServletResponse)) { return; } HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse rsp = (HttpServletResponse) response; AntPathMatcher matcher = new AntPathMatcher(); Optional<String> cloudIp = Optional.empty(); // for (String url : FILTER_URL) { // if (matcher.match(url, req.getRequestURI().substring(req.getContextPath().length()))) { // cloudIp = cloudosService.cloudosList("", "").stream().filter(cloudos -> // cloudos.getId().equals(((HttpServletRequest) request).getHeader("cloudId")) // ).map(Cloudos::getCloudIp).findFirst(); // } // } cloudIp = Optional.of("localhost"); if (cloudIp.isPresent()) { switch (req.getMethod()) { case "GET": { request(req, rsp, HttpMethod.GET, cloudIp.get()); break; } case "POST": { request(req, rsp, HttpMethod.POST, cloudIp.get()); break; } case "PUT": { request(req, rsp, HttpMethod.PUT, cloudIp.get()); break; } case "PATCH": { request(req, rsp, HttpMethod.PATCH, cloudIp.get()); break; } case "DELETE": { request(req, rsp, HttpMethod.DELETE, cloudIp.get()); break; } default:{ logger.error("unknow request method:" + req.getMethod()); rsp.setCharacterEncoding("UTF-8"); try (PrintWriter out = rsp.getWriter()) { out.write("請(qǐng)求方法未知"); } catch (Exception e1) { logger.error(e1.getMessage() + e1); } } } } else { chain.doFilter(request, response); } } @Override public void destroy() { } private void request(HttpServletRequest req, HttpServletResponse rsp, HttpMethod method, String cloudIp) throws IOException { rsp.setCharacterEncoding("UTF-8"); String requestBody = IOUtils.toString(req.getInputStream(), "UTF-8"); Object body = null; if (StringUtils.hasText(requestBody)) { body = JSON.parse(requestBody); } HttpHeaders headers = new HttpHeaders(); Enumeration<String> headerNames = req.getHeaderNames(); while (headerNames.hasMoreElements()) { String name = headerNames.nextElement(); headers.add(name, req.getHeader(name)); } String url; if (StringUtils.hasText(req.getQueryString())) { url = String.format( "http://%s:15120%s?%s", cloudIp, req.getRequestURI().substring(req.getContextPath().length()), req.getQueryString() ); } else { url = String.format( "http://%s:15120%s", cloudIp, req.getRequestURI().substring(req.getContextPath().length()) ); } HttpEntity<Object> httpEntity = new HttpEntity<>(body, headers); ResponseEntity<RestfulEntity> exchange = null; try { exchange = restTemplate.exchange( url, method, httpEntity, RestfulEntity.class ); } catch (Exception e) { logger.error(e.getMessage(), e); try (PrintWriter out = rsp.getWriter()) { out.write("請(qǐng)求異常"); } catch (Exception e1) { logger.error(e1.getMessage() + e1); } } if (exchange != null) { exchange.getStatusCode(); rsp.setStatus(exchange.getStatusCodeValue()); exchange.getHeaders().entrySet().stream().forEach(entry -> { String value = entry.getValue().toString(); rsp.addHeader(entry.getKey(), value.substring(1, value.length()-1)); }); try (PrintWriter out = rsp.getWriter()) { out.write(JSON.toJSONString(exchange.getBody())); } catch (Exception e) { logger.error(e.getMessage(), e); } } else { logger.info("error: URL:" + "http://" + cloudIp + ":15120" + req.getRequestURI().substring(req.getContextPath().length())); try (PrintWriter out = rsp.getWriter()) { out.write("請(qǐng)求異常"); } catch (Exception e1) { logger.error(e1.getMessage() + e1); } } } }
<filter> <filter-name>servletFilterTest</filter-name> <filter-class>cn.test.intercepter.ServletFilterTest</filter-class> </filter> <filter-mapping> <filter-name>servletFilterTest</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
import org.springframework.web.bind.annotation.RequestMethod; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class ServletFilterTest implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; httpServletRequest.getSession(); HttpServletResponse httpResponse = (HttpServletResponse) servletResponse; httpResponse.setHeader("Access-Control-Allow-Origin", "*"); httpResponse.setHeader("Access-Control-Allow-Methods", "*"); httpResponse.setHeader("Access-Control-Max-Age", "3600"); httpResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Connection, User-Agent, Cookie"); httpResponse.setHeader("Access-Control-Allow-Credentials", "true"); httpResponse.setHeader("Content-type", "application/json"); httpResponse.setHeader("Cache-Control", "no-cache, must-revalidate"); if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) { return ; } filterChain.doFilter(httpServletRequest, httpResponse); } @Override public void destroy() { } }
關(guān)于“使用Filter攔截器怎么實(shí)現(xiàn)請(qǐng)求跨域轉(zhuǎn)發(fā)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。