java - 在 REST 服务中使用 ContainerResponse 过滤器时,GET 有效,但 POST 无效?

标签 java javascript ajax rest same-origin-policy

我开始将我的软件从 Primefaces 更改为 HTML5 客户端-服务器解决方案。

问题:使用 POST 时同源策略失败,但使用 GET 时它有效。

网络服务

@POST
@Override
@Consumes({"application/xml", "application/json"})
public void create(Users entity) {
    super.create(entity);
}

@GET
@Override
@Produces({"application/xml", "application/json"})
public List<Users> findAll() {
    return super.findAll();
}

过滤

public class CrossOriginResourceSharingFilter implements ContainerResponseFilter {


public ContainerResponse filter(ContainerRequest request, ContainerResponse response) {
    response.getHttpHeaders().putSingle("Access-Control-Allow-Origin", "*");
    response.getHttpHeaders().putSingle("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
    response.getHttpHeaders().putSingle("Access-Control-Allow-Headers", "content-type");
    return response;
}

}

WEB.XML

<init-param>
        <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
        <param-value>entity.CrossOriginResourceSharingFilter</param-value>
    </init-param>

客户端

 <form id="register-form"> 


                    <div class="register-form-block">
                        <input type="text" value='Your first name' name="firstName" id="firstName"/>
                    </div> 


                    <div class="register-form-block">
                        <input type="text" value='Your surname' name="lastName" id="lastName" onclick="this.value = ('')" />
                    </div>

                    <div class="register-form-block">
                        <input type="text" value='Username' name="username" id="username" onclick="this.value = ('')"/>
                    </div>
                    <div class="register-form-block">
                        <input type="password" value='Password' name="password" id="password" onclick="this.value = ('')"/>
                    </div>
                    <div class="register-form-block">
                        <input type="password" value='Password again' name="passwordagain" onclick="this.value = ('')"/>
                    </div>

                    <button type="submit" class="btn btn-primary" id="btnAddUser" onclick="foo()">Register</button>

                </form>
<script>
       function foo(){

    alert('Button pressed');

        $.ajax({
            type: 'POST',
            contentType: 'application/json',
            url: 'http://127.0.0.1:8080/testsoft/webresources/entity.users/',
            dataType: "json",
            data: formToJSON(),
            success: function(data, textStatus, jqXHR) {
                alert('User created successfully');

            },
            error: function(jqXHR, textStatus, errorThrown) {
                alert('addUser error: ' + textStatus +' ERROR:'+ errorThrown);
            }
        });
    };


        function formToJSON() {
        alert($('#username').val());
                return JSON.stringify({
                        "username": $('#username').val(),
                        "firstName": $('#firstName').val(),
                        "lastName": $('#lastName').val(),
                        "password": $('#password').val(),
                        
                    });
        }
    </script>

错误

 Failed to load resource: the server responded with a status of 500 (Internal Server Error) (22:49:54:618 | error, network)
  at http://localhost:8080/testsoft/webresources/entity.users/
XMLHttpRequest cannot load http://localhost:8080/testsoft/webresources/entity.users/. Origin http://localhost:8383 is not allowed by Access-Control-Allow-Origin. (22:49:54:618 | error, javascript)

另一个解决方案不起作用,根本没有错误消息

function foo(){

    alert('Button pressed');
        console.log('#####################addUser################################');

        $.ajax({
            type: "POST",
            contentType: "application/json",
            url: "http://127.0.0.1:8080/testsoft/webresources/entity.users/",
            dataType: "json",
            data: {"username":"UllaUser","password":"testpwd","firstName":"Unto","lastName":"lastnameson","nickName":null,"isAdmin":false,"isCustomer":false,"isGuest":false,"isActive":true,"isInvemailsent":false,"isInvCardSent":null,"inSaveDateSent":false,"isThankCardSent":false,"weddingAsUser":false,"hasGuestUsers":false,"userRole":null,"email":null,"createDate":null,"turnout":null,"lastUpdated":1360240740000,"secretQuestion":null,"secretAnswer":null,"weddingWeddingId":null,"languageLanguageId":null,"invitationInvitationId":null,"emailEmailId":null,"addressAddressId":null},

        success: function(data){  

    // we have the response  
            alert("Server said:\n '" + data.username + "'");

            },
            error: function(data) {

    alert('addUser error: ' + data.username);
            }
        });
    };

最佳答案

这可能是因为某些浏览器(如 Chrome)沙箱 localhost。尝试插入您的 ip 而不是 localhost,看看是否有任何作用。

关于java - 在 REST 服务中使用 ContainerResponse 过滤器时,GET 有效,但 POST 无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14781484/

相关文章:

java - 检查连接 Redis

java - 在 Gradle 中禁用静态库构建

Java eclipse 路径文件可执行文件

javascript - 跨域获取CSV文件

ASP.net 表单复式输入

java - 更改条形图的 SeriesPaint

javascript - 调用 RegisterStartupScript 时出现 "Object expected"错误

javascript - 如何在 JavaScript Promise 中将一个 then() block 的结果传递到下一个 then() block ?

javascript - 'session' is undefined - Este JS/Express/Redis for session store

javascript - 即使字段为空也会执行mysql查询