2015-02-04 2 views
1

Java를 백엔드 (RESTful 서비스)로, Angularj를 프런트 엔드로 사용하고 있습니다. 문제는 백 엔드 및 프런트 엔드 응용 프로그램이 다른 포트에 있으므로 CORS 필터를 사용해야한다는 것입니다.Java + angularjs에서 CORS 필터가 작동하지 않습니다.

import java.io.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 

public class CORSFilter implements Filter { 

    public CORSFilter() { 
    } 

    public void init(FilterConfig fConfig) throws ServletException { 
    } 

    public void destroy() { 
    } 

    public void doFilter(
     ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 

     ((HttpServletResponse) response).addHeader("Access-Control-Allow-Origin", "*"); 
     ((HttpServletResponse) response).addHeader("Access-Control-Allow-Methods", "Cache-Control, Pragma, Origin, Authorization, Content-Type, X-Requested-With"); 
     ((HttpServletResponse) response).addHeader("Access-Control-Allow-Headers", "GET, PUT, OPTIONS, X-XSRF-TOKEN"); 

     chain.doFilter(request, response); 
    } 
} 

의 web.xml :

<filter> 
    <filter-name>CORSFilter</filter-name> 
    <filter-class>com.company.companyserver.CORSFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>CORSFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

편안하고 서비스를 : 그것은 다음과 같습니다

@POST 
@Path("login") 
@Produces("application/json") 
public Response login(@Context HttpServletRequest req, UserTable user) { 
    req.getSession(true); 
    if (req.getUserPrincipal() == null) { 
     try { 
      req.login(user.getUsername(), user.getPassword()); 
     } catch (ServletException e) { 
      return Response.status(Response.Status.BAD_REQUEST).type("text/plain").entity("Login or Password is incorrect").build(); 
     } 
    } else { 
     return Response.status(Response.Status.OK).type("text/plain").entity("You are already logged in").build(); 
    } 
    return Response.status(Response.Status.OK).type("text/plain").entity("Login successfull").build(); 
} 

@GET 
@Path("logout") 
@Produces("application/json") 
public Response logout(@Context HttpServletRequest req) { 
    try { 
     req.logout(); 
     req.getSession().invalidate(); 
    } catch (ServletException e) { 
     return Response.status(Response.Status.BAD_REQUEST).type("text/plain").entity("Can not logout").build(); 
    } 
    return Response.status(Response.Status.OK).type("text/plain").entity("Logout successfull").build(); 
} 

프런트 엔드 :

$http.post(apiUrl + 'usertable/login', { 
     username: 'admin', 
     password: 'admin' 
    }); 

    $http.get(apiUrl + 'usertable/logout').success(function (a) { 
     var o = a; 
    }); 

내가 대해 getUserPrincipal 확인마다() 내 RESTful의 나는 그것을 null과 같게 만든다. 내 java 및 angularjs가 동일한 서버 및 포트에 배포되면 모든 것이 잘 작동합니다. 다른 포트에서 작동하도록 만드는 방법은 무엇입니까?

답변

1

나는 이전 Java 프로젝트 중 하나에서 CORS를 사용했습니다. 거기에서 나는 org.apache.catalina.filters.CorsFilter을 사용하고 있었고 그것은 잘 동작하고있었습니다.

아래의 코드가 작동하면 시도해보십시오. 모든

<filter> 
     <filter-name>CorsFilter</filter-name> 
     <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> 
     <init-param> 
      <param-name>cors.allowed.origins</param-name> 
      <param-value>*</param-value> 
     </init-param> 
     <init-param> 
      <param-name>cors.allowed.methods</param-name> 
      <param-value>GET,POST,HEAD,OPTIONS,PUT,DELETE</param-value> 
     </init-param> 
     <init-param> 
      <param-name>cors.allowed.headers</param-name> 
      <param-value>Content-Type,X-Requested-With,Accept,Accept-Encoding,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value> 
     </init-param> 
    </filter> 
    <filter-mapping> 
     <filter-name>CorsFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
+0

작동하지 않음 - getUserPrincipal()이 여전히 null입니다. –

1

먼저 여기에 오류가 있습니다

((HttpServletResponse) response).addHeader("Access-Control-Allow-Methods", "Cache-Control, Pragma, Origin, Authorization, Content-Type, X-Requested-With"); 
((HttpServletResponse) response).addHeader("Access-Control-Allow-Headers", "GET, PUT, OPTIONS, X-XSRF-TOKEN"); 

헤더는 "캐시 제어,에서 Pragma는, 원점, 인증, 콘텐츠 형식은, X는 --으로 요청 된"및이 방법 "얻으십시오, 놓으십시오, 선택권, X-XSRF-TOKEN".

먼저 시도해보십시오.

관련 문제