将访问控制允许起源添加到Web服务


问题内容

我有一个像这样的网络服务:

@Controller
@RequestMapping("/")
public class ApplicationController {

    @RequestMapping(value="/Changes", method = RequestMethod.GET)
    public String inspect(ModelMap model) {
         model.addAttribute("msg", "example");

         return "index";
    }
}

在链接中: "localhost:8081/ChangesPDF/Changes?..."

我试图通过链接Alfresco获得此Web服务的响应"localhost:8080/share"。我现在有不同的端口(当我有相同的端口时,这很好用),因此,使用不同的端口,我会在Alfresco中看到错误:

跨域请求被阻止:同源策略禁止读取http://
localhost:8081 / ChangesPDF /
Changes

?…上的远程资源(原因:标头CORS’Access
-Control-Allow-Origin’丢失)。

如何添加此标头?


问题答案:

您应该添加一个过滤器,将“ Access-Control-Allow-Origin”设置为接受域“ localhost:8081”(全部为*)。

更多说明:

首先创建一个过滤器类

public class CorsFilter implements Filter {

    private static final Logger log = Logger.getAnonymousLogger();

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpServletRequest request = (HttpServletRequest) servletRequest;

        // can be moved to properties
        String[] allowDomain = {"localhost:8080","localhost:8081"};


        String originHeader = request.getHeader("host");

        for(String domian : allowDomain){

            if(originHeader.endsWith(domian))

            response.setHeader("Access-Control-Allow-Origin", originHeader);
            break;
        }
        filterChain.doFilter(servletRequest, servletResponse);

    }

    @Override
    public void destroy() {}
}

将映射添加到您的web.xml类

<filter>
    <filter-name>cors</filter-name>
    <filter-class>full name of your filter class here</filter-class>
</filter>

<filter-mapping>
    <filter-name>cors</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

您应该根据需要在web.xml配置中正确定义URL模式