zoukankan      html  css  js  c++  java
  • spring 基础(四)浏览器跨域访问+拦截器(Interceptor)

    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. 拓展:多拦截器输出


  • 相关阅读:
    093孤荷凌寒自学第179天区块链093天Dapp048
    092孤荷凌寒自学第178天区块链092Dapp047
    091孤荷凌寒自学第177天区块链091天Dapp046
    090孤荷凌寒自学第180天区块链090天Dapp045
    089孤荷凌寒自学第175天区块链089天Dapp044
    088孤荷凌寒自学第174天区块链088天Dapp043
    087孤荷凌寒自学第173天区块链087天Dapp042
    孤荷凌寒自学第172天区块链086天Dapp041
    孤荷凌寒自学第171天区块链085天Dapp040
    iOS开发——高级篇——内存分析,Instruments
  • 原文地址:https://www.cnblogs.com/1439107348s/p/14323536.html
Copyright © 2011-2022 走看看