无法使用 spring mvc 和 $http 访问 CORS 环境中的自定义标头

Posted

技术标签:

【中文标题】无法使用 spring mvc 和 $http 访问 CORS 环境中的自定义标头【英文标题】:Unable to access a customized header in CORS environment using spring mvc and $http 【发布时间】:2017-01-04 15:00:52 【问题描述】:

我对上述问题进行了广泛搜索,但找不到可行的解决方案。 请查看一些 imp 代码并提出建议。

// My factory method that returns a promise 
contactBackend : function(requestedMethod, requestedUrl,
                        requestedData) 
                    return $http(
                        method : requestedMethod,
                        url : backend + requestedUrl,
                        data : requestedData
                    );
                

//Actual Login method that calls the 
loginC.validateLogin = function() 
                welcomeMFactory.contactBackend("POST", "/rs/login",
                        loginC.user).then(
                        function(success) 
                            var msg = success.data.loginMsg;
                            if (msg == "login.valid") 
                                alert(JSON.stringify(success));
                                welcomeMFactory.moveToWidget("/home");
                             else 
                                loginC.error = welcomeMFactory.printMsg(
                                        true, msg);
                            
                        ,
                        function(error) 
                            loginC.error = welcomeMFactory.printMsg(true,
                                    "Unable to reach backend for login");
                        );
            

// SpringController.xml

<mvc:cors>
    <mvc:mapping path="/**" allowed-origins="http://localhost:8080"
        allowed-headers="content-type,authentication" exposed-headers="content-type,authentication" />
</mvc:cors>

//登录控制器

@Autowired
private LoginRespI response;

@Autowired
private ProxyHandler proxyHandler;

@Autowired
private LoginServiceImpl loginServiceImpl;

@RequestMapping(method = RequestMethod.POST)
public LoginRespB authenticateUserLogin(@RequestBody LoginReqB request, HttpServletResponse resp) 

    LoginDTO loginDTO = loginServiceImpl.validateLoginService(request.getUsername(), request.getPassword());
    if (loginDTO != null) 
        response.setLoginMsg("login.valid");
     else 
        response.setLoginMsg("login.invalid");
    

    Claims claims = Jwts.claims().setSubject("ABCDE");
    claims.put("ID", "12345");
    String toke = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, "ABCDE").compact();
    resp.setHeader("Authentication", "Bearer: " + toke);

    return (LoginRespB) (proxyHandler.getTargetObject(response));

OPTIONS req/resp headers

Login req/resp headers

【问题讨论】:

仍然无法解决这个问题...有什么建议吗..? 【参考方案1】:

将此方法添加到您的代码中,它将允许跨域请求

package org.codingpedia.demo.rest.util;

import java.io.IOException;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.MultivaluedMap;

public class CORSResponseFilter
implements ContainerResponseFilter 

public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
        throws IOException 

    MultivaluedMap<String, Object> headers = responseContext.getHeaders();

    headers.add("Access-Control-Allow-Origin", "*");
    //headers.add("Access-Control-Allow-Origin", "http://podcastpedia.org"); //allows CORS requests only coming from podcastpedia.org       
    headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");          
    headers.add("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-Codingpedia");



【讨论】:

感谢您的输入......但请澄清......我的代码有什么问题......?

以上是关于无法使用 spring mvc 和 $http 访问 CORS 环境中的自定义标头的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring MVC 和 Spring Security 进行 404 注销

异常无法在 Spring MVC 中验证目标的证书

JBoss 上带有 SockJS 的 Spring-MVC Websocket:如果没有 IO 事件,无法从 HTTP/1.1 升级

无法让 @Secured 在 Spring MVC 中工作

Spring MVC 测试框架因 HTTP 响应 406 而失败

Spring 4 MVC,警告:在 DispatcherServlet 中找不到带有 URI 的 HTTP 请求的映射,名称为 [...] 和 HTTP 404 错误