使用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解决跨域
在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() {}}

【使用Filter拦截器如何实现请求跨域转发】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    推荐阅读