【问题标题】:Struts2 Ajax CORSStruts2 Ajax CORS
【发布时间】:2016-07-06 10:22:16
【问题描述】:

我正在尝试从另一个域调用我的 struts2 操作调用。 Struts2 在 localhost:8080 上,而将进行 ajax 调用的人在另一个 localhost:3000 上。我尝试将sample.json 文件放在web 文件夹下的struts2 项目文件夹中,我可以对sample.json 文件进行ajax 调用。但问题是,当我尝试向我的操作类请求时,我收到一条错误消息:

XMLHttpRequest cannot load http://localhost:8080/workforce/loginAction. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access.

我的问题是,我可以对同一项目http://localhost:8080/sample.json下的示例 json 文件进行 ajax 调用,但不能使用我的 struts2 动作类?

Struts2 动作:

package com.workforce.actions;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.workforce.models.UserModel;

public class LoginAction extends ActionSupport implements ModelDriven<UserModel>{

/**
 * 
 */
private static final long serialVersionUID = 1L;
private UserModel user = new UserModel();

@Override
public String execute() throws Exception {
    // TODO Auto-generated method stub

    user.setEmail("sampleemail");
    user.setPassword("12345");

    System.out.println(user.getEmail());
    System.out.println(user.getPassword());

    return SUCCESS;
}

@Override
public UserModel getModel() {
    // TODO Auto-generated method stub
    return user;
}
}

struts2 xml

<struts>
<constant name="struts.devMode" value="true" />

<package name="default" extends="struts-default, json-default">

    <interceptors>
        <interceptor-stack name="myStack">
            <interceptor-ref name="defaultStack" />
            <interceptor-ref name="json" />
        </interceptor-stack>
    </interceptors>

    <action name="loginAction" class="com.workforce.actions.LoginAction">
        <interceptor-ref name="myStack" />
        <result name="success" type="json"/>

        <result name="input" type="json">
            <param name="statusCode">500</param>
            <param name="errorCode">500</param>
        </result>
    </action>
</package>

web.xml

<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</param-value>
    </init-param>
    <init-param>
        <param-name>cors.allowed.headers</param-name>
        <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
    </init-param>
    <init-param>
        <param-name>cors.exposed.headers</param-name>
        <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
    </init-param>
    <init-param>
        <param-name>cors.support.credentials</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>cors.preflight.maxage</param-name>
        <param-value>10</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
    <filter-name>struts2</filter-name>
    <filter class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

Ajax 调用

var request = {
            url: "http://localhost:8080/workforce/loginAction",
            method: "POST",
            headers:{
                "Content-Type": "application/json"
            },  
            data: {
                user: self.user
            }
        };

        $http(request).then(function(response){
            console.log(response);
        });

更新

我尝试在 web.xml 中注释掉我的 struts2 配置并创建一个示例 servlet。它确实有效!我只想知道如何配置CorsFilterStruts2 Filter

【问题讨论】:

  • localhost:8080/workforce/sample.json 这个网址有效,我可以检索其中的数据。
  • 实际上,我已经在我的 web.xml 中添加了它,我只是没有把它放在那里,但我已经更新了我的答案以显示我的 S2 配置。我需要在我的动作类上实现 CorsFilter 吗?我只是把它放在我的 web.xml 中,然后什么都没有。
  • 您需要调试才能看到 -> 您的 CorsFilter 是否被要求执行操作 url? json文件的url呢?
  • 它是tomcat应用服务器的一部分吧? action url和json文件url有区别吗?
  • 您确定您的 web.xml 与您显示的完全相同吗?

标签: java ajax struts2


【解决方案1】:

过了一会儿,我通过将CorsFilter 放在首位而不是Struts2 Filter 解决了这个问题。现在可以了。谢谢。

【讨论】:

  • 这就是为什么会有评论:你确定你的 web.xml 和你显示的完全一样吗?
  • 我的错,我刚刚在您请求时添加了 struts2 配置。但是,最初它位于 CorsFilter 之上。谢谢
【解决方案2】:

你可以在struts中检查CORS的解决方案。这是一个简单的演示应用程序,解决了struts2中的CORS问题。

https://github.com/rohitmehlawat/struts-cors

【讨论】:

    猜你喜欢
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2014-03-08
    • 2015-08-10
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    相关资源
    最近更新 更多