gpt4 book ai didi

java - CORS 过滤器不适用于 Java + angularjs

转载 作者:行者123 更新时间:2023-11-30 03:34:27 24 4
gpt4 key购买 nike

我使用 Java 作为后端(RESTful 服务),使用 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>

RESTful 服务:

@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;
});

每次我在 RESTful 服务中检查 getUserPrincipal() 时,我都会将其设置为 null。当我的 java 和 angularjs 部署在同一服务器和端口上时 - 一切正常。如何让它在不同的端口上工作?

最佳答案

我在之前的一个 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>

关于java - CORS 过滤器不适用于 Java + angularjs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28319347/

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