1.使用IP

无论是前端还是后台,都需要使用ip进行发送请求,不要使用localhost

2.前端配置传递cookie

  1. import axios from 'axios
  2. axios.defaults.headers['Content-Type']='application/json;charset=utf-8'
  3. const service = axios.create({
  4. baseURL:"http://127.0.0.1:7788/api",
  5. timeout:10000,
  6. withCredentials:true //跨域请求时是否需要使用凭证
  7. })

3.后台cors过滤时候,配置允许跨域

  1. @Configuration
  2. public class CorsConfig implements WebMvcConfigurer {
  3. @Override
  4. public void addCorsMappings(CorsRegistry registry) {
  5. //代表当前类中所有的请求都允许跨域访问
  6. registry.addMapping("/*")
  7. // 配置哪个域 允许跨域访问
  8. .allowedOrigins("http://127.0.0.1:8080")
  9. //允许跨域
  10. .allowCredentials(true)
  11. // 许所有的请求方式
  12. .allowedMethods("*")
  13. // 允许任意请求头
  14. .allowedHeaders("*");
  15. }
  16. }

4.shiro过滤器放行Options请求

配置shiro的自定义拦截器用来放行全部的OPTIONS,请求我们现在的跨域方式是cors

原理:当我们需要跨域请求的时候,此时会首先发送一个请求方式为OPTIONS类型的请求到后台获取后台是否允许跨域的认证: 代码发送的请求 GET http://127.0.0.1:7788/api/emp/getInfo ===> 跨域实际的请求 OPTIONS http://127.0.0.1:7788/api/emp/getInfo 获取当前请求是否允许跨域 GET http://127.0.0.1:7788/api/emp/getInfo

  1. import org.apache.commons.lang3.StringUtils;
  2. import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
  3. import org.springframework.http.HttpMethod;
  4. import javax.servlet.ServletRequest;
  5. import javax.servlet.ServletResponse;
  6. import javax.servlet.http.HttpServletRequest;
  7. public class MyShiroFilter extends FormAuthenticationFilter {
  8. @Override
  9. protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
  10. HttpServletRequest req = (HttpServletRequest) request;
  11. if (StringUtils.equalsAnyIgnoreCase(req.getMethod(), HttpMethod.OPTIONS.name())) {
  12. return true;
  13. }
  14. return super.isAccessAllowed(request, response, mappedValue);
  15. }
  16. }

5.将过滤器加入到shior配置中

    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {

        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();

       //...

       //自定义拦截器
        Map<String, Filter> filters = new LinkedHashMap<>();
        filters.put(authc.name(), new MyShiroFilter());
        factoryBean.setFilters(filters);
        return factoryBean;

    }