当前位置: 首页 > article >正文

每日学Java之一万个为什么

文章目录

  • RESTFUL 风格设计
  • JSON数据中的返回工具类 R
  • 浏览器跨域问题及其前后端解决办法
  • SpringMVC基于AOP的功能有哪些
  • SpringMVC声明式异常处理
  • SpringMVC拦截器 区别filter不能放行

RESTFUL 风格设计

  • url:尽量使用名词,如果实在重复使用动词
  • method:GET DELET(区别路径传参:唯一标识,和接受查询字符串:范围查询)POST PUT
  • param:
  • response:json

简单示例:

| 接口         | 保存用户功能  | id查询     | id更新        | id删除        | 多条件模糊查询                                 |                         数据分页展示                         |
| ------------ | ------------- | ---------- | ------------- | ------------- | ---------------------------------------------- | :----------------------------------------------------------: |
| **USER**     | /user         | /user/{id} | /user         | /user/{id}    | /user/search?page={page}&size={size}&keyword{} |                /user?page={page}&size={size}                 |
| **METHOD**   | post          | get        | put           | delete        | get                                            |                             get                              |
| **PARAM**    | json          | path       | json          | path          | page size keyword                              |                          page,size                           |
| **RESPONSE** | json{message} | json{id}   | json{message} | json{message} | json:{user}                                    | json{`content` `totalElements`  `totalPages`:  `number`:  `size`:  `first`:  `last`: } |

JSON数据中的返回工具类 R

package com.atguigu.utils;

/**
 * projectName: com.atguigu.utils
 *
 * description: 返回结果类
 */
public class R {

    private int code = 200; //200成功状态码

    private boolean flag = true; //返回状态

    private Object data;  //返回具体数据
    
     public  static R ok(Object data){
        R r = new R();
        r.data = data;
        return r;
    }

    public static R  fail(Object data){
        R r = new R();
        r.code = 500; //错误码
        r.flag = false; //错误状态
        r.data = data;
        return r;
    }
     public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

浏览器跨域问题及其前后端解决办法

跨域问题是浏览器的一种安全保护机制,类似于河南省串货到北京,不允许。
浏览器通过字符串比对:协议,主机地址,端口号 判断是否跨域

解决办法:

  • 前端代理伪装地址
  • 后端@CrossOrigin 允许访问

SpringMVC基于AOP的功能有哪些

  • 日志记录
  • 事务管理
  • 安全控制
  • 缓存管理
  • 异常处理
  • 性能监控
  • 输入验证
  • 审计跟踪
  • 时间通知

SpringMVC声明式异常处理

配置方式:
通知注解 @ControllerAdvice @RestControllerAdvice
异常注解 @ExceptionHandler
Exception.class 兜底

SpringMVC拦截器 区别filter不能放行

配置方式:

  • 实现HandlerIntercepter接口

  • 配置bean :区别ref标签 和 bean标签

  • 设置拦截地址

<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/schedule/**"/>
            <bean class="com.qxy.interceptors.InterceptorDemo"/>
        </mvc:interceptor>
    </mvc:interceptors>
  • 设置优先级 先声明的优先级高 三个方法按照切面通知执行

因为interceptor被ArrayList数组装配,调用的时候preHandler是正序遍历拦截器数组,反之倒序。

Dispatcher 对于拦截器的调用时机如下:

//Dispatcher中对interceptor.preHandle方法的处理:

if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                        return;
                    }
                    
//HandleExcutionChain中源码放置了这样一个拦截器数组,并且构造函数初始化

private final List<HandlerInterceptor> interceptorList;

// 配置拦截器的时候,先声明的先加入,对于pre采用正序遍历

boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {
        for(int i = 0; i < this.interceptorList.size(); this.interceptorIndex = i++) {
            HandlerInterceptor interceptor = (HandlerInterceptor)this.interceptorList.get(i);
            if (!interceptor.preHandle(request, response, this.handler)) {
                this.triggerAfterCompletion(request, response, (Exception)null);
                return false;
            }
        }
//postHandle 完成拦截器则是倒序遍历
void applyPostHandle(HttpServletRequest request, HttpServletResponse response, @Nullable ModelAndView mv) throws Exception {
        for(int i = this.interceptorList.size() - 1; i >= 0; --i) {
            HandlerInterceptor interceptor = (HandlerInterceptor)this.interceptorList.get(i);
            interceptor.postHandle(request, response, this.handler, mv);
        }

    }

//afterCompletion后置拦截器则是在后面,不管报不报异常都会执行,可以通过debug查看源码


http://www.kler.cn/a/579910.html

相关文章:

  • 分布式事务的原理
  • 网络安全之tcpdump工具
  • 隐私保护在 Facebook 内容审核系统中的应用
  • 机器学习篇——决策树基础
  • python采集京东商品详情数据,API接口文档说明
  • Elasticsearch 7.x入门学习-系统架构与工作流程
  • 人工智能直通车系列13【机器学习基础】(线性回归模型实现scikit - learn)
  • 图论——差分约束
  • 贪心算法三
  • Android Glide 框架线程管理模块原理的源码级别深入分析
  • C++基础算法:高精度
  • 项目-苍穹外卖(二)增加用户+用户分页查询
  • BUUCTF [GUET-CTF2019]soul sipse 1
  • K8S 集群搭建——cri-dockerd版
  • KUKA机器人:智能制造的先锋力量
  • 深入理解 HTML 中的段落与折行
  • Java数据结构第十九期:解构排序算法的艺术与科学(一)
  • 【Ubuntu系统设置固定内网ip,且不影响访问外网 】
  • debian根文件系统制作
  • 【每日学点HarmonyOS Next知识】 状态变量、公共Page、可见区域变化回调、接收参数、拖拽排序控件