Vue+ssm跨域问题解决的两个办法

最近在做vue+ssm的项目,遇到跨域问题,下面说说我的理解:

基本项目的搭建:

ssm:

vue:

基本的项目搭建就不多说了,重点是跨域问题的解决,主要有两个方法。

方法一、注解式:

这种方法仅限于spring 4.x以上(这个x具体是多少我也不知道,包括我用的4.3.6都不行!!不行。所以大家试试这个方法,不行的就换filter解决,不要纠结注解怎么没有作用啊,filter拦截也是很简单的。下面是我用的4.3.6)

好了,开始吧:

在某方法上增加@CrossOrigin注解,括号内写允许访问的url:

@Controller
public class ControllerTest {
    @CrossOrigin(origins = "*")
	@RequestMapping("/")
	@ResponseBody
	public String a() {
		return "welcome to Tomcat Server.";
	}
	
}

在整个controller上加注解:(这样,整个controller都能跨域请求:包括/、/a...controlle下面的所有方法)

@CrossOrigin(origins = "*")
@Controller
public class ControllerTest {

	@RequestMapping("/")
	@ResponseBody
	public String a() {
		return "welcome to Tomcat Server.";
	}
	
	@RequestMapping("/a")
	@ResponseBody
	public String aa() {
		return "aaa.";
	}
	
}

注解式还需要配合vue的反向代理,才能使用哦! 

 因为我的不能使用注解式,就不截图说明了,了解更多可以去查阅相关的文章。

方法二、filter过滤器式:

下面详细说说filter过滤器拦截。 

① 在src下新建一个filter包:

因为要实现Filter类,所以呢不建议手动新建class.!!!!!!!!!!千万不要手动新建class.

② 点击 项目部署=>filter,

 

③ 选择新建filter,选择新建的包

 ④ 取个名字,下一步

 

⑤ 点击finish:

他会默认实现Filter的方法:

 

⑥ 我们只关注一个方法,重写即可。(doFilter)

/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here

		// pass the request along the filter chain
		chain.doFilter(request, response);
	}

 替换成:

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		HttpServletRequest request = (HttpServletRequest)req;
		HttpServletResponse response = (HttpServletResponse) res;
		String originHeader = request.getHeader("Origin");
		response.setHeader("Access-Control-Allow-Origin", originHeader);
		response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");  
		response.setHeader("Access-Control-Max-Age", "0");  
		response.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");  
		response.setHeader("Access-Control-Allow-Credentials", "true");  
		response.setHeader("XDomainRequestAllowed","1");   
		response.setHeader("XDomainRequestAllowed","1");    
		// pass the request along the filter chain
		chain.doFilter(request, response);

 这里它的默认形参是 request、response:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

我们要拦截网络请求,要转换为HttpServletRequest。注意一下参数的对应关系即可。

⑦ 在web.xml中加入以下代码:

<!-- 跨域问题解决 -->
	<filter>
		<filter-name>header</filter-name>
		<filter-class>com.ssm.filter.filter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>header</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

 <filter-class>就是你刚才创建的filter的位置,完整的包名+类名。

注解式删除了不要:

@Controller
public class ControllerTest {

	@RequestMapping("/")
	@ResponseBody
	public String a() {
		return "welcome to Tomcat Server.";
	}
}

⑧ 运行项目:

 ⑨ vue中不做代理,直接请求:

axios.get('http://localhost:8080/mvc/').then(res=>{
        console.log(res)
      }).catch(error=>{
        console.log(error);
      });

 成功解决springmvc跨域。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 解决跨域的方法有很多,但是两个最常见的方法是使用JSONP或者CORS。JSONP是一种使用动态<script>标签来实现跨域请求的技术,而CORS(跨域资源共享)是一种基于HTTP头部的跨域技术,它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。 ### 回答2: Vue和Spring Boot是两个独立的框架,分别用于前端和后端开发。Vue用于构建用户界面,而Spring Boot用于构建后端服务。由于浏览器的同源策略,Vue向Spring Boot发送HTTP请求时可能会遇到跨域问题Vue解决跨域问题可以通过在配置文件中配置代理服务器。在Vue项目的配置文件(如vue.config.js)中,可以使用devServer属性配置代理服务器。通过设置proxy选项,可以将Vue的HTTP请求代理到Spring Boot项目的对应URL上,从而避免跨域问题。例如: ```javascript module.exports = { devServer: { proxy: { '/api': { target: 'http://localhost:8080', // Spring Boot项目地址 changeOrigin: true } } } } ``` 上述配置的意思是将所有以`/api`开头的HTTP请求代理到`http://localhost:8080`上,即Spring Boot项目的地址。这样,Vue的请求将会发送到代理服务器上,再由代理服务器转发到Spring Boot项目上,避免了跨域问题。 而在Spring Boot中解决跨域问题可以通过添加CORS(跨源资源共享)配置。可以在后端的控制器类或方法上使用`@CrossOrigin`注解来设置允许跨域请求的来源。例如: ```java @RestController public class MyController { @CrossOrigin(origins = "http://localhost:8081") @GetMapping("/api/data") public String getData() { // 处理业务逻辑 return "Data"; } } ``` 上述代码中,`@CrossOrigin`注解的`origins`属性指定了允许跨域请求的来源,这里设置为`http://localhost:8081`。这样,对`/api/data`路径的请求将允许来自该来源的跨域请求。 综上所述,Vue和Spring Boot解决跨域问题的方法分别是通过配置代理服务器和使用CORS注解。这样可以实现前后端之间的正常通信,避免跨域问题带来的限制。 ### 回答3: Vue和Spring Boot是两个常用的Web开发框架,当它们同时使用时,往往会遇到跨域问题。跨域是由于浏览器的同源策略限制导致的,在前后端分离的开发架构中,前端和后端往往不在同一个域名下,因此会涉及到跨域请求。 为了解决Vue和Spring Boot跨域问题,首先需要在Vue的项目中设置代理来转发后端请求。在Vue的配置文件中,通过设置`proxy`参数,将需要转发的后端请求代理到指定的地址。例如,假设Vue的开发服务器运行在`localhost:8080`上,而Spring Boot的后端服务运行在`localhost:8081`上,可以通过以下配置来实现代理转发: ```js // vue.config.js module.exports = { // ... devServer: { proxy: { '/api': { target: 'http://localhost:8081', changeOrigin: true } } } } ``` 上述配置表示将所有以`/api`开头的请求转发到`http://localhost:8081`地址上,`changeOrigin: true`参数表示保持源地址的协议(http/https)。 另外,还需要在Spring Boot后端项目中进行相应的配置以允许跨域请求。可以使用`@CrossOrigin`注解来标记Controller或方法,开启跨域请求的支持。例如: ```java @RestController @CrossOrigin(origins = "http://localhost:8080") public class ExampleController { // ... } ``` 上述配置表示允许来自`http://localhost:8080`地址的跨域请求。 通过以上配置,就可以解决Vue和Spring Boot跨域问题。前端Vue项目发送的请求会先经过代理转发到后端Spring Boot服务,后端接收到请求后会根据`@CrossOrigin`注解进行跨域请求的处理,从而实现跨域请求的正常通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值