摘要:对于跨域请求,将发送带有有效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发送获取请求时,然后在浏览器控制台中,我收到了一条正确的消息,“请求中没有'Access-Control-Allow-Origin'标头资源...”
但是,如果我转到“网络”标签,则可以看到其中包含有效令牌的JSON响应。
如果我删除了上面的CORSFilter和filterRegistrationBean,那么我看不到任何响应,因此我假设上面的filter和registrationBean有问题。
最佳答案
Spring Framework为此提供了一个org.springframework.web.filter.CorsFilter
实现和各种功能,例如@CrossOrigin
(请参见the reference documentation)。
滚动自己的过滤器实现不是一个好主意。在我的头上,您的实现未处理预检请求,这可能是您当前面临的问题之一。