Java 解决跨域请求

不多说,直接上代码。

  • 被调用方自适应调用方请求域
    • 该方法只需要修改被调用方的后台代码,调用方可依照正常的ajax访问数据
    • 无序列表我们以spring-boot框架为例子,首先,在后台创建一个跨域处理过滤器,代码如下
      • import org.springframework.util.StringUtils;
        import javax.servlet.*;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        import java.io.IOException;
        
        /**
         * 跨域请求处理
         */
        public class CrosFilter implements Filter {
        
            @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;
        
                String origin = request.getHeader("Origin");
                if(!StringUtils.isEmpty(origin)){
                    //但请求带有cookie的时候,origin不能为*,必须是全匹配名
                    response.addHeader("Access-Control-Allow-Origin",origin);
                }
        
                response.addHeader("Access-Control-Allow-Methods","*");
        
                String header = request.getHeader("Access-Control-Allow-Headers");
                //匹配所有自定义请求头
                if(!StringUtils.isEmpty(header)){
                    response.addHeader("Access-Control-Allow-Headers",header);
                }
        
                //代表着浏览器请求第一次之后,一个小时之内可以缓存请求信息,不需要在发送预检命令
                response.addHeader("Access-Control-Max-Age","3600");
        
                //当请求带cookie的时候,需要将Credentials设置为true
                response.addHeader("Access-Control-Allow-Credentials","true");
        
                filterChain.doFilter(servletRequest,servletResponse);
            }
        
            @Override
            public void destroy() {
        
            }
        }
    • 下一步是在启动类里面配置过滤器
      • import org.mybatis.spring.annotation.MapperScan;
        import org.springframework.boot.SpringApplication;
        import org.springframework.boot.autoconfigure.SpringBootApplication;
        import org.springframework.boot.web.servlet.FilterRegistrationBean;
        import org.springframework.context.annotation.Bean;
        import springfox.documentation.swagger2.annotations.EnableSwagger2;
        
        @SpringBootApplication
        @EnableSwagger2
        @MapperScan("com.vcyber.mapper")
        public class UserApplication {
        
           public static void main(String[] args) {
              SpringApplication.run(UserApplication.class, args);
           }
        
           /**
            * 处理跨域
            * @return
            */
           @Bean
           public FilterRegistrationBean registrationBean(){
              FilterRegistrationBean bean = new FilterRegistrationBean();
        
              bean.addUrlPatterns("/*");
              bean.setFilter(new CrosFilter());
              return bean;
           }
        }
    • 到这里使用过滤器处理跨域请求的方法就完成了,这种方式适用于任务一种请求,实用性比Jsonp要好,推荐使用。
  • spring框架处理跨域
    • 上面我们讲的两种处理方式都是适用后台任何一种框架,而我们的spring框架提供了一种框架自带的解决方式。
    • 就是在我们提供被请求的类或者方法上面添加一个@CrossOrigin注解,如:
      • @RestController
        @RequestMapping("loginrecord")
        @CrossOrigin
        public class LoginRecordController {
        }

      • @RestController
        @RequestMapping("loginrecord")
        public class LoginRecordController {
        @GetMapping("getMybatisLoginList")
        @CrossOrigin
        public ResponseData getMybatisLoginList(){
            ResponseData responseData = new ResponseData();
            responseData.setCode("200");
            responseData.setMessage("成功");
            responseData.putDataValue("list",loginRecordMapper.selectList(null));
            return responseData;
        }
        }
    • 在类上面加上@CrossOrigin注解,则表示该类里面的所有方法都支持跨域请求,如果在指定方法上加注解,则说明该方法支持跨域请求
  • Jsonp
    • 前台使用ajax的jsonp方式访问请求
      • $.ajax({
        		type:"get",
        		url:"http://localhost:8080/loginrecord/getMybatisLoginList",
        		dataType:"jsonp",
        		jsonp:"callback",
        		success:function(result){
        			alert(result)
        		}
    • 后台需要添加一个JsonP处理类
      • import org.springframework.web.bind.annotation.ControllerAdvice;
        import org.springframework.web.servlet.mvc.method.annotation.AbstractJsonpResponseBodyAdvice;
        
        @ControllerAdvice
        public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {
        
            public JsonpAdvice(){
                super("callback");
            }
        }
    • 注意:1.JsonpAdvice构造函数所返回的数据必须与前端ajax的jsonp属性数据一致
                 2.Jsonp只支持GET请求,所以面对多种请求方式的时候,不建议使用,可采用别种方式

     

猜你喜欢

转载自my.oschina.net/u/3174004/blog/2966833