1浏览器跨域访问
1.1浏览器的同源策略
- 同源策略阻止从一个域加载的脚本去获取另一个域上的资源。
- 只要协议、域名、端口有任何一-个不同,都被当作是不同的域。
- 浏览器Console看到Access-Control-Allow-Origin就代表跨域了。
- 示例
- HTML种允许跨域标签
- <img> -显示远程图片
- <script> -加载远程JS
- <link> -加载远程CSS
1.2跨域的解决措施
- CORS跨域资源访问
- CORS是一 种机制,使用额外的HTTP头通知浏览器可以访问其他域。
- URL响应头包含Access-Control-*指明请求允许跨域。
- SpringMVC解决跨域访问
- @CrossOrigin Controller跨域注解(只针对一个Controller有效,多个控制器需要多此添加)
-
/** * CrossOrigin 为跨域请求做准备 origins中是允许跨域访问的前端网址 ;maxAge=3600 是 缓存非清单请求(PUT/DELETE、扩展标准请求) * 中的预检请求进行缓存 单位是秒。此处注释的是1小时 降低服务器压力,因为缓存之后,相同的预检请求可以省略 */ @CrossOrigin(origins = {"http://localhost:8080","http://127.0.0.1:8080"},maxAge = 3600) @RestController @RequestMapping("/restful") public class RestfulController { @GetMapping("/request") public String doGetRequest(){ return "{\"message\":\"返回查询结果\"}"; } }
- <mvc:cors> SrpingMvc全局跨域配置(applicationContext.xml中配置)
-
<!-- 添加跨域请求--> <mvc:cors> <mvc:mapping path="/restful/**" allowed-origins="http://127.0.0.1:8080,http://localhost:8080" max-age="3600"/> </mvc:cors>
-
2拦截器(Interceptor)
2.1基础
- 拦截器(Interceptor)用于对URL请求进行前置/后置过滤
- Interceptor与Filter用途相似,但实现方式不同
- Interceptor底层就是基于Spring AOP面向切面编程实现
2.2拦截器开发流程
- 添加maven依赖
-
<!--添加拦截器--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <!-- 只是在编码过程使用,发布之后不将这个包发不出去--> <scope>provided</scope> </dependency>
-
- 添加一个class实现HandlerInterceptor接口
-
package com.item.springmvc.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @author 14391 */ public class MyInterceptor implements HandlerInterceptor { //生成这个三个方法快捷键=>idea code =》lmplement Metod.. //(1)preHandle -前置执行处理 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println(request.getRequestURL() + "-准备执行"); return true; } //(2)postHandle -目标资源已被Spring MVC框架处理,(return之后,但是还没产生响应文本之前) public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println(request.getRequestURL() + "-目标处理成功"); } //(3)afterCompletion -响应文本已经产生 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println(request.getRequestURL() + "-响应内容已产生"); } }
-
- applicationContext.xml配置过滤地址(如果需要添加一个新的拦截器)
-
<!-- 添加 interceptors 拦截--> <mvc:interceptors> <mvc:interceptor> <!-- 拦截路径 =》拦截所有--> <mvc:mapping path="/restful/**"/> <mvc:mapping path="/webapi/**"/> <!-- 拦截器过滤请求 也可以只写一句 例如 /resources/** ,因为所有的静态文件都放置在这个文件夹下 --> <mvc:exclude-mapping path="/**.ico"/> <mvc:exclude-mapping path="/**.jpg"/> <mvc:exclude-mapping path="/**.gif"/> <mvc:exclude-mapping path="/**.js"/> <mvc:exclude-mapping path="/**.css"/> <mvc:exclude-mapping path="/resources/**"/> <bean class="com.item.springmvc.interceptor.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors>
-
- 控制器种添加一个方法,测试
-
@GetMapping("/persons") public List<Person> findPersons(){ List list = new ArrayList(); Person p1 = new Person(); p1.setName("lily"); p1.setAge(23); p1.setBirthday(new Date()); Person p2 = new Person(); p2.setName("smith"); p2.setAge(22); p2.setBirthday(new Date()); list.add(p1); list.add(p2); //作为拦截输出的参照 System.out.println("RestfulController.findPersons() - return list"); return list; }
-
- 结果输出
- 拓展:多拦截器输出