`

java服务器端解决跨域问题

    博客分类:
  • java
 
阅读更多

现在很多开发的API都支持ajax直接请求,这样就会导致跨域的问题,解决跨域的问题一方面可以从前端,另一方面就是服务器端。 
既然是搞服务器端,做对外的API服务,当然是做到越简单越好,前端只需要傻傻的使用就好。

目前我接触来的情况是有2种实现方式,下面直接代码,你们根据自己项目情况,选择或者修改其中的代码,所有代码都是项目实战中运行的。 
第一种情况,比较简单,让所有的controller类继承自定义的BaseController类,改类中将对返回的头部做些特殊处理。

public abstract class BaseController {
  /**
     * description:send the ajax response back to the client side
     * @param responseObj
     * @param response
     */
    protected void writeAjaxJSONResponse(Object responseObj, HttpServletResponse response) {
        response.setCharacterEncoding("UTF-8");

        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1
        response.setHeader("Pragma", "no-cache"); // HTTP 1.0

        /**
         * for ajax-cross-domain request TODO get the ip address from
         * configration(ajax-cross-domain.properties)
         */
        response.setHeader("Access-Control-Allow-Origin", "*");

        response.setDateHeader("Expires", 0); // Proxies.

        PrintWriter writer = getWriter(response);

        writeAjaxJSONResponse(responseObj, writer);
    }
  /**
     *
     * @param response
     * @return
     */
    protected PrintWriter getWriter(HttpServletResponse response) {
        if(null == response){
            return null;
        }

        PrintWriter writer = null;

        try {
            writer = response.getWriter();
        } catch (IOException e) {
            logger.error("unknow exception", e);
        }


        return writer;
    }

    /**
     * description:send the ajax response back to the client side.
     *
     * @param responseObj
     * @param writer
     * @param writer
     */
    protected void writeAjaxJSONResponse(Object responseObj, PrintWriter writer) {
        if (writer == null || responseObj == null) {
            return;
        }
        try {         writer.write(JSON.toJSONString(responseObj,SerializerFeature.DisableCircularReferenceDetect));
        } finally {
            writer.flush();
            writer.close();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

接下来就是我们自己业务的controller了,其中主要是要调用 writeAjaxJSONResponse(result, response);这个方法

@Controller
@RequestMapping(value = "/account")
public class AccountController extends BaseController {
@RequestMapping(value = "/add", method = RequestMethod.POST)
    public void addAccount(HttpSession session,HttpServletRequest request,HttpServletResponse response){
        ViewerResult result = new ViewerResult();
         //实现自己业务逻辑代码
        writeAjaxJSONResponse(result, response);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
    好了,这种简单的方式就实现了。

    接下来介绍第二种方式,filter。我们在写springMVC的时候,更喜欢的方式是通过@ResponseBody给返回对象进行封装直接返回给前端,这样简单而且容易。
    如果使用@ResponseBody就不能使用第一种方法了,所有就使用filter给所有的请求都封装一下跨域,接下来直接实现代码:
import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

public class HeadersCORSFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse servletResponse,
            FilterChain chain) throws IOException, ServletException {
         HttpServletResponse response = (HttpServletResponse) servletResponse;
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
            response.setHeader("Access-Control-Max-Age", "3600");
            response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization");
            response.setHeader("Access-Control-Allow-Credentials","true");
            chain.doFilter(request, servletResponse);

    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

好了,filter实现了,然后就是要在web.xml里面把这个filter运用起来了。 
打开项目的web.xml,填写下面的几行代码:

    <filter>
      <filter-name>cors</filter-name>
      <filter-class>xxx.xxxx.xxxxx.xxxx.HeadersCORSFilter</filter-class><!--你过滤器的包 -->
    </filter>
    <filter-mapping>
      <filter-name>cors</filter-name>
      <url-pattern>/open/*</url-pattern><!-- 你开放的接口前缀  -->
    </filter-mapping>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
    好了,通过上面的2种方式,可以解决百分之80的跨域问题,也许还有更好的解决方案,可以提出来大家一起学习学习。
    最好的方案是最符合当前需求且易于扩展的。
分享到:
评论

相关推荐

    java服务器端解决跨域问题共6页.pdf.zip

    Java服务器端解决跨域问题是一项常见的任务,尤其是在开发Web应用时。跨域是由于浏览器的安全策略,即同源策略(Same-Origin Policy)所引起的。同源策略限制了来自不同源的HTTP请求,防止恶意网站通过JavaScript...

    Java服务器端跨域问题解决方案

    Java服务器端跨域问题解决方案 Java 服务器端跨域问题解决方案是指在 Java 服务器端如何解决跨域问题的解决方案。跨域问题是指在 Ajax 请求中,因为安全限制,浏览器不能将数据发送到不同源(domain、protocol 或 ...

    Tomcat配置解决跨域问题

    Tomcat跨域解决方案通常涉及添加CORS过滤器。CORS Filter是一个可以处理HTTP响应头,以允许跨域请求的组件。下载并导入`CORS.jar`到Tomcat的`lib`目录。 2. **配置web.xml**: 打开`conf/web.xml`文件,添加以下...

    解决javaweb端跨域问题的jar包和文档

    总之,解决Java Web端的跨域问题通常涉及到理解同源策略、CORS机制,以及如何在特定的开发框架中配置和实现跨域支持。提供的jar包和文档是解决这个问题的有效工具,通过它们可以简化这个过程并确保跨域请求的成功。

    6种解决跨域的方案

    JSONP是一种较旧的跨域解决方案,适用于支持JavaScript的浏览器。它利用HTML的`&lt;script&gt;`标签可以跨域加载资源的特性。服务器提供一个动态生成的JavaScript函数,将数据包裹在函数调用中返回,客户端预先定义好这个...

    解决跨域问题方案实例

    本文将详细解析跨域问题及其解决方案,重点关注JavaScript中的Ajax请求,并结合Java环境下的处理策略。 首先,我们需要理解“浏览器限制”是什么。浏览器出于安全考虑,实施了一项名为同源策略(Same-Origin Policy...

    js解决跨域访问问题

    ### JS解决跨域访问问题详解 #### 一、引言 在现代Web开发中,跨域访问问题是开发者经常面临的一个挑战。特别是在使用JavaScript进行前后端交互时,由于浏览器的同源策略限制,开发者经常会遇到跨域问题。本文将...

    Ajax跨域问题及其解决方案.docx

    这是目前最常用的跨域解决方案之一,主要通过在服务端添加CORS(Cross-Origin Resource Sharing)配置来实现。 - **服务端配置示例**(Java): ```java @Configuration public class CorsConfig implements ...

    arcgis js跨域解决策略

    5. **其他策略**:除了使用Resource Proxy,还可以通过CORS(Cross-Origin Resource Sharing)配置ArcGIS Server允许跨域请求,但这需要服务器端权限,并且不适用于所有情况。 通过以上策略,你可以成功地在.NET或...

    JAVA的AJAX跨域访问

    ### JAVA的AJAX跨域访问:深入解析与解决方案 ...在实际开发中,开发者应根据具体需求和场景选择最合适的跨域解决方案,同时也要注意安全性和性能的平衡,避免因跨域设置不当而引入安全隐患或影响系统性能。

    Java跨域使用jar

    前端(通常是JavaScript)与后端(Java服务器)进行交互时,由于浏览器的安全策略,可能会遇到“跨域资源共享”(CORS,Cross-Origin Resource Sharing)限制。这是因为浏览器遵循同源策略,只允许与同一源(协议+...

    xmlhttp跨域解决方案

    为了解决这一问题,我们可以采用多种跨域解决方案,其中一种是通过设置代理服务器。 **一、什么是同源策略** 同源策略是浏览器为了保护用户安全而实施的一种安全策略,它规定浏览器只允许加载来自相同协议、域名和...

    解决 springboot跨域请求问题

    Nginx可以配置为将前端和后端的请求路由到相应的服务器,从而隐藏真实的服务器地址,同时也解决了跨域问题。在Nginx配置文件中,你可以添加一个新的location块来代理后端服务。例如: ```nginx location / { ...

    lex for arcgis java tomcat环境不能跨域问题 (安全沙箱问题2048

    解决跨域问题的一种常见方法是通过在服务器端设置`crossdomain.xml`文件。此文件定义了哪些域的请求被允许访问服务器资源。`crossdomain.xml`的结构如下: ```xml &lt;!DOCTYPE cross-domain-policy SYSTEM ...

    解决ajax跨域问题

    具体来说,服务器端需要能够从请求中获取到`callback`参数,并将数据包装成一个函数调用的形式返回给客户端。例如,在Java环境下可以这样实现: ```java @RequestMapping(value="/getGroupById") public String ...

    解决tomcat跨域问题的jar包

    本篇文章将详细探讨如何利用提供的jar包——cors-filter-1.7.jar 和 java-property-utils-1.9.jar来解决Tomcat服务器上的跨域问题。 跨域(Cross-Origin)是浏览器的一种安全机制,它限制了JavaScript只能向同源...

    Tomcat解决跨域的两个jar包java-property-utils-1.9.jar和cors-filter-1.7.jar

    `allowed.methods`指定了允许的HTTP方法,`allowed.headers`指定了允许客户端发送的自定义头部,`allow.credentials`表示是否允许携带cookie,`exposed.headers`指定了服务器端可以暴露给客户端的头部。 3. 使用`...

    java 请求跨域问题解决方法实例详解

    为了解决这个问题,开发者需要在服务器端进行适当的配置来允许特定或所有来源的跨域请求。 在Java中,处理跨域问题通常涉及修改响应头,以允许特定的跨域请求。在提供的代码实例中,我们可以看到一个简单的实现方法...

Global site tag (gtag.js) - Google Analytics