ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

spring 基础(四)浏览器跨域访问+拦截器(Interceptor)

2021-01-25 10:04:50  阅读:250  来源: 互联网

标签:拦截器 return 跨域 spring request servlet public


1浏览器跨域访问

1.1浏览器的同源策略

  1. 同源策略阻止从一个域加载的脚本去获取另一个域上的资源。
  2. 只要协议、域名、端口有任何一-个不同,都被当作是不同的域。
  3. 浏览器Console看到Access-Control-Allow-Origin就代表跨域了。
  4. 示例
  5. HTML种允许跨域标签
    1. <img> -显示远程图片
    2. <script> -加载远程JS
    3. <link> -加载远程CSS

1.2跨域的解决措施

  1. CORS跨域资源访问
    1. CORS是一 种机制,使用额外的HTTP头通知浏览器可以访问其他域。
    2. URL响应头包含Access-Control-*指明请求允许跨域。
  2. SpringMVC解决跨域访问
    1. @CrossOrigin  Controller跨域注解(只针对一个Controller有效,多个控制器需要多此添加)
    2. /**
       * 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\":\"返回查询结果\"}";
          }
      }
    3. <mvc:cors> SrpingMvc全局跨域配置(applicationContext.xml中配置)
      1. <!--    添加跨域请求-->
            <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基础

  1. 拦截器(Interceptor)用于对URL请求进行前置/后置过滤
  2. Interceptor与Filter用途相似,但实现方式不同
  3. Interceptor底层就是基于Spring AOP面向切面编程实现

2.2拦截器开发流程

  1. 添加maven依赖
    1. <!--添加拦截器-->
              <dependency>
                  <groupId>javax.servlet</groupId>
                  <artifactId>javax.servlet-api</artifactId>
                  <version>4.0.1</version>
      <!--            只是在编码过程使用,发布之后不将这个包发不出去-->
                  <scope>provided</scope>
              </dependency>
  2. 添加一个class实现HandlerInterceptor接口
    1. 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() + "-响应内容已产生");
          }
      }
  3. applicationContext.xml配置过滤地址(如果需要添加一个新的拦截器)  
    1. <!--    添加 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>
  4. 控制器种添加一个方法,测试
    1.     @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;
          }
  5. 结果输出
  6. 拓展:多拦截器输出


    1.  

       

标签:拦截器,return,跨域,spring,request,servlet,public
来源: https://www.cnblogs.com/1439107348s/p/14323536.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有