广告
返回顶部
首页 > 资讯 > 后端开发 > Python >使用Filter拦截器如何实现请求跨域转发
  • 803
分享到

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

2024-04-02 19:04:59 803人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

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

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.*;
 

@WebFilter(filterName = "authFilter", urlPatterns = { "/*" })
@Component
public class RequestFilter implements Filter { 
 
    //该处配置需要转发的路径
    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("请求方法未知");
                    } 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("请求异常");
            } 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配置拦截器


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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 使用Filter拦截器如何实现请求跨域转发

本文链接: https://www.lsjlt.com/news/133869.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用Filter拦截器如何实现请求跨域转发
    目录Filter拦截器实现请求跨域转发在使用Filter实现转发后特做一次记录使用filter解决跨域在web.xml配置拦截器过滤器代码Filter拦截器实现请求跨域转发 因为公司...
    99+
    2022-11-12
  • Springboot 如何实现filter拦截token验证和跨域
    Springboot filter拦截token验证和跨域 背景 web验证授权合法的一般分为下面几种 使用session作为验证合法用户访问的验证方式 使用自己实...
    99+
    2022-11-12
  • 如何使用$.getJSON实现跨域ajax请求
    本篇内容主要讲解“如何使用$.getJSON实现跨域ajax请求”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用$.getJSON实现跨域ajax请求”吧...
    99+
    2022-10-19
  • Vue如何用Ajax实现跨域请求
    本篇内容主要讲解“Vue如何用Ajax实现跨域请求”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue如何用Ajax实现跨域请求”吧!一.设置config/index.js || proxyTa...
    99+
    2023-07-04
  • 如何使用SpringBoot拦截器实现登录拦截
    小编给大家分享一下如何使用SpringBoot拦截器实现登录拦截,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!可以对URL路径进行拦截,可以用于权限验证、解决乱码...
    99+
    2023-06-29
  • Java中的跨域请求如何利用cors实现
    本篇文章为大家展示了Java中的跨域请求如何利用cors实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是跨域?跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器...
    99+
    2023-05-31
    java cors ava
  • angular如何使用拦截器统一处理http请求和响应
    这篇文章给大家分享的是有关angular如何使用拦截器统一处理http请求和响应的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。想使用angularjs里的htpp向后台发送请求,...
    99+
    2022-10-19
  • 如何在Springmvc中利用ajax实现一个跨域请求
    今天就跟大家聊聊有关如何在Springmvc中利用ajax实现一个跨域请求,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。写一个类  继承HandlerInterceptor...
    99+
    2023-05-31
    springmvc ajax
  • SpringBoot基于过滤器和内存如何实现重复请求拦截功能
    这篇文章主要介绍了SpringBoot基于过滤器和内存如何实现重复请求拦截功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot基于过滤器和内存如何实现重复请求拦截功能文章都会有所收获,下面我们...
    99+
    2023-07-05
  • JS如何实现跨域请求外部服务器的资源
    小编给大家分享一下JS如何实现跨域请求外部服务器的资源,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!tomcat服务器提供的接口...
    99+
    2022-10-19
  • vue-cli项目开发/生产环境代理如何实现跨域请求
    这篇文章主要介绍了vue-cli项目开发/生产环境代理如何实现跨域请求,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。开发环境中跨域使用vue...
    99+
    2022-10-19
  • spring boot拦截器如何使用spring AOP实现
    本篇文章为大家展示了spring boot拦截器如何使用spring AOP实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在spring boot中,简单几步,使用spring AOP实现一个拦...
    99+
    2023-05-31
    springboot spring aop 拦截器
  • SpringMVC框架中如何使用Filter实现请求日志打印
    这篇文章主要为大家展示了“SpringMVC框架中如何使用Filter实现请求日志打印”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringMVC框架中如何使用Filter实现请求日志打印”...
    99+
    2023-06-25
  • 利用Spring jsonp如何在java项目中实现一个跨域请求
    本篇文章为大家展示了利用Spring jsonp如何在java项目中实现一个跨域请求,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。jsonp介绍    &nb...
    99+
    2023-05-31
    spring jsonp java 跨域请求
  • 如何使用Springboot实现拦截器获取header内容
    小编给大家分享一下如何使用Springboot实现拦截器获取header内容,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!分析既然需要动态获取那么只有两种方式:要么每次下游请求过来时从请求头中获取,要么定义统一的拦截器自动...
    99+
    2023-06-15
  • 使用SpringBoot如何实现自定义过滤器与拦截器
    使用SpringBoot如何实现定义过滤器与拦截器?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、自定义过滤器创建一个过滤器,实现javax.servlet.Filter...
    99+
    2023-05-31
    springboot 拦截器 监听器
  • 使用Struts2拦截器如何实现一个登录验证功能
    使用Struts2拦截器如何实现一个登录验证功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Struts2拦截器Struts2拦截器的概念和Spring Mvc拦截器一样...
    99+
    2023-05-31
    struts 登录验证 拦截器
  • 使用struts2拦截器如何实现对用户进行权限控制
    使用struts2拦截器如何实现对用户进行权限控制?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。大多数网站会设置用户权限,如过滤非法用户,用户不登录时不能进行访问,或者设置...
    99+
    2023-05-31
    struts 权限控制 拦截器
  • SSM项目中如何使用拦截器实现登录验证功能
    小编给大家分享一下SSM项目中如何使用拦截器实现登录验证功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!登录接口实现public User ...
    99+
    2023-06-28
  • 如何利用 Apache 服务器实现 PHP 并发请求的分布式处理?
    如何利用 Apache 服务器实现 PHP 并发请求的分布式处理? 随着互联网的发展,越来越多的网站需要处理大量的并发请求。为了提高网站的响应速度和稳定性,我们需要使用分布式处理来处理大量的并发请求。在本文中,我们将介绍如何使用 Apach...
    99+
    2023-09-22
    并发 unix apache
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作