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 {
        }

        javascript

      • @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請求,因此面對多種請求方式的時候,不建議使用,可採用別種方式
相關文章
相關標籤/搜索