我有一个在Spring版本4.3.4上使用Java后端的老项目。发布和Spring Security版本4.2.2。释放没有办法更新这些库,我必须使用现有的库。该项目不是REST API,没有RestController或WebMVCConfiguer。所以,我按照这里的建议配置了cors:
@EnableWebSecurity
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
protected SecurityConfiguration() {
super();
}
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
// we don't need CSRF because our token is invulnerable
.csrf().disable()
// don't create session
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
.authorizeRequests()
// allow anonymous resource requests
.antMatchers(HttpMethod.GET,
"/",
"/*.html",
"/favicon.ico",
"/**/*.html",
"/**/*.css",
"/**/*.js")
.permitAll()
.antMatchers(HttpMethod.POST, "/rpc/*").permitAll()
.anyRequest().permitAll();
httpSecurity.addFilterBefore(new CorsFilter(), ChannelProcessingFilter.class);
// disable page caching
httpSecurity.headers().cacheControl();
}
}
Cors过滤器:
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter extends OncePerRequestFilter {
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(CorsFilter.class);
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
logger.error("CORS filter: " + request.getMethod());
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With, xsrf-token");
response.addHeader("Access-Control-Expose-Headers", "xsrf-token");
if ("OPTIONS".equals(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
} else {
filterChain.doFilter(request, response);
}
}
}
在网上。xml在所有上下文参数之后和列表器之前(这是应用程序中唯一的过滤器):
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>web.servlet.response.CorsFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我在localhost:8080上运行后端,在localhost:8081上运行前端。然而,当我试图发送包含application/json的POST请求时,浏览器控制台中出现了一个错误
Access to XMLHttpRequest at 'http://localhost:8080/rpc' from origin 'http://localhost:8081' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
此外,我希望在后端看到日志“CORS过滤器: POST”,我把它放在那里检查它是否会进入过滤器,但是没有这样的日志。
请问,有什么建议说明为什么它不起作用吗?我需要在请求中坚持使用application/json,而且有时在应用程序中也有一个授权头,所以不能完全避免cors。这会是一个角度2的问题吗?
此错误是拒绝选项web方法的结果,因此应在configure方法中添加以下语句:
.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
就像这样:
httpSecurity
// we don't need CSRF because our token is invulnerable
.csrf().disable()
// don't create session
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
.authorizeRequests()
// allow anonymous resource requests
.antMatchers(HttpMethod.GET,
"/",
"/*.html",
"/favicon.ico",
"/**/*.html",
"/**/*.css",
"/**/*.js")
.permitAll()
.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.antMatchers(HttpMethod.POST, "/rpc/*").permitAll()
.anyRequest().permitAll();
我不熟悉spring或java,但我认为我理解这个问题。
我假设您的日志过滤器不起作用,因为spring framework在执行过滤器之前短路了该请求。
这里的问题可能在配置中的某个地方,但我认为解决给定问题的方法总体上是不正确的。
CORS是为某些目的而创建的,通过允许来自所有其他来源的浏览器请求,您实际上会产生一些潜在的安全问题。
理想情况下,如果“服务器”和“客户端”都是你的应用程序,那么从客户端,你应该只向托管客户端应用程序的同一来源发出请求。因此,在本地情况下,它应该向localhost:8081
发出请求,您可以在发出请求时省略客户端的主机基址。
为了让它工作,对于开发环境,最好的选择是为角设置代理(从localhost:8081
到localhost:8080
的代理请求),详细的设置信息在这里。
对于生产环境,您需要在同一来源上托管后端服务器/客户端应用程序。你可以通过在你的后端服务器/客户端web服务器前面安装一些代理服务器,或者直接在你的后端服务器上托管客户端应用程序(角度静态输出文件)。
另一种选择是执行您尝试执行的操作,但不允许来自所有来源的请求(不是.permitAll()
),而是列出特定的允许来源(如localhost:8081
)。但它并没有那么干净,而且您需要为开发环境和生产指定不同的来源。
问题内容: 我正在学习角度。我不明白onLoad和ng-init之间的变量初始化有什么区别。它在哪个范围内创建此变量。 也请给我一些关于隔离范围的想法。 问题答案: 是,可以放置内的指令的,的,不管,而是一个属性特定于指令其功能如同一个。要了解我的意思,请尝试以下操作: 您会看到只有第二个出现。 隔离范围是一个原型,它不从其父范围继承。用外行的术语来说,如果您有一个小部件不需要任意读写父作用域,则
我正在尝试使用Spring Security(4.1.3)和Angular 2.0.1实现CSRF保护 相关话题的来源很多,但我找不到明确的说明。有些说法甚至相互矛盾。 我读过关于springs的操作方法(尽管指南中描述了Angular 1 way)Spring Security guide,其中包含Angular,即
我有一个在8888端口上运行的Spring Boot后端应用程序和一个在4200端口上运行的Angular前端应用程序。 在我的Spring Boot应用程序中,我定义了以下bean来处理CORS: 我的配置如下所示: 通过这种配置,一切正常,我可以从Angular应用程序成功调用我的API。 但我想启用CSRF,所以我将安全配置更改为: 我在Angular应用程序中添加了以下: 问题是始终返回。
我试图连接到Cassandra从我的Spring Boot应用程序使用Spring Boot数据cassandra。我有两个疑问。 1)是否建议使用CassandraAutoConfiguration,即在application.properties中提供带有前缀(spring.data.cassandra.*)的所有Cassandra配置,以便我的应用程序为我创建一个集群,或者我需要手动创建集群
我对可观察量很陌生。如何仅从一个简单的字符串创建可观察的?然后订阅它并在它发生变化时输出它。 这有意义吗? 我在谷歌搜索上一点运气都没有。可能是错误的关键字? 添加一些代码以更好地解释: 我想我在这里做错了什么?但不知道怎么问。我将不胜感激的任何解释。
> 到目前为止,我使用角2快速入门创建了一个新项目。 我决定开始使用angular 2 cli,并创建了一个新的angular 2 cli项目。 移动了我的所有文件并重新安装了所有软件包。 现在,当我试图在CLI项目中使用角2材料时,我遵循了这里的指南,但这是我得到的: 会出什么问题?