gpt4 book ai didi

java - 与 Servlet Filter 和 FilterRegistrationBean 一起使用时,跨源资源共享不起作用

转载 作者:行者123 更新时间:2023-12-02 02:12:45 26 4
gpt4 key购买 nike

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

我有一个filterRegistrationBean,如下所示:

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

@Bean
public CORSFilter corsFilter() {
return new CORSFilter();
}

我有一个 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 请求时,然后在浏览器控制台中,我收到一条正确的消息,“No 'Access-Control-Allow-Origin' header 存在于请求的资源中...”但如果我转到网络选项卡,那么我可以看到一个 JSON 响应,其中包含有效的 token 。

如果我删除上面的 CORSFilter 和 filterRegistrationBean 那么我看不到任何响应,所以我假设上面的过滤器和 RegistrationBean 有问题。

最佳答案

Spring Framework 为此目的提供了 org.springframework.web.filter.CorsFilter 实现和各种功能,例如 @CrossOrigin(请参阅 the reference documentation )。

滚动自己的过滤器实现并不是一个好主意;在我的脑海中,您的实现没有处理预检请求,这可能是您现在面临的问题(之一)。

关于java - 与 Servlet Filter 和 FilterRegistrationBean 一起使用时,跨源资源共享不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49749788/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com