2017-07-26 48 views
0

工作,我有一个Spring应用程序启动与RestController,自定义的安全过滤器和角2应用程序从春季服务请求数据。春季启动角2和访问控制允许来源不上服务器

由于访问控制允许来源发行我有一个过滤器,其设置报头。

如果我叫本地主机也能正常工作:4200为localhost:8080,但它不从本地主机的工作:4200一些IP XX.XX.XX.XX:8080。

所以有人有一个想法?

这里我筛选:

@Component 
public class MyCorsFilter implements Filter { 

    public MyCorsFilter() { 
     System.out.println("init filter corsssss"); 
    } 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 

     HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 

     response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); 
     response.setHeader("Access-Control-Allow-Credentials", "true"); 
     response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); 
     response.setHeader("Access-Control-Max-Age", "3600"); 
     response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me"); 

     chain.doFilter(req, res); 
    } 

    @Override 
    public void init(FilterConfig filterConfig) { 
    } 

    @Override 
    public void destroy() { 
    } 
} 
+0

看来这仅仅是一个“本地主机”行为,如果我在服务器上部署了Spring启动应用程序和角度应用程序,那么过滤器运行良好并设置了访问控制标题。 – deadpoint

回答

0

我有同样的probleme。

在你的控制器试试这个:

@Context 
private HttpServletResponse servletResponse; 

private void allowCrossDomainAccess() { 
    if (servletResponse != null) { 
     servletResponse.setHeader("Access-Control-Allow-Origin", "*"); 
    } 
} 

然后在你的POST/GET了Methode:

@CrossOrigin 
@RequestMapping(value = "/login", method = RequestMethod.POST, consumes = "application/json") 
public boolean loginController(@RequestBody User user) throws JSONException, NoSuchAlgorithmException, UnsupportedEncodingException { 

    allowCrossDomainAccess(); 
    return userService.login(user); 
} 

最好的问候,

+0

首先,有没有什么不同,在服务器上它不工作 - 只是在本地主机,第二它不是一个精解,应该有一组通用的头 – deadpoint

0

这是一项安全功能。相反,让您应该控制任何来源谁可以访问您的内容,在春季的:

@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
... 
@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http.csrf().csrfTokenRepository(csrfTokenRepository()); 
} 
    ... 
@Bean 
public CsrfTokenRepository csrfTokenRepository() { 
    CookieCsrfTokenRepository repository = new CookieCsrfTokenRepository(); 
    repository.setHeaderName("X-XSRF-TOKEN"); 
    repository.setCookieHttpOnly(false); 
    return repository; 
} 

然后在角度变化的app.module.ts

import { HttpModule, XSRFStrategy, CookieXSRFStrategy } from '@angular/http'; 

export function xsrfFactory() { return new CookieXSRFStrategy('XSRF-TOKEN', 'x-xsrf-token'); } 
... 
    providers: [ 
    ... 
     { provide: XSRFStrategy, useFactory: xsrfFactory }, 
... 

这样你的REST调用将有饼干参数附加。

或者你可以做到这一点 - 我不建议,但如果你不想担心现在这种权利也可能是有用的:

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http.csrf().disable(); 
} 
+0

的是有一个完整的工作示例这个解决方案? – deadpoint

+0

我不知道是否有完整的Spring Boot to Angular示例,即使有,它甚至可能不是您想要的Spring版本或您想要的Angular版本。我建议寻找到建立安全上下文,因为我上面所解释的,然后在转角,你只需要添加一块上面代码的'XSRFStrategy'。如果您还检查浏览器REST调用:检查请求/响应的标题,并且您应该在那里看到xcsrf标记。请注意我将Angular2应用程序部署到Tomcat中,我不记得允许的访问控制是否在节点服务器上工作。 – nuvio

相关问题