使用Filter拦截器如何实现请求跨域转发|使用Filter拦截器如何实现请求跨域转发

目录

  • Filter拦截器实现请求跨域转发
    • 在使用Filter实现转发后特做一次记录
  • 使用filter解决跨域
    • 在web.xml配置拦截器
    • 过滤器代码

Filter拦截器实现请求跨域转发 因为公司项目需求,项目中前端请求需要通过一个类似中转的服务转发(请求在该服务中会重新包装一些通用参数)

在使用Filter实现转发后特做一次记录
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 = { "/*" })@Componentpublic class RequestFilter implements Filter { //该处配置需要转发的路径public static final Set FILTER_URL = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("/config/*"))); @Autowiredprivate RestTemplate restTemplate;@Autowiredprivate CloudosService cloudosService;private final static Logger logger = LoggerFactory.getLogger(RequestFilter.class); @Overridepublic void init(FilterConfig filterConfig) throws ServletException { } @Overridepublic 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 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("请求方法未知");} catch (Exception e1) {logger.error(e1.getMessage() + e1);}} }} else {chain.doFilter(request, response);}} @Overridepublic 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 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 httpEntity = new HttpEntity<>(body, headers);ResponseEntity 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("请求异常");} 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 = https://www.it610.com/article/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("请求异常");} catch (Exception e1) {logger.error(e1.getMessage() + e1);}} }}
【使用Filter拦截器如何实现请求跨域转发|使用Filter拦截器如何实现请求跨域转发】
使用filter解决跨域
在web.xml配置拦截器
servletFilterTestcn.test.intercepter.ServletFilterTest servletFilterTest/*


过滤器代码
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 {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic 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);}@Overridepublic void destroy() {}}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    推荐阅读