当前位置: 首页 > 知识库问答 >
问题:

与Servlet筛选器和FilterRegistrationBean一起使用时,跨源资源共享不起作用

邹铭
2023-03-14

摘要:对于跨源请求,将发送具有有效JSON的响应。(即不发送空响应。)

@Bean
public FilterRegistrationBean corsFilterRegistration() {
    FilterRegistrationBean filterRegistrationBean =
            new FilterRegistrationBean(corsFilter());
    filterRegistrationBean.setUrlPatterns(Collections.singleton("/getToken"));
    return filterRegistrationBean;
}

@Bean
public CORSFilter corsFilter() {
    return new CORSFilter();
}
@Component
public class CORSFilter implements Filter {
    @Autowired
    UserDao userDao;

    @Autowired
    UserController userController;


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest requestToUse = (HttpServletRequest) request;
        HttpServletResponse responseToUse = (HttpServletResponse) response;
        String origin = requestToUse.getHeader("Origin");
        String username = requestToUse.getParameter("username");


        if (requestToUse.getMethod().equalsIgnoreCase("GET") && Util.falseIfAnyStringIsNull(username, origin)) {
            User user = userDao.findByUsername(username);
            if (!ObjectUtils.isEmpty(user)) {
                System.out.println("user.getDomainName()==" + user.getDomainName());
                if (origin.equalsIgnoreCase(user.getDomainName())) {
                    logger.info("Access granted");
                    responseToUse.addHeader("Access-Control-Allow-Origin", origin);
                    responseToUse.addHeader("Access-Control-Allow-Methods", "GET");
                    responseToUse.addHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
                    chain.doFilter(requestToUse, responseToUse);
                } else {
                    responseToUse.sendError(HttpServletResponse.SC_FORBIDDEN, "Invalid Origin.");
                }

            } else {
                responseToUse.sendError(HttpServletResponse.SC_FORBIDDEN, "Invalid Username");
            }

        } else {
            responseToUse.sendError(HttpServletResponse.SC_FORBIDDEN, "Invalid Credential");
        }
    }


    @Override
    public void destroy() {

    }
}

如果对/gettoken发出请求,那么CORSFilter将开始工作,并验证用户和起源。

这一切都很好,但问题是,当我从无效的来源向/gettoken发送get请求时,在浏览器控制台中,我得到一条正确的消息,“没有'Access-Control-Allog-Origin'header is present on the requested Resource...”但是如果我转到network选项卡,那么我可以看到一个JSON响应,其中包含有效的令牌。

如果我删除上面的CORSFilter和filterRegistrationBean,那么我没有看到任何响应,所以我假设上面的filter和registrationbean有问题。

共有1个答案

何和惬
2023-03-14

Spring Framework提供了org.springframework.web.filter.corsfilter实现,并为此提供了诸如@crossorigin等各种特性(请参阅参考文档)。

滚动您自己的过滤器实现不是一个好主意;在我的头上,您的实现没有处理飞行前请求,这可能是您现在面临的问题之一。

 类似资料:
  • 来自维基百科: 要发起跨源请求,浏览器发送带有源HTTP标头的请求。这个标题的值是为页面服务的站点。例如,假设http://www.example-social-network.com上的一个页面试图访问online-personal-calendar.com中的用户数据。如果用户的浏览器实现了CORS,则将发送以下请求头: 来源:http://www.example-social-network

  • 通过XHR 实现Ajax 通信的一个主要限制,来源于跨域安全策略。默认情况下,XHR 对象只能访问与包含它的页面位于同一个域中的资源。这种安全策略可以预防某些恶意行为。但是,实现合理的跨域请求对开发某些浏览器应用程序也是至关重要的。 CORS(Cross-Origin Resource Sharing,跨源资源共享)是W3C 的一个工作草案,定义了在必须访问跨源资源时,浏览器与服务器应该如何沟通。

  • 我试图使CORS与Spring Security很好地配合,但它并不符合要求。我进行了本文所述的更改,更改中的这一行使我的应用程序可以使用POST和GET请求(临时公开控制器方法,以便测试CORS): 前面: 后面: 不幸的是,允许通过AJAX进行Spring Security登录的以下URL没有响应:。我正在将AJAX请求从发送到。 当尝试访问时,我在Chrome中获得了选项预飞行请求,AJAX

  • 问题内容: 对于以下发布请求如何使用烧瓶中从ajax发布的数据?: 我收到一个错误: 我尝试通过以下两种方式解决该问题,但似乎无济于事。 使用Flask-CORS 这是用于处理的扩展,应使跨域AJAX成为可能。 我的 pythonServer.py 使用此解决方案: 使用特定的Flask装饰器 这是Flask 官方 代码片段,定义了一个装饰器,该装饰器应允许其装饰功能。 http://flask.

  • 问题内容: 对于以下ajax发布请求Flask(如何使用烧瓶中ajax发布的数据?): 我收到一个错误: 我尝试通过以下两种方法解决该问题,但似乎没有任何效果。 1.使用Flask-CORS 这是用于处理的扩展,应使跨域AJAX成为可能。 我的pythonServer.py使用此解决方案: 2.使用特定的Flask装饰器 这是Flask 官方代码片段,定义了一个装饰器,该装饰器应允许CORS其装饰

  • 问题内容: 我正在编写一个HTML5应用程序,该应用程序使用JSONP从几个不同的来源收集数据。我对GET所做的任何事情都可以正常工作。我现在正尝试发布数据,并且遇到了一个有趣的问题。我需要将数据从我的应用程序发布到另一个应用程序,该应用程序从本地计算机运行。我正在尝试编写具有跨平台功能的移动应用程序(请考虑使用Pulse / Flipboard),因此该代码将始终从本地源运行。我的思考过程如下: