c语言编程笔录

您现在的位置是:首页 > 编程 > 编程经验

编程经验

Vue+SpringBoot+Shiro跨域问题的解决方法

陈婉璇 2023-09-03编程经验
问题背景Vue+SpringBoot+Shiro是一种常用的前后端分离开发架构,其中Vue用于构建前端界面,SpringBoot提供后端服务,而Shiro用于实现权限控制。然而,在使用这种架构时常常会遇到跨域问题,即

问题背景

Vue+SpringBoot+Shiro是一种常用的前后端分离开发架构,其中Vue用于构建前端界面,SpringBoot提供后端服务,而Shiro用于实现权限控制。然而,在使用这种架构时常常会遇到跨域问题,即前端请求后端接口时的跨域访问限制。本文将介绍如何解决Vue+SpringBoot+Shiro跨域问题。

解决方法

为了解决跨域问题,我们需要采取以下步骤:

步骤一:前端设置

在Vue项目中,可以通过配置vue.config.js文件来设置跨域访问。在这个文件中,我们可以设置代理来转发请求,将前端的请求转发到后端接口。

module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost:8080',
        ws: true,
        changeOrigin: true
      }
    }
  }
};

步骤二:后端设置

在SpringBoot中,我们可以通过配置WebMvcConfigurer来设置跨域访问。在这个配置类中,我们可以指定允许跨域的源、方法和头信息。

@Configuration
public class WebConfig implements WebMvcConfigurer {
  @Override
  public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**")
        .allowedOrigins("*")
        .allowedMethods("GET", "POST", "PUT", "DELETE")
        .allowedHeaders("*")
        .allowCredentials(true)
        .maxAge(3600);
  }
}

步骤三:Shiro设置

在Shiro中,我们需要配置Filter来处理跨域请求。我们可以定义一个继承自org.apache.shiro.web.filter.authc.FormAuthenticationFilter的自定义过滤器,并在shiro.ini配置文件中进行相应的设置。

public class CORSAuthenticationFilter extends FormAuthenticationFilter {
  @Override
  protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
    if (request instanceof HttpServletRequest) {
      HttpServletRequest httpServletRequest = (HttpServletRequest) request;
      HttpServletResponse httpServletResponse = (HttpServletResponse) response;
      httpServletResponse.setHeader("Access-Control-Allow-Origin", httpServletRequest.getHeader("Origin"));
      httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
      httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers"));
      httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
      httpServletResponse.setHeader("Access-Control-Max-Age", "3600");
    }
    return super.isAccessAllowed(request, response, mappedValue);
  }
}

总结

通过前端配置代理、后端配置跨域访问、Shiro配置过滤器,我们可以解决Vue+SpringBoot+Shiro跨域问题。这种解决方案可以确保前端请求能够正常访问后端接口,同时保证了接口的安全性。

文章评论