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

网友投稿 1271 2022-12-14

使用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 = { "/*" })

@Component

public class RequestFilter implements Filter {

//该处配置需要转发的路径

public static final Set 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 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);

}

}

@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 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 = 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解决跨域

在web.xml配置-

servletFilterTest

cn.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 {

@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() {

}

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:mybatis如何根据表逆向自动化生成代码实例
下一篇:Filter中获取传递参数方式(解决post请求参数问题)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~