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

中山优化网站wordpress后台上不去

中山优化网站,wordpress后台上不去,十大网页设计大全,永久免费的网站地址先赞后看#xff0c;养成习惯#xff01;#xff01;#xff01;❤️ ❤️ ❤️ 资源收集不易#xff0c;如果喜欢可以关注我哦#xff01; ​如果本篇内容对你有所启发#xff0c;欢迎访问我的个人博客了解更多内容#xff1a;链接地址 是什么 Spring MVC是Spring框架… 先赞后看养成习惯❤️ ❤️ ❤️ 资源收集不易如果喜欢可以关注我哦 ​如果本篇内容对你有所启发欢迎访问我的个人博客了解更多内容链接地址 是什么 Spring MVC是Spring框架提供的一个基于MVCModel-View-Controller设计模式的Web应用程序开发框架。它提供了一组组件如控制器、模型和视图用于快速开发Web应用程序。与其他Web框架相比Spring MVC具有灵活的配置方式、可扩展性和可测试性等优点。 Model模型层负责业务逻辑判断数据库存取View视图层负责界面展示向用户呈现数据的方式html页面、图片、文本等Controller控制器负责接收用户请求并根据请求调用相应的模型来处理业务逻辑 处理流程 客户端发送请求至前端控制器DispatcherServletDispatcherServlet收到请求后调用处理器映射器HandlerMappingHandlerMapping根据请求URL找到具体的Controller通过处理器适配器HandlerAdapter找到具体执行该方法的实现类Controller处理请求并返回ModelAndViewDispatcherServlet通过ViewReslover视图解析器确定负责显示数据的具体ViewDispatcherServlet对View进行渲染视图即将Model填充至视图组件中并将完整的视图响应到客户端。 SpringMVC是一种表现层框架技术用于进行表现层功能开发 SpringMVC是一种基于Java实现MVC模型的轻量级Web框架优点 使用简单、开发便捷(相比于Servlet)灵活性强 SpringMVC是隶属于Spring框架的一部分主要是用来进行Web开发是对Servlet进行了封装。 SpringMVC是处于Web层的框架所以其主要的作用就是用来接收前端发过来的请求和数据然后经过处理并将处理的结果响应给前端所以如何处理请求和响应是SpringMVC中非常重要的一块内容。REST是一种软件架构风格可以降低开发的复杂性提高系统的可伸缩性后期的应用也是非常广泛。SSM整合是把咱们所学习的SpringMVCSpringMybatis整合在一起来完成业务开发是对我们所学习这三个框架的一个综合应用。针对web层进行了优化采用了MVC设计模式将其设计为controller、view和Model 入门案例总结 一次性工作 创建工程设置服务器加载工程。报错500注意springmvc版本导入坐标创建web容器启动类加载SpringMVC配置并设置SpringMVC请求拦截路径SpringMVC核心配置类设置配置类扫描controller包加载Controller控制器bean多次工作 定义处理请求的控制器类定义处理请求的控制器方法并配置映射路径RequestMapping与返回json数据ResponseBody为了更好的使用SpringMVC,我们将SpringMVC的使用过程总共分两个阶段来分析分别是启动服务器初始化过程和单次请求过程 bean加载控制 config目录存入的是配置类,写过的配置类有: ServletContainersInitConfigSpringConfigSpringMvcConfigJdbcConfigMybatisConfigcontroller目录存放的是SpringMVC的controller类service目录存放的是service接口和实现类dao目录存放的是dao/Mapper接口 controller、service和dao这些类都需要被容器管理成bean对象那么到底是该让SpringMVC加载还是让Spring加载呢? SpringMVC加载其相关bean(表现层bean),也就是controller包下的类Spring控制的bean 业务bean(Service)功能bean(DataSource,SqlSessionFactoryBean,MapperScannerConfigurer等) 分析清楚谁该管哪些bean以后接下来要解决的问题是如何让Spring和SpringMVC分开加载各自的内容。 在SpringMVC的配置类SpringMvcConfig中使用注解ComponentScan我们只需要将其扫描范围设置到controller即可 在Spring的配置类SpringConfig中使用注解ComponentScan,当时扫描的范围中其实是已经包含了controller 从包结构来看的话Spring已经多把SpringMVC的controller类也给扫描到所以针对这个问题该如何解决就是咱们接下来要学习的内容。 加载Spring控制的bean的时候排除掉SpringMVC控制的bean 具体该如何排除 方式一:Spring加载的bean设定扫描范围为精准范围例如service包、dao包等方式二:Spring加载的bean设定扫描范围为com.itheima,排除掉controller包中的bean方式三:不区分Spring与SpringMVC的环境加载到同一个环境中[了解即可] SpringMVC处理请求 请求分类及处理方式 静态请求 定义 指请求的页面由服务器上预先准备好的静态web资源组成如HTML、CSS、JS、IMG等返回给客户端的信息内容是不变的。 处理方式 由服务器直接将请求的资源返回给客户端服务器不处理任何逻辑只是将预先准备好的资源返回给客户端。 动态请求 定义 服务器会根据用户的请求动态生成内容将数据返回到客户端显示页面内容。 处理方式 由服务器从数据库中获取数据并进行相应的逻辑处理后将处理结果返回客户端 处理静态请求 定义 指请求的页面由服务器上预先准备好的静态web资源组成如HTML、CSS、JS、IMG等返回给客户端的信息内容是不变的。 处理方式 由服务器直接将请求的资源返回给客户端服务器不处理任何逻辑只是将预先准备好的资源返回给客户端。 处理动态请求 通过在 controller 中定义对应的类及方法实现动态请求的业务逻辑处理。 注解说明 Controller 添加在类上 表示该类是一个控制器负责处理用户的请求并将处理结果生成响应返回给客户端。 RequestMapping请求注解 添加在控制器类或控制器方法上 将HTTP请求映射到控制器中的方法指定处理请求的路径 控制器类上为整个控制器指定一个基础路径 控制器方法上指定相对于基础路径的具体路径 ResponseBody响应注解 添加在控制器方法上 可以使控制器方法通过返回值的方式将响应返回给客户端 HTTP 1.1 HTTP协议 超文本传输协议没有状态的协议客户端服务端之前的每次对话都是一次请求响应就结束 HTTP协议是浏览器与服务器通讯的应用层协议规定了浏览器与服务器之间的交互规则以及交互数据的格式信息等。 用途 网页获取数据的传输特点 应用层协议使用tcp进行数据传输有丰富的请求类型可以传输的数据类型众多 HTTPS协议 数据以密文的方式传输安全效率相较低默认端口443https协议SSL证书 1.2 访问网页流程 客户端浏览器通过tcp传输发送http请求给服务端服务端接收到http请求后进行解析服务端处理请求内容组织响应内容服务端将响应内容以http响应格式发送给浏览器浏览器接收到响应内容解析展示. 1.3 请求和响应 1.3.1 HTTP请求 Request 浏览器给服务端发送的内容称为请求Request一个请求包含三部分:请求行请求头请求体 请求行 具体的请求类别和请求内容 请求类别 GET 抽象路径 / 协议版本 HTTP/1.1 1.3.2关于请求类别 请求类别每个请求类别表示向服务器端发请求做不同的操作 GET : 获取服务器资源 POST 新增服务器资源 PUT 更新服务器资源 DELETE 删除服务器资源 关于抽象路径 请求URL地址为http://localhost:8080/ 请求行为 GET / HTTP/1.1 请求URL地址为http://localhost:8080/v1/users/login 请求行为 GET /v1/users/login HTTP/1.1 请求URL地址为http://localhost:8080/v1/users/reg 请求行为 GET /v1/users/reg HTTP/1.1 请求头对请求的进一步解释和描述 请求头是浏览器可以给服务端发送的一些附加信息有的用来说明浏览器自身内容有的用来告知服务端交互细节有的告知服务端消息正文详情等。 Host: localhost:8080 Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,image/apng,*/*;q0.8,application/signed-exchange;vb3;q0.9 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q0.9 请求体: 请求参数或者提交内容 请求体通常是用户上传的信息比如:在页面输入的注册信息上传的附件等内容。 1.3.3响应 服务端给浏览器发送的内容称为响应Response一个响应包含三部分:响应行响应头响应体。 响应行 HTTP/1.1 200 OK 版本信息 响应码 附加信息 响应码 1xx:保留 2xx:成功表示处理成功并正常响应 3xx:重定向表示处理成功但是需要浏览器进一步请求 4xx:客户端错误表示客户端请求错误导致服务端无法处理 5xx:服务端错误表示服务端处理请求过程出现了错误 响应头 响应头与请求中的消息头格式一致表示的是服务端发送给客户端的附加信息。 HTTP/1.1 200 OK Content-Type: text/html Content-Length: 3546 //Content-Length是用来告知浏览器响应正文的长度单位是字节。 Content-Type 是用来告知浏览器响应正文中的内容是什么类型的数据(图片页面等等)不同的类型对应的值是不同浏览器接收正文前会根据上述两个响应头来得知长度和类型从而读取出来做对应的处理以渲染给用户看。 文件类型 Content-Type对应的值 html text/html css text/css js application/javascript png image/png gif image/gif jpg image/jpeg 响应体 响应的主体内容信息 1.4 URL 定义 ​ URLUniform Resource Locator是互联网上 统一资源定位符 的简称用于标识和定位互联网上资源的地址。在Web浏览器中URL是用于访问网页的地址。 协议Protocol指定访问资源的协议类型常见的协议包括HTTP、HTTPS等。主机名Hostname指定要访问的服务器的主机名或域名。端口号Port指定服务器的端口号不同的协议和应用程序使用不同的端口号。路径Path指定要访问的资源的路径即文件或文件夹的路径。查询参数Query Parameters用于传递一些额外的信息给服务器例如参数化的查询条件。URL地址是区分大小写的因此在输入时要注意大小写的一致性。 URL地址中不能包含非法字符例如空格、特殊符号等。如果需要传递参数或附加信息可以使用查询参数或POST请求等方式。 查询参数和路径Path之间使用 分隔多个查询参数之间使用 分隔。 1.5 请求方法 GET请求 ​ GET请求是HTTP协议中最常见的请求方式之一它用于从服务器获取数据。 ​ GET请求将查询参数附加在URL之后通过“?”符号进行分隔。 查询参数 GET请求的参数通常以键值对的形式附加在URL之后。例如以下URL中“?nameJohnage25”是两个查询参数分别表示名字和年龄 http://example.com/users?nameJohnage25 注意事项 GET请求的参数是可见的因此在URL中传递敏感信息时需谨慎。GET请求的长度有限制因为URL的长度有限制因此当传递大量数据时应考虑使用POST或其他方式。发送GET请求 在浏览器中输入URL地址确认即可向服务端发送GET请求。 http://localhost:8080/v1/users/login?usernamexxxpasswordxxx POST请求 POST请求是另一种常见的HTTP请求方式它用于向服务器提交数据。与GET请求不同POST请求将数据放在请求体Request Body中而不是URL中。 请求体 ​ POST请求的请求体中包含要提交的数据。这些数据可以是JSON、XML或其他格式。请求体中的数据通过Content-Type头部指定。 请求示例 POST /users HTTP/1.1 Host: example.com Content-Type: application/json Request Body: {username: john, password: secret} - 使用POST请求的注意事项 POST请求的数据是私密的不会显示在URL中因此更适合传递敏感信息。POST请求的长度没有限制可以提交大量的数据。发送POST请求 经常在 form 表单中发送。 form action请求地址 methodpostinput typetext nameusernameinput typetext namepasswordinput typesubmit name登录 /form 服务端接收参数 方式一HttpServletRequest接收 HttpServletRequest是Java Servlet规范中定义的一个接口它提供了与HTTP请求相关的方法和属性。在Java Web应用程序中当客户端发送HTTP请求时容器例如Tomcat会创建一个HttpServletRequest对象该对象包含了客户端请求的所有信息如请求的URL、请求方法、请求头、请求参数等。在请求处理过程中开发人员可以使用HttpServletRequest对象来获取客户端发送过来的请求参数。通过调用HttpServletRequest的方法可以获取请求的参数名称、参数值以及参数的数量等信息。 /**方式1使用HttpServletRequest接收数据*/ RequestMapping(/v1/users/login) ResponseBody public String login(HttpServletRequest request){String username request.getParameter(username);String password request.getParameter(password);return username : password; } 方式二声明参数接收 可以在处理请求的方法中通过 声明参数的方式 来接收客户端传递过来的数据。 /**方式2通过声明参数的方式接收*/ RequestMapping(/v1/users/login) ResponseBody // 好处代码简洁并且可以自动根据声明的类型进行转换 public String login(String username, String password){return username username , password password; } 方式三声明POJO类接收 如果客户端传递数据过多通过 HttpServletRequest 方式接收复用性较差通过 声明参数接收 又很繁琐所以可以将数据封装到 POJO类 中来接收 第1步controller.UserController处理登录请求 /**方式3通过声明Pojo类接收*/ RequestMapping(/v1/users/login) ResponseBody public String login(User user){return user.toString(); } 第2步自定义pojo类工程目录下创建entity.User public class User {// 客户端传递几个参数此处就有几个属性private String username;private String password;// 省略 setter() getter() 和 toString() 方法 } 第3步重启工程后测试 web前端和服务器的数据交互 使用json数据格式来传输数据 web前端服务端 通过RuquestBody注解完成json数据格式的转换 服务端web前端 通过ResponseBody注解完成json数据格式的转换 组合注解 RestController 等价于Controller 加 Response 五种类型参数传递 前面我们已经能够使用GET或POST来发送请求和数据所携带的数据都是比较简单的数据接下来在这个基础上我们来研究一些比较复杂的参数传递常见的参数种类有: 普通参数POJO类型参数嵌套POJO类型参数数组类型参数集合类型参数 问题分析 团队多人开发每人设置不同的请求路径冲突问题该如何解决? 解决思路:为不同模块设置模块名作为请求路径前置 对于Book模块的save,将其访问路径设置http://localhost/book/save 对于User模块的save,将其访问路径设置http://localhost/user/save 这样在同一个模块中出现命名冲突的情况就比较少了。 JSON JSONJavaScript Object Notation是一种数据交换格式常用于不同系统间的数据传输。 在使用SpringMVC框架时常常需要将Java对象转换成JSON格式然后返回给前端。 JSON格式的数据通常由一对花括号 {} 括起来在花括号中包含键值对键值对之间使用逗号分隔。 JSON数据传输参数 SpringMVC接收JSON数据的实现步骤为: (1)导入jackson包 (2)使用PostMan发送JSON数据 (3)开启SpringMVC注解驱动在配置类上添加EnableWebMvc注解 (4)Controller方法的参数前添加RequestBody注解 Rest风格 一种资源描述方式 查看REST风格的描述你会发现请求地址变的简单了并且光看请求URL并不是很能猜出来该URL的具体功能 所以REST的优点有: 隐藏资源的访问行为无法通过地址得知对资源是何种操作书写简化 按照REST风格访问资源时使用行为动作区分对资源进行了何种操作 http://localhost/users 查询全部用户信息 GET查询 http://localhost/users/1 查询指定用户信息 GET查询 http://localhost/users 添加用户信息 POST新增/保存 http://localhost/users 修改用户信息 PUT修改/更新 http://localhost/users/1 删除用户信息 DELETE删除 请求的方式比较多但是比较常用的就4种分别是GET,POST,PUT,DELETE。 按照不同的请求方式代表不同的操作类型。 发送GET请求是用来做查询发送POST请求是用来做新增发送PUT请求是用来做修改发送DELETE请求是用来做删除 上述行为是约定方式约定不是规范可以打破所以称REST风格而不是REST规范 REST提供了对应的架构方式按照这种架构设计项目可以降低开发的复杂性提高系统的可伸缩性REST中规定GET/POST/PUT/DELETE针对的是查询/新增/修改/删除但是我们如果非要用GET请求做删除这点在程序上运行是可以实现的但是如果绝大多数人都遵循这种风格你写的代码让别人读起来就有点莫名其妙了。描述模块的名称通常使用复数也就是加s的格式描述表示此类资源而非单个资源例如:users、books、accounts...... 清楚了什么是REST风格后我们后期会经常提到一个概念叫RESTful那什么又是RESTful呢? 根据REST风格对资源进行访问称为RESTful。 什么是RESTful特征的API 每一个URI代表一种资源客户端和服务器端之间传递着资源的某种表现客户端通过HTTP的几个动作对资源进行操作发生 状态转化 如何设计符合RESTful 特征的API 1 关于URL 协议 - http/https域名 域名中体现出api字样如 https://api.example.com https://example.org/api/ 版本 https://api.example.com/v1/ 路径 路径中避免使用动词资源用名词表示案例如下 https://api.example.com/v1/users https://api.example.com/v1/animals 2 HTTP动词语义 2.1 说明 HTTP动词语义 请求动词 说明 GETSELECT 从服务器取出资源一项或多项 POSTCREATE 在服务器新建一个资源 PUTUPDATE 在服务器更新资源 DELETEDELETE 从服务器删除资源 具体案例如下 请求动作 请求资源 说明 GET /zoos 列出所有动物园 POST /zoos 新建一个动物园 GET /zoos/ID 获取某个指定动物园的信息 PUT /zoos/ID 更新某个指定动物园的信息 DELETE /zoos/ID 删除某个动物园 GET /zoos/ID/animals 列出某个指定动物园的所有动物 DELETE /zoos/ID/animals/ID 删除某个指定动物园的指定动物 3 查询参数 巧用查询参数 ?type_id1指定筛选条件 ?limit10指定返回记录的数量 ?offset10指定返回记录的开始位置。 4 HTTP状态码 用HTTP响应码表达 此次请求结果例如 响应码 说明 200 OK - [GET] 服务器成功返回用户请求的数据 404 NOT FOUND - [*] 用户发出的请求针对的是不存在的记录 500 INTERNAL SERVER ERROR - [*] 服务器发生错误 400 请求参数错误 405 请求方法错误 常用注解 1. RequestMapping 注解 RequestMapping 用于指定处理请求的 URL它可以标注在类和方法上 可以通过 method 参数限定处理 GET、POST、PUT、DELETE 等HTTP的请求方法比如 处理 GET 请求 RequestMapping(value /v1/users, method RequestMethod.GET) 处理 POST 请求 RequestMapping(value /v1/users, method RequestMethod.POST) 处理 PUT DELETE 方式的HTTP请求同理。 2. 限定请求方式的注解 2.1GetMapping 注解 GetMapping 只会处理 HTTP GET 请求 是 RequestMapping(method RequestMethod.GET) 的缩写。 如果限定为处理GET请求则发送其他方式请求时HTTP状态码为 405 2.2 PostMapping 注解 PostMapping 只会处理 HTTP POST 请求 是 RequestMapping(method RequestMethod.POST) 的缩写。 如果限定为处理POST请求则发送其他方式请求时HTTP状态码为 405 2.3 PutMapping 注解 PutMapping 只会处理 HTTP PUT 请求 是 RequestMapping(method RequestMethod.PUT) 的缩写。 如果限定为处理PUT请求则发送其他方式请求时HTTP状态码为 405 2.4 DeleteMapping 注解 DeleteMapping 只会处理 HTTP DELETE 请求 是 RequestMapping(method RequestMethod.DELETE) 的缩写。 如果限定为处理DELETE请求则发送其他方式请求时HTTP状态码为 405 3. PathVariable 注解 PathVariable 注解用于接受 RESTful API 中的 URL 中的变量 通常与请求注解一起使用可以将 URL 中的变量映射到 Controller 中的方法参数上。 3.1 用法 假如有一个 RESTful API/v1/users/{id} 其中 {id} 是一个变量表示用户 ID。 可以这样定义一个处理该请求的控制器方法 GetMapping(/v1/users/{id}) public String getUserById(PathVariable Integer id) { // 根据 ID 查询用户并返回用户信息 } 3.2 使用示例 根据 id 查询用户并返回该用户信息 地址/v1/users/{id} 请求方法GET查询参数无响应类型用户对象user 实现 根据 id 查询用户并返回该用户信息GET请求/v1/users/{id} GetMapping({id}) public User selectById(PathVariable int id){ // 自己定义相对应的接口方法 return userMapper.selectById(id); } 文件上传 想要完成文件上传这个功能需要涉及到两个部分 前端程序服务端程序 我们先来看看在前端程序中要完成哪些代码 form action/upload methodpost enctypemultipart/form-data 姓名: input typetext nameusernamebr 年龄: input typetext nameagebr 头像: input typefile nameimagebr input typesubmit value提交 /form 上传文件的原始form表单要求表单必须具备以下三点上传文件页面三要素 表单必须有file域用于选择要上传的文件 typefile nameimage/ 表单提交方式必须为POST 通常上传的文件会比较大所以需要使用 POST 提交方式 表单的编码类型enctype必须要设置为multipart/form-data 普通默认的编码格式是不适合传输大型的二进制数据的所以在文件上传时表单的编码格式必须设置为multipart/form-data 本地存储 前面我们已分析了文件上传功能前端和后端的基础代码实现文件上传时在服务端会产生一个临时文件请求响应完成之后这个临时文件被自动删除并没有进行保存。下面呢我们就需要完成将上传的文件保存在服务器的本地磁盘上。 代码实现 在服务器本地磁盘上创建images目录用来存储上传的文件例E盘创建images目录使用MultipartFile类提供的API方法把临时文件转存到本地磁盘目录下 MultipartFile 常见方法 String getOriginalFilename(); //获取原始文件名void transferTo(File dest); //将接收的文件转存到磁盘文件中long getSize(); //获取文件的大小单位字节byte[] getBytes(); //获取文件内容的字节数组InputStream getInputStream(); //获取接收到的文件内容的输入流 如果直接存储在服务器的磁盘目录中存在以下缺点 不安全磁盘如果损坏所有的文件就会丢失容量有限如果存储大量的图片磁盘空间有限(磁盘不可能无限制扩容)无法直接访问 为了解决上述问题呢通常有两种解决方案 自己搭建存储服务器如fastDFS 、MinIO使用现成的云服务如阿里云OSS腾讯云华为云 登录校验 所谓登录校验指的是我们在服务器端接收到浏览器发送过来的请求之后首先我们要对请求进行校验。先要校验一下用户登录了没有如果用户已经登录了就直接执行对应的业务操作就可以了如果用户没有登录此时就不允许他执行相关的业务操作直接给前端响应一个错误的结果最终跳转到登录页面要求他登录成功之后再来访问对应的数据。 首先我们在宏观上先有一个认知 前面在讲解HTTP协议的时候我们提到HTTP协议是无状态协议。什么又是无状态的协议 所谓无状态指的是每一次请求都是独立的下一次请求并不会携带上一次请求的数据。而浏览器与服务器之间进行交互基于HTTP协议也就意味着现在我们通过浏览器来访问了登陆这个接口实现了登陆的操作接下来我们在执行其他业务操作时服务器也并不知道这个员工到底登陆了没有。因为HTTP协议是无状态的两次请求之间是独立的所以是无法判断这个员工到底登陆了没有。 那应该怎么来实现登录校验的操作呢具体的实现思路可以分为两部分 在员工登录成功后需要将用户登录成功的信息存起来记录用户已经登录成功的标记。在浏览器发起请求时需要在服务端进行统一拦截拦截后进行登录校验。 我们要完成以上操作会涉及到web开发中的两个技术 会话技术统一拦截技术 而统一拦截技术现实方案也有两种 Servlet规范中的Filter过滤器Spring提供的interceptor拦截器 会话技术 Cookie客户端会话跟踪技术 数据存储在客户端浏览器当中Session服务端会话跟踪技术 数据存储在储在服务端JWT令牌技术 方案一 - Cookie cookie 是客户端会话跟踪技术它是存储在客户端浏览器的我们使用 cookie 来跟踪会话我们就可以在浏览器第一次发起请求来请求服务器的时候我们在服务器端来设置一个cookie。 比如第一次请求了登录接口登录接口执行完成之后我们就可以设置一个cookie在 cookie 当中我们就可以来存储用户相关的一些数据信息。比如我可以在 cookie 当中来存储当前登录用户的用户名用户的ID。 服务器端在给客户端在响应数据的时候会自动的将 cookie 响应给浏览器浏览器接收到响应回来的 cookie 之后会自动的将 cookie 的值存储在浏览器本地。接下来在后续的每一次请求当中都会将浏览器本地所存储的 cookie 自动地携带到服务端。 接下来在服务端我们就可以获取到 cookie 的值。我们可以去判断一下这个 cookie 的值是否存在如果不存在这个cookie就说明客户端之前是没有访问登录接口的如果存在 cookie 的值就说明客户端之前已经登录完成了。这样我们就可以基于 cookie 在同一次会话的不同请求之间来共享数据。 我刚才在介绍流程的时候用了 3 个自动 服务器会 自动 的将 cookie 响应给浏览器。浏览器接收到响应回来的数据之后会 自动 的将 cookie 存储在浏览器本地。在后续的请求当中浏览器会 自动 的将 cookie 携带到服务器端。 为什么这一切都是自动化进行的 是因为 cookie 它是 HTP 协议当中所支持的技术而各大浏览器厂商都支持了这一标准。在 HTTP 协议官方给我们提供了一个响应头和请求头 响应头 Set-Cookie 设置Cookie数据的请求头Cookie携带Cookie数据的 优缺点 优点HTTP协议中支持的技术像Set-Cookie 响应头的解析以及 Cookie 请求头数据的携带都是浏览器自动进行的是无需我们手动操作的缺点 移动端APP(Android、IOS)中无法使用Cookie不安全用户可以自己禁用CookieCookie不能跨域 现在的项目大部分都是前后端分离的前后端最终也会分开部署前端部署在服务器 192.168.150.200 上端口 80后端部署在 192.168.150.100上端口 8080我们打开浏览器直接访问前端工程访问urlhttp://192.168.150.200/login.html然后在该页面发起请求到服务端而服务端所在地址不再是localhost而是服务器的IP地址192.168.150.100假设访问接口地址为http://192.168.150.100:8080/login那此时就存在跨域操作了因为我们是在 http://192.168.150.200/login.html 这个页面上访问了http://192.168.150.100:8080/login 接口此时如果服务器设置了一个Cookie这个Cookie是不能使用的因为Cookie无法跨域 区分跨域的维度 协议IP/协议端口 只要上述的三个维度有任何一个维度不同那就是跨域操作 举例 http://192.168.150.200/login.html ---------- https://192.168.150.200/login [协议不同跨域] http://192.168.150.200/login.html ---------- http://192.168.150.100/login [IP不同跨域] http://192.168.150.200/login.html ---------- http://192.168.150.200:8080/login [端口不同跨域] http://192.168.150.200/login.html ---------- http://192.168.150.200/login [不跨域] 方案二 - Session 前面介绍的时候我们提到Session它是服务器端会话跟踪技术所以它是存储在服务器端的。而 Session 的底层其实就是基于我们刚才所介绍的 Cookie 来实现的。 设置Httpsession参数 常用方法 设置唯一标识获取唯一标识删除唯一标识 方案三 - JWTJSON Web Token令牌技术 这里我们所提到的令牌其实它就是一个用户身份的标识看似很高大上很神秘其实本质就是一个字符串 是一种用于在网络应用间传递信息的编码规范。在会话校验中JWT可以用于进行身份验证和权限控制。 JWT校验一般包括以下步骤 提供 JWT用户在登录或进行身份验证成功后服务器会生成一个包含用户身份信息和特定于应用程序的声明的 JWT并将其发送给客户端。客户端存储 JWT客户端通常会将接收到的 JWT 存储在本地例如在浏览器的本地存储localStorage或会话存储sessionStorage中。发送请求客户端在每次与服务器进行请求时都会将 JWT 作为请求的一部分发送给服务器通常使用 HTTP 请求的头部以 Authorization: Bearer [JWT] 的格式进行传递。服务器校验 JWT服务器在接收到请求后会从请求头中提取 JWT并进行一系列校验包括以下几个方面 验证 JWT 签名的有效性服务器使用特定的密钥或公钥对 JWT 进行解码和验证签名确保 JWT 没有被篡改。验证 JWT 的有效期服务器会检查 JWT 中的时间戳确保 JWT 还在有效期内。验证 JWT 的声明和权限服务器会根据应用程序的需求验证 JWT 中的声明和权限确保用户有权访问请求的资源或执行特定操作。 返回响应如果 JWT 校验通过服务器会处理请求并返回相应的响应。如果 JWT 校验失败服务器通常会返回相应的错误状态码如 401 Unauthorized。 JWT校验提供了一种无状态的会话验证机制通过在客户端存储 JWT服务器可以根据 JWT 进行身份验证和权限控制而无需在服务器端存储会话信息从而简化了服务器的复杂性和开销。 lombok插件 简化开发 自动创建get set toString Lombok 支持自动生成 getter、setter、toString等方法减少了重复性的开发工作。 日志注解 Slf4j 日志级别TRACE TRACE追踪级别 用于跟踪代码执行的详细信息。通常用于调试阶段用于输出一些详细的调试信息对性能影响较大 DEBUG调试级别 用于输出调试信息帮助开发人员诊断问题。通常用于开发和测试阶段例如输出方法的输入参数和返回值 INFO默认的级别 普通信息级别用于输出程序的一般运行信息。通常用于生产环境记录程序运行的关键信息如系统启动、关键操作完成等 WARN 警告级别 用于输出警告信息。通常用于发现一些可能的问题或不正常的情况但不会影响程序的正常运行 ERROR错误级别 用于输出错误信息。通常用于记录程序的错误信息、异常信息表示程序出现了严重的问题无法正常运行 注意在 Slf4j 注解中应根据不同的应用场景和需求可以选择适当的日志级别。 在开发和测试阶段可以将日志级别设置为DEBUG以便获取详细的调试信息。 而在生产环境中一般将日志级别设置为INFO或更高级别。 # 设置日志级别为WARN logging.level.rootWARN# 将cn.tedu包及其包中的所有类的日志级别设置为DEBUG级别 logging.level.cn.teduDEBUG Slf4j 注解优点 使用 Slf4j 注解相比 System.out.println(xxx) 的好处 更加高效 使用 Slf4j 注解输出日志可以避免产生大量的无用日志信息减少对内存和磁盘等资源的消耗。 而使用 System.out.println() 会产生大量冗余的输出信息不仅对调试造成困扰而且会对应用程序的性能产生影响。 日志级别更加明确 使用 Slf4j 注解可以根据需要输出不同级别的日志例如警告、错误等。通过灵活控制日志输出的级别可以及时发现并解决问题。 而使用 System.out.println() 输出的日志级别是不可控的并且无法选择性地过滤日志。 Knife4j Knife4j是基于SpringBoot构建的一个文档生成工具它可以让开发者为我们的应用生成API文档 目的是可以更加方便的基于API文档进行测试。 生成的文档还可以导出然后给到前端开发团队前端开发团队可以基于API接口写具体的调用。 Knife4j的优点 Knife4j 功能强大易于操作。Knife4j 的UI界面非常美观使用流畅。Knife4j 可以高度定制化让其符合你的项目需求。 pom.xml添加依赖 在你的SpringBoot项目的pom.xml文件中添加如下依赖 !--添加Knife4j依赖-- dependencygroupIdcom.github.xiaoymin/groupIdartifactIdknife4j-openapi2-spring-boot-starter/artifactIdversion dependency 常用注解应用分析 Api注解 添加在控制器类上的注解 通过此注解的tags属性可以修改原本显示控制器类名称的位置的文本 通常建议在配置的tags属性值上添加序号例如“01. 用户模块”、“02. 微博模块”则框架会根据值进行排序。 参数说明 tags配置模块名称 // 1. UserController Api(tags 01.用户管理模块) public class UserController {...} ApiOperation注解 添加在控制器类中处理请求的方法上的注解 用于配置此方法处理的请求在API文档中显示的文本。 参数说明 value配置业务名称 ApiOperation(value 注册功能) PostMapping(reg) public int reg(RequestBody UserRegDTO userRegDTO){...} ApiIgnore注解 添加在处理请求的方法的参数上 用于表示API文档框架应该忽略此参数。 // 参数中添加ApiIgnore注解 public int insert(RequestBody WeiboDTO weiboDTO, ApiIgnore HttpSession session){...} ApiModelProperty注解 是添加在POJO类的属性上的注解 用于对请求参数或响应结果中的某个属性进行说明 主要通过其value属性配置描述文本并可通过example属性配置示例值。 参数说明 value属性配置参数名称required属性配置是否必须提交此请求参数example属性配置示例值 注意如果配置了 requiredtrue,只是一种显示效果Knife4j框架并不具备检查功能 Data public class UserRegDTO {ApiModelProperty(value 用户名, required true, example 赵丽颖)private String username;ApiModelProperty(value 密码, required true)private String password;ApiModelProperty(value 昵称, required true)private String nickname; } ApiImplicitParam注解 添加在控制器类中处理请求的方法上的注解 主要用于配置非封装的参数 参数说明 name指定参数名称参数变量名value配置参数名称dataType配置数据类型required配置是否必须提交此请求参数example配置参数的示例值 注意一旦使用此注解各个参数的数据类型默认都会显示String可以通过dataType指定数据类型 ApiImplicitParam(name id, value 微博, requiredtrue, dataType int) public WeiboDetailVO selectById(int id){...} ApiImplicitParams注解 添加在控制器类中处理请求的方法上的注解 当方法有多个非封装的参数时在方法上添加此注解并在注解内部通过ApiImplicitParam数组配置多个参数。 代码示例 此处以微博详情功能为例 /**微博详情页功能*/ GetMapping(selectById) ApiOperation(value 微博详情功能) ApiImplicitParams(value {ApiImplicitParam(name id, value 微博, requiredtrue, dataType int),ApiImplicitParam(name username, value 用户名, requiredtrue) }) // 额外增加username参数仅仅用于测试 public WeiboDetailVO selectById(int id, String username){return weiboMapper.selectById(id); } 统一响应结果的处理 为什么需要统一响应结果处理 在实际开发中我们往往需要在多个控制器方法中返回相同的响应结构 例如统一返回接口调用成功的状态码、提示信息、以及请求结果数据。但是如果对于每个接口都单独进行处理的话不仅逻辑复杂而且容易出现疏漏进而增加前端调用的难度。 所以为了更好定义服务端返回值的格式统一客户端对服务端响应结果的处理我们需要将服务端返回到客户端的数据再次进行封装。 SpringMVC异常处理机制 异常分类 异常处理器我们已经能够使用了那么在咱们的项目中该如何来处理异常呢? 因为异常的种类有很多如果每一个异常都对应一个ExceptionHandler那得写多少个方法来处理各自的异常所以我们在处理异常之前需要对异常进行一个分类: 业务异常BusinessException 规范的用户行为产生的异常 用户在页面输入内容的时候未按照指定格式进行数据填写如在年龄框输入的是字符串不规范的用户行为操作产生的异常 如用户故意传递错误数据系统异常SystemException 项目运行过程中可预计但无法避免的异常 比如数据库或服务器宕机其他异常Exception 编程人员未预期到的异常如:用到的文件不存在 将异常分类以后针对不同类型的异常要提供具体的解决方案 RestControllerAdvice 名称 RestControllerAdvice 类型 类注解 位置 Rest风格开发的控制器增强类定义上方 作用 为Rest风格开发的控制器类做增强 说明:此注解自带ResponseBody注解与Component注解具备对应的功能 ExceptionHandler 名称 ExceptionHandler 类型 方法注解 位置 专用于异常处理的控制器方法上方 作用 设置指定异常的处理方案功能等同于控制器方法 出现异常后终止原始控制器执行,并转入当前方法执行 说明此类方法可以根据处理的异常不同制作多个方法分别处理对应的异常 异常解决方案 业务异常BusinessException 发送对应消息传递给用户提醒规范操作 大家常见的就是提示用户名已存在或密码格式不正确等系统异常SystemException 发送固定消息传递给用户安抚用户 系统繁忙请稍后再试系统正在维护升级请稍后再试系统出问题请联系系统管理员等发送特定消息给运维人员提醒维护 可以发送短信、邮箱或者是公司内部通信软件记录日志 发消息和记录日志对用户来说是不可见的属于后台程序其他异常Exception 发送固定消息传递给用户安抚用户发送特定消息给编程人员提醒维护纳入预期范围内 一般是程序没有考虑全比如未做非空校验等记录日志 全局异常处理 当某个Controller方法中出现了异常系统底层就会查找有没有定义全局异常处理对象。 这个全局异常处理对象中有没有定义对应的异常处理方法假如有就调用此方法处理异常。假如没有会查找对应异常的父类异常处理方法。 1.1 什么是全局异常处理器 全局异常处理器是Spring MVC框架中的一种异常处理机制用于统一 处理由控制器抛出的异常。 全局异常处理器可以帮助我们捕获和处理控制器中的异常并且可以根据不同的异常类型进行不同的处理操作从而保障应用的健壮性和稳定性。 当然Spring MVC中有内置的异常处理对象但是呈现的结果对于用户端不友好所以实际项目我们一般会使用全局异常处理器处理异常。 1.2 全局异常处理器的配置 Spring MVC中的全局异常处理器可以通过以下方式进行配置 创建 exception.GlobalExceptionHandler类并添加异常处理方法使用 ControllerAdvice 注解 或者 RestControllerAdvice 注解标注该类在异常处理方法上添加 ExceptionHandler 注解用于指定控制器中需要处理的异常类型。 1.3使用流程 1创建全局异常处理器类 工程目录下创建 exception.GlobalExceptionHandler ControllerAdvice注解 定义全局异常处理器处理Controller中抛出的异常。 RestControllerAdvice注解 复合注解是ControllerAdvice注解和ResponseBody注解的组合 用于捕获Controller中抛出的异常并对异常进行统一的处理还可以对返回的数据进行处理。 2创建异常处理方法 在异常处理方法上添加 ExceptionHandler 注解 ExceptionHandler 注解 用于捕获Controller处理请求时抛出的异常并进行统一的处理。 关于Throwable 在开发实践中通常会添加一个处理Throwable的方法它将可以处理所有类型的异常则不会再出现500错误 GlobalExceptionHandler中添加处理 Throwable 的方法 Spring Validation数据校验(目前主流) 关于Spring Validation 在实际项目我们需要对客户端传递到服务端的参数进行校验用于判定请求参数的合法性假如请求参数不合法则不可以再去执行后续的业务了。那如何校验呢 第一种方式是我们在控制层方法中每次都自己进行参数有效值的判断不合法可以抛出异常但是工作量和代码复杂度会比较高 第二种方式就是采用市场上主流的 Spring Validation 框架去实现校验所以 Spring Validation 框架的主要作用是 检查参数的基本有效性。 数据校验 数据校验谁来做 客户端和服务器端都要做。 服务端怎么校验 根据对数据合法性的要求自己手动编写数据校验的代码使用现成的验证框架 Validation POJO类参数校验 流程 第1步参数前添加Validated 注解第2步添加参数校验注解NotNull ;第3步: 定义对应的异常处理方法, 处理此异常 MethodArgumentNotValidException ; 自定义枚举状态码        VALIDATED_ERROR(3002, 参数校验失败); 统一响应结果的返回 ExceptionHandler public JsonResult doHandleXxxx(MethodArgumentNotValidException ex){String message ex.getFieldError().getDefaultMessage();return new JsonResult(StatusCode.VALIDATED_ERROR, message); } 第4步重启工程在Knife4j 中进行测试. 常用注解 Validated 可以添加在类上也可以添加在参数上参数验证注解。 NotNull 要求不能为null NotEmpty 要求不能为空字符串同时不能为null NotBlank 要求不能为空白串同时不能为空字符串也不能为null Size 作用于字符串类型 限定字符串长度范围Size(minx, maxx, messagex) Range 作用在数值类型 限定数值类型的范围Range(minx, maxx, messagex) Pattern 使用正则表达式进行验证Pattern(regexp正则表达式, message提示消息) 非POJO参数校验 在 Spring Validation 中除了对 POJOPlain Old Java Object进行校验的功能外还支持对非 POJO 进行校验比如 String、Integer、Double 等类型的参数。 使用流程 在当前方法所在的类上添加 Validated 注解在参数上添加对应的检查注解 拦截器 拦截器定义 拦截器Interceptor是一种动态拦截方法调用的机制在SpringMVC中动态拦截控制器方法的执行, 他是是 SpringMVC 提供的一个组件它允许我们在请求到达处理方法之前或之后对请求拦截并进行预处理或后处理。拦截器可以帮助我们实现许多功能如用户权限验证、记录日志、处理异常等。 ​ 特性 拦截将请求拦住执行后续操作过滤对拦截到的请求进行统一处理放行处理完请求后如果满足条件则放行让请求继续访问下一步的资源。 作用 在指定的方法调用前后执行预先设定的代码阻止原始方法的执行总结拦截器就是用来做增强 应用场景 权限验证如登录检测进入处理器检测检测是否登录如果没有直接返回到登录页面。日志记录记录请求信息的日志以便进行信息监控、信息统计等。性能监控有时系统在某段时间莫名其妙负载很高可通过拦截器在进入处理器之前记录开始时间在处理完后记录结束时间从而得到该请求的处理时间。 执行顺序 (1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务器接收到请求以后会去判断请求的是静态资源还是动态资源 (3)如果是静态资源会直接到Tomcat的项目部署目录下去直接访问 (4)如果是动态资源就需要交给项目的后台代码进行处理 (5)在找到具体的方法之前我们可以去配置过滤器(可以配置多个)按照顺序进行执行 (6)然后进入到到中央处理器(SpringMVC中的内容)SpringMVC会根据配置的规则进行拦截 (7)如果满足规则则进行处理找到其对应的controller类中的方法进行执行,完成后返回结果 (8)如果不满足规则则不进行处理 (9)这个时候如果我们需要在每个Controller方法执行的前后添加业务具体该如何来实现? 这个就是拦截器要做的事。 ​ 拦截器和过滤器之间的区别是什么? 归属不同Filter属于Servlet技术Interceptor属于SpringMVC技术拦截内容不同Filter对所有访问进行增强Interceptor仅针对SpringMVC的访问进行增强 设置拦截器方法 Override //原始方法调用前执行的内容 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(preHandle...);return true; }Override //原始方法调用后执行的内容 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(postHandle...); }Override //原始方法调用完成后执行的内容 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(afterCompletion...); } 拦截器中的preHandler方法如果返回true,则代表放行会执行原始Controller类中要请求的方法如果返回false则代表拦截后面的就不会再执行了 拦截器执行的顺序是和配置顺序有关。就和前面所提到的运维人员进入机房的案例先进后出。 当配置多个拦截器时形成拦截器链拦截器链的运行顺序参照拦截器添加顺序为准当拦截器中出现对原始处理器的拦截后面的拦截器均终止运行当拦截器运行中断仅运行配置在前面的拦截器的afterCompletion操作 ​ preHandle与配置顺序相同必定运行 postHandle:与配置顺序相反可能不运行 afterCompletion:与配置顺序相反可能不运行。 这个顺序不太好记最终只需要把握住一个原则即可:以最终的运行结果为准 ​ 设置拦截器配置类 /*** 注册浏览器添加规则*/ Configuration public class MvcConfig implements WebMvcConfigurer {Overridepublic void addInterceptors(InterceptorRegistry registry) {/** 拦截所有请求 *///registry.addInterceptor(new MyIntercepter());/** 拦截指定请求 */registry.addInterceptor(new MyInterceptor()).addPathPatterns(/users/login);/** 拦截指定路径下所有请求 *///registry.addInterceptor(new MyInterceptor())// .addPathPatterns(/users/**);/** 排除指定的请求 [拦截指定路径下除了指定请求之外的所有请求] */ // registry.addInterceptor(new MyInterceptor()) // .addPathPatterns(/users/**) // .excludePathPatterns(login);} }
http://www.pierceye.com/news/103017/

相关文章:

  • cms网站后台模版惠州网站设计哪家好
  • 海南智能网站建设设计湘潭学校网站建设 x磐石网络
  • 网站建设的入门书籍表格我做视频网站
  • 数据库跟网站内容青岛公司做网站的价格
  • 成都市金牛区建设和交通局网站营销专业网站
  • 免费的视频网站如何赚钱wordpress推广系统
  • 上海酒店团购网站建设网站建设风险分析
  • 做网站的抬头怎么做南昌app定制
  • 深圳市企业网站建设企业品牌设计
  • 做图网站有哪些内容惠州抖音推广
  • 郑州中原区建设局网站公司网站建设素材
  • 企业手机网站源码下载企查查网页版
  • 金科网站建设ps做网站难吗
  • 如何在年报网站上做遗失公告wordpress默认摘要
  • 中国网站服务器哪个好有哪些做公司网站
  • 做宠物的网站有哪些如何做电商生意
  • 具有品牌的常州做网站关于网站建设的广告词
  • 孝感网站推广品牌策划公司都有哪些
  • 保洁公司用哪些网站做推广wordpress aj提交评论
  • 互联网金融p2p网站建设模板简历模板免费下载网站
  • 绍兴建设网站制作3免费做网站
  • 东莞运营推广网站建设费用wordpress 单栏 主题
  • 律师事务所网站制作WordPress 经典博客
  • 建立网站功能wordpress微博头条
  • 多就能自己做网站取名网站怎么做
  • 网站域名百度云网站环境建设国家城乡建设规划部网站
  • 网站设计的实例wordpress 微博备份
  • 网络推销黑河网站seo
  • 天津市建设工程管理总队网站wordpress 自媒体模版
  • 用网站做宣传的方案郴州买房网站