zoukankan      html  css  js  c++  java
  • springMvc 实现跨域以及跨站

    后端实现跨域的主流方法

    1. springMvc 4.2 以上 @CrossOrigin添加到对应需要跨域的接口类或方法上,不加任何参数默认是所有网站都可以访问!
    2. 通过拦截器、过滤器实现跨域,springMvc 4.2 以下,重写拦截器和过滤器即可。

    这里说一下为什么可以直接用注解完成过滤却还要重写拦截器:

    鄙人技术有限,在用拦截器做完登陆验证,无法通过拦截器实现未被拦截器拦截接口的跨域功能,故另辟蹊径使用注解完成未被拦截接口的跨域功能。

    拦截器通常实现的功能:

    1. 登录验证,判断用户是否登录。
    2. 判断用户是否有权限访问资源,如校验token
    3. 记录请求操作日志(用户ip,访问时间等),以便统计请求访问量。
    4. cookie、本地化、国际化、主题等。
    5. 监控请求处理时长等。

    @CrossOrigin注解实现跨域无效常见原因:

    1. springMvc 版本低于4.2X。
    2. @RequestMapping注解中没有给出请求方式。

    @CrossOrigin的参数:

    1. value属性可以设置多个URL。
    2. origins属性也可以设置多个URL。
    3. maxAge属性指定了准备响应前的缓存持续的最大时间。就是探测请求的有效期。
    4. allowCredentials属性表示用户是否可以发送、处理 cookie。默认为false
    5. allowedHeaders 属性表示允许的请求头部有哪些。
    6. methods 属性表示允许请求的方法,默认get,post,head。

    springMvc 处理一个请求的顺序是: 过滤器 -> 拦截器 -> 最后才是控制器controller

    拦截器重写示例:

    isLoginInterceptor.java

    public class isLoginInterceptor implements HandlerInterceptor {
        //在请求处理的方法之前执行
        //如果返回true执行下一个拦截器
        //如果返回false就不执行下一个拦截器
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("---------------处理前---------------");
            // System.out.println(request.getHeader(HttpHeaders.ORIGIN) + "origin"); 
            // System.out.println(request.getMethod());
            if (request.getHeader(HttpHeaders.ORIGIN) != null) {
                //支持跨域这里手动为相应包添加允许跨域的属性,只对浏览器的options预先请求生效
                response.addHeader("Access-Control-Allow-Origin", request.getHeader(HttpHeaders.ORIGIN));// origin 为请求接口的站点主域名
                response.addHeader("Access-Control-Allow-Credentials", "true");
                response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT, HEAD");
                response.addHeader("Access-Control-Allow-Headers", "Content-Type");
                response.addHeader("Access-Control-Max-Age", "3600");
                return true;
            }
    
            User user = (User) request.getSession(false).getAttribute("USER_SESSION");
            System.out.println(user + "interceptor");
            if (user == null) {
                System.out.println("user == null ");
                return false;
            } else
                return true;
        }
    
        //在请求处理方法执行之后执行
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("---------------处理后---------------");
        }
    
        //在dispatcherServlet处理后执行,做清理工作
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("---------------清理---------------");
        }
    }
    
    

    springmvc-servlet.xml,这个是springMvc版xml配置拦截器。

    <mvc:interceptors>
            <mvc:interceptor>
                <mvc:mapping path="/**">
                <mvc:exclude-mapping path="/user"/>
                <!--填写之前配置好的拦截器-->
                <bean class="interceptor.isLoginInterceptor"></bean>
            </mvc:interceptor>
    </mvc:interceptors>
    
    

    InterceptorConfig.java,这个是springBoot版注解配置拦截器。

    @Configuration
    public class InterceptorConfig implements WebMvcConfigurer {
        /**
         * 注册自定义拦截器
         */
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new Interceptor01()).addPathPatterns("/**").excludePathPatterns("/user/login");
        }
    }
    
    

    request.setHeaderrequest.addHeader 的不同点

    request.setHeader是在已有的属性上修改,如果没有会创建。

    request.addHeader是在header请求头里添加属性,不考虑属性会重复。

    过滤器重写示例:

    // 由于我没有测试成功,在这里就不贴出代码了。
    
    
    有什么不同见解可以在评论区共同讨论
  • 相关阅读:
    一致性 hash 算法( consistent hashing )a
    wcf 推送 与 广播
    TFS 自动同步Server 端文件的批处理命令
    PHP面向对象
    H5缓存机制浅析-移动端Web加载性能优化【干货】
    100+ 超全的web开发工具和资源
    从零开始搭建论坛(一):Web服务器与Web框架
    JQuery:选择器
    JQuery:事件
    JQuery:DOM操作
  • 原文地址:https://www.cnblogs.com/lambertlt/p/14868601.html
Copyright © 2011-2022 走看看