java跨域请求的方式

Posted 逆思维

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java跨域请求的方式相关的知识,希望对你有一定的参考价值。

1、基于servlet和过滤器的方式

/**
 * 设置跨域请求相关参数的过滤器
 * @Author LQY
 * @Date 2018/12/3
 */
@WebFilter("/*")
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest)request;
        HttpServletResponse resp = (HttpServletResponse)response;
        req.setCharacterEncoding("utf-8");
        //设置哪些域可以跨域访问,*代表所有域
        resp.setHeader("Access-Control-Allow-Origin","*");
        //设置支持那种访问方法
        resp.setHeader("Access-Control-Allow-Methods","POST,GET,OPTIONS,DELETE");
        chain.doFilter(request,response);
    }
}
/**
 * @Author LQY
 * @Date 2018/12/3
 */
@WebServlet("/UserLogin")
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String userName = req.getParameter("userName");
        String password = req.getParameter("password");
        System.out.println(userName+":"+password);
        resp.setContentType("text/html;charset=utf-8");
        if("user".equals(userName) && "123".equals(password)){
            resp.getWriter().print("success");
        }else{
            resp.getWriter().print("fail");
        }
    }
}

前端页面发起ajax请求

<script>
            $(‘#loginBtn‘).on(‘click‘,function(){
                var formData = $("#f1").serialize();
                $.ajax("http://localhost:8080/UserLogin",{
                    type:"post",
                    data:formData,
                    success:function(data){
                        alert(data);
                    }
                })
            })
</script>

2、springmvc通过@CrossOrigin注解设置跨域请求

设置在方法上:

/**
 * @Author LQY
 * @Date 2018/12/3
 */
@RestController
public class LoginController {
    /**
     * @CrossOrigin注解用来配置跨域请求,第一个参数origins表示那些域名可以跨域访问这个方法,
     * 第二个参数表示表示支持哪些访问的方法。
     * @return
     */
    @RequestMapping("/UserLogin")
    @CrossOrigin(origins = "*",methods = {RequestMethod.GET,RequestMethod.POST,RequestMethod.DELETE,RequestMethod.PUT})
    public String userLogin(String userName, String password){
        if("user1".equals(userName) && "6666".equals(password)){
            return "success";
        }else{
            return "fail";
        }
    }
}

设置在controller上:

package edu.nf.demo2.controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * @CrossOrigin标注在类上表示当前类的所有方法都支持跨域访问,
 * 标注在方法上时表示当前的请求处理方法支持跨域,但会合并属性配置。
 * 注意,这种方式的配置只对当前类有效,对其他的Controller是不起作用的,
 * 如果需要所有的Controller都支持跨域访问,那么可以配置全局的跨域访问
 * (通过xml或者是java配置)
 * @Author LQY
 * @Date 2018/12/3
 */
@RestController
@CrossOrigin(origins = "*",methods = {RequestMethod.GET,RequestMethod.POST,RequestMethod.DELETE,RequestMethod.PUT})
public class LoginController {
    /**
     * @CrossOrigin注解用来配置跨域请求,第一个参数origins表示那些域名可以跨域访问这个方法,
     * 第二个参数表示表示支持哪些访问的方法。
     * @return
     */
    @RequestMapping("/UserLogin")
    public String userLogin(String userName, String password){
        if("user1".equals(userName) && "6666".equals(password)){
            return "success";
        }else{
            return "fail";
        }
    }
}

通过xml配置文件配置全局的跨域访问

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <context:component-scan base-package="edu.nf.demo2.controller"/>

    <mvc:annotation-driven/>

    <mvc:default-servlet-handler/>
    <!-- 全局的跨域访问配置 -->
   <mvc:cors>
        <!--&lt;!&ndash; /** 表示所有请求都将支持跨域方法 &ndash;&gt;-->
        <mvc:mapping path="/**" allowed-origins="*" allowed-methods="GET,POST,PUT,DELETE"/>
   </mvc:cors>
</beans>

 

以上是关于java跨域请求的方式的主要内容,如果未能解决你的问题,请参考以下文章

web跨域问题(java) 跨域请求

Java实现CORS跨域请求

java之初识服务器跨域获取数据

浏览器拦截跨域请求处理方法

jsonp实现跨域请求

跨域问题