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

Javaweb登录校验

登录校验

JWT令牌的相关操作需要添加相关依赖

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>

一、摘要

场景:当我们想要访问一个网站时,我们一般都需要进行登录验证,这时候就会涉及到一系列的问题

问题:

  • 什么时候进行登录校验?
  • 登录校验你该如何实现?如何设计高效,高健壮性的校验方式?
  • 进行登录校验时,你是以什么方式进行数据传递的?如何实现数据的传递

二、为什么要进行身份校验

试想以下场景,我们在如果我们对一个网站不进行有效的登录校验,而是可以直接通过网址:http://localhost:90/#/system/emp直接进入到网站内部,是不是极其不安全,我们应该在响应每一次请求前都进行一次登录校验,如果用户还没有登录。那么就必须先进行登录校验才能进行后续操作

在这里插入图片描述

三、拦截器

我们已经知道使用登录校验的使用场景,那么我们该如何设计一个高效的登录校验功能?是在每一个请求处理函数里面都添加一次if判断吗?这显然是不合理的,如果我们一个网站功能很复杂,那么面对如此多的请求并在每一个请求中都添加一个if判断就显得十分low,而且健壮性不高,不利于维护。因此,我们就引出了拦截器的概念,我们创建一个工具类,用于处理每一次请求,我们每次向服务器发送请求时,都需要先经过拦截器,经过身份校验后再能传递到对应的处理函数,然后,服务器响应回来的数据同样需要先经过拦截器才能返回给浏览器

在这里插入图片描述

四、传递数据三种方式

我们已经知道拦截器的概念了,接下来就很有必要了解数据传递这样玩意,由于HTTP 协议是无状态的,这意味着每个请求都是独立的,服务器不会保存关于之前请求的任何信息。每次客户端发送请求时,服务器都会独立处理该请求,并在发送响应后忘记关于该请求的任何信息。这就意味着,即使我们已经通过登录页面登录进去了,但是浏览器还是不知道我们已经登录了,因为每一次请求都是独立的,所以后续我们进行的每一次请求,都至少要携带用户登录的信息,如用户名,密码等,这样才能正常通过拦截器,将数据发送给后端继续后续操作,如果不能实现数据传递,这样就很麻烦了,所以这里就引出了以下几种数据传递的方式,会话跟踪技术

在这里插入图片描述

  • 客户端会话跟踪技术:Cookie
  • 服务器会话跟踪技术:Session
  • 令牌技术

这三种方式各有优缺点,以下是三种技术的优缺点对比

在这里插入图片描述

简单解释为什么 session会话无法在集群中使用:

在我们进行登录验证时,如果用户没有进行登录过,就会在服务器那边创建一个session记录,在用户下次登录时会自动检测判断用户有没有登录过,但是集群技术呢,会将我们的数据存储在不同的服务器中,而不是只保存在一个服务器,这就导致了如果我们下次访问资源时访问了另一个没有进行登录校验过的服务器,就得重新进行验证,所以无法在集群中有效使用

由于session的底层还是由cookie,所以无法在移动端中使用,而且用户甚至可以禁用掉cookie,慢慢的,cookie和session技术已不再是主流,目前的主流技术就是令牌技术,这里我们以JWT令牌技术为例

在这里插入图片描述

为什么令牌技术能够解决集群认证,移动端认证等问题?

在我们们的登录请求发送到后端时,后端服务器会检测有没有创建令牌,如果没有,那么就创建令牌并传递回前端,然后前端将令牌保存起来,注意这里的保存可以保存在任意存储空间中,可以保存到cookie,也可以保存在其他地方,在后续的请求中,前端浏览器会自动将令牌发送给后端,这样就解决了cookie技术不能在安卓中使用的问题,同时,因为令牌经Base64编码和数字签名加密,安全性也不需要考虑,解决了cookie安全性不高的问题,由于令牌也不在后端服务器中保存,因此也不会存在集群的问题。在令牌发送给后端后会解析令牌,获取其中的数据,这样就能通过登录校验了。

五、相关会话技术的实现

1、cookie技术
@Slf4j
@RestController
public class SessionController {/*** 设置Cookie* @param response 响应* @return 设置Cookie*/@GetMapping("/setCookie")public Result setCookie(HttpServletResponse response){response.addCookie(new Cookie("name", "zhangsan"));log.info("设置Cookie成功, name=zhangsan");return Result.success();}/*** 获取Cookie* @param request 请求* @return 获取Cookie*/@GetMapping("/getCookie")public Result getCookie(HttpServletRequest request){Cookie[] cookies = request.getCookies();for(Cookie cookit : cookies){if(cookit.getName().equals("name")){log.info("获取Cookie成功, name={}", cookit.getValue());}}return Result.success();}}
2、session技术

如果是第一次请求,那么session对象是不存在的,后端服务器会自动创建一个session对象,每个对象都有一个对应的ID,然后服务器响应数据时,会以cookie的方式将sessionID返回给浏览器,即在响应头中添加了一个Set-Cookie:JSESSIONID=session_ID,然后浏览器会自动将这个cookie存储在浏览器,然后在后续的每一次请求当中都会将cookie中的数据获取出来并携带到服务端,然后服务器通过请求中的session_ID查看本地有没有这个会话对象,这样就能在同一个会话的多次请求中共享数据了

   /*** 设置Session* @param session 会话* @return 设置Session*/@GetMapping("/session1")// 如果session对象不存在,会自动创建一个,如果存在,会直接返回session对象public Result session1(HttpSession session){log.info("HttpSession-s1: {}", session.hashCode());session.setAttribute("loginUser", "tom"); //往session中存储数据log.info("session.getAttribute: {}", session.getAttribute("loginUser"));return Result.success();}/*** 设置Session* @param request 请求* @return 设置Session*/@GetMapping("/session2")public Result session2(HttpServletRequest request){// 如果session对象不存在,会自动创建一个,如果存在,会直接返回session对象HttpSession session = request.getSession();log.info("HttpSession-s2: {}", session.hashCode());Object loginUser = session.getAttribute("loginUser"); //从session中获取数据log.info("loginUser: {}", loginUser);return Result.success(loginUser);}
3、JWT令牌

同样的,第一次请求时没有JWT令牌会创建令牌并返回给前端,前端会将这个令牌保存起来,在以后的每一次请求中,都会在请求头中携带这个令牌(token),然后通过后端拦截器或过滤器的解析验证,进行后续操作

 /*** 生成JWT令牌*/@Testpublic void generateJwt() {String signKey = "terminal";Long expire = 43200000L;Map<String, Object> claims = new HashMap<>();claims.put("username", "admin");String jwt = Jwts.builder().addClaims(claims).signWith(SignatureAlgorithm.HS256, signKey).setExpiration(new Date(System.currentTimeMillis() + expire)).compact();System.out.println("jwt = " + jwt);}/*** 解析JWT令牌*/@Testpublic void parseJWT() {String signKey = "terminal";String token = "eyJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzE3MDQxMjk2fQ.p-UYxhJQY30cYELv8hETYHWMs74D-lo1a0tdi3xXXBU";String jwt = Jwts.parser().setSigningKey(signKey).parseClaimsJws(token).getBody().toString();System.out.println("jwt = " + jwt);}

六、使用过滤器和拦截器进行身份验证

1、过滤器(Filter)
package com.example.filter;import com.alibaba.fastjson.JSONObject;
import com.example.pojo.Result;
import com.example.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;// @WebFilter(urlPatterns = "/*") 表示拦截所有请求
@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {log.info("demoFilter init");Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;// 获取URLString url = request.getRequestURI().toString();if (url.contains("login")) {filterChain.doFilter(servletRequest, servletResponse);return;}// 获取tokenString jwt = request.getHeader("token");log.info("token = {}", jwt);// 如果token为空,但会未登录信号if (!StringUtils.hasLength(jwt)) {Result result = Result.error("NOT_LOGIN");String notLogin = JSONObject.toJSONString(result);response.getWriter().write(notLogin);return;}try {JwtUtils.parseJWT(jwt);} catch (Exception e) {e.printStackTrace();log.info("jwt令牌无效");Result result = Result.error("NOT_LOGIN");String notLogin = JSONObject.toJSONString(result);response.getWriter().write(notLogin);return;}//放行filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {log.info("demoFilter destroy");Filter.super.destroy();}
}
2、拦截器(Interceptor)
  • 拦截器配置
package com.example.config;import com.example.interceptor.LoginCheckInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** 拦截器配置类*/
// Configuration 设置该类为一个配置类
@Slf4j
@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginCheckInterceptor loginCheckInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 注册一个拦截器,拦截除了/login之外的所有请求registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");}
}
  • 拦截器处理逻辑
package com.example.interceptor;import com.alibaba.fastjson.JSONObject;
import com.example.pojo.Result;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.util.StringUtils;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** 拦截器处理逻辑*/
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {@Override// 目标资源方法前执行,true为方行,false为拦截// 与doFilter的fileChain前执行的方法类似public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 获取tokenString token = request.getHeader("token");// 如果token为空,返回未登录信号if(!StringUtils.hasLength(token)){Result error = Result.error("NOT_LOGIN");String notLogin = JSONObject.toJSONString(error);response.getWriter().write(notLogin);return false;}// 放行return true;}@Override// 目标资源方法后执行后执行// 与doFilter的fileChain后执行的方法类似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");}
}

相关文章:

Javaweb登录校验

登录校验 JWT令牌的相关操作需要添加相关依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>一、摘要 场景&#xff1a;当我们想要访问一个网站时&am…...

vxe-table 列表过滤踩坑_vxe-table筛选

但是这个过滤输入值必须是跟列表的值必须一致才能查到&#xff0c;没做到模糊查询的功能&#xff0c;根据关键字来过滤并没有实现。 下面提供一下具体实现方法&#xff1a;&#xff08;关键字来过滤&#xff09; filterNameMethod({ option, row }) {if (row.name.indexOf(op…...

计算机网络:网络层 - IP数据报的转发

计算机网络&#xff1a;网络层 - IP数据报的转发 基于终点转发最长前缀匹配二叉线索树路由表特殊路由特定主机路由默认路由 IP多播 基于终点转发 路由器转发报文时&#xff0c;是通过报文中的目的地址字段来转发的&#xff0c;也即是说路由器只知道终点的IP地址&#xff0c;根…...

颠覆与创新:探寻Facebook未来的发展路径

Facebook&#xff0c;这个曾经引领社交网络革命的巨头&#xff0c;在如今竞争激烈的科技市场中&#xff0c;正面临着前所未有的挑战和机遇。如何在不断变化的数字世界中保持竞争力&#xff0c;成为业界领先者&#xff0c;这是摆在Facebook面前的重要课题。本文将探寻Facebook未…...

太湖远大毛利率下滑:研发费用率远低同行,募投项目合理性疑点重重

《港湾商业观察》黄懿 6月20日&#xff0c;浙江太湖远大新材料股份有限公司&#xff08;以下简称“太湖远大”&#xff0c;873743.NQ&#xff09;即将迎来过会。 2023年11月30日&#xff0c;太湖远大所提交的上市申请材料正式获北交所受理&#xff0c;保荐机构为招商证券&…...

赶紧收藏!2024 年最常见 20道设计模式面试题(八)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 20道设计模式面试题&#xff08;七&#xff09;-CSDN博客 十五、模板方法模式是如何在父类中定义算法框架的&#xff1f; 模板方法模式通过在父类&#xff08;通常是一个抽象类&#xff09;中定义算法的骨架&#x…...

JAVA学习-练习试用Java实现“比较版本号”

问题&#xff1a; 给定两个版本号 version1 和 version2 &#xff0c;请比较它们。 版本号由一个或多个修订号组成&#xff0c;各修订号由一个 . 连接。每个修订号由 多位数字 组成&#xff0c;可能包含 前导零 。每个版本号至少包含一个字符。修订号从左到右编号&#xff0c;…...

云原生分级SLA

云原生分级SLA&#xff08;Service Level Agreement&#xff0c;服务等级协议&#xff09;规则是为了确保云服务提供商和客户之间对服务性能、可用性和其他关键指标有明确的理解和期望。这些规则通常基于业务需求和技术实现来制定&#xff0c;并根据服务的不同级别进行分级。以…...

java干货 线程间通信

文章目录 一、线程间通信1.1 为什么要处理线程间通信&#xff1f;1.2 什么是等待唤醒机制&#xff1f; 二、等待唤醒机制使用2.1 等待唤醒机制用到的方法2.1.1 wait2.1.2 notify 2.2 线程通信代码实践2.2.1 重要说明2.2.2 代码 一、线程间通信 1.1 为什么要处理线程间通信&…...

【人机交互 复习】第6章 交互式系统的设计

一、设计框架 1.在建立了一组需求之后&#xff0c;设计即将开始&#xff0c;建议采取自上面下的方式&#xff0c;首先把重点放在大的方面&#xff0c;生成低保真且不包含具体细节的方案&#xff0c;一般通过写剧本来确定交互设计模式与逻辑。 2.设计框架&#xff1a; 先站在一个…...

1-函数极限与连续

1 2 平方项没有考虑到&#xff08;其正负&#xff09;...

【C++题解】1670 - 象棋大赛

问题&#xff1a;1670 - 象棋大赛 类型&#xff1a;分支问题 题目描述&#xff1a; 市里要组织象棋大赛&#xff0c;年龄在 8∼30 周岁之间的选手可以报名参赛。为了公平起见&#xff0c;大赛组委会将选手们分了青年组、少年组和儿童组&#xff0c;大赛组委会规定&#xff1a…...

Samba:用于高效无限上下文语言建模的简单混合状态空间模型

Samba: Simple Hybrid State Space Models for Efficient Unlimited Context Language Modeling &#x1f4dc; 文献卡 Samba: Simple Hybrid State Space Models for Efficient Unlimited Context Language Modeling作者: Liliang Ren; Yang Liu; Yadong Lu; Yelong Shen; …...

通俗易懂的ChatGPT原理简介

一、引言 随着人工智能的发展&#xff0c;聊天机器人已经成为我们生活中的常见工具。而在众多聊天机器人中&#xff0c;ChatGPT 无疑是最受关注的一个。ChatGPT 是由 OpenAI 开发的一种基于生成式预训练模型&#xff08;GPT&#xff09;的大型语言模型。本文将通俗易懂地介绍 …...

你认为 AI 作图程序「MidJourney」有哪些比较好用的关键词?

玩了一段时间的MidJourney&#xff0c;打算把这个回答做成资源帖。也欢迎在评论区补充讨论。 MidJourney的极简指南 快速上手 装discord&#xff0c;或者直接打开网址 https://discord.gg/midjourney 注册用户。进入Midjourney的官方服务器后&#xff0c;在左侧栏找一个newb…...

9.2JavaEE——JDBCTemplate的常用方法(一)excute()方法

execute()方法用于执行SQL语句&#xff0c;其语法格式如下&#xff1a; jdTemplate.execute("SQL 语句");下面以创建数据表的SQL语句为例&#xff0c;来演示excute()方法的使用&#xff0c;具体步骤如下。 1、创建数据库 在MySQL中&#xff0c;创建一个名为spring的…...

正向代理和反向代理的区别

正向代理和反向代理的主要区别在于代理服务器所服务的对象不同。 正向代理&#xff08;Forward Proxy&#xff09;&#xff1a;正向代理的客户端是内部网络的用户。当内部网络的用户想要访问外部网络&#xff08;例如互联网&#xff09;时&#xff0c;可以通过正向代理服务器来…...

express入门03增删改查

目录 1 搭建服务器2 静态文件托管3 引入bootstrap4 引入jquery5 编写后端接口5.1 添加列表查询方法5.2 添加路由5.3 添加数据表格 总结 我们前两篇介绍了如何利用express搭建服务器&#xff0c;如何实现静态资源托管。那利用这两篇的知识点&#xff0c;我们就可以实现一个小功能…...

【usb设备端口异常】——使用ls /dev/video*查看设备号时出现报错:ls:无法访问‘/dev/video*‘: 没有那个文件或目录

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、ls:无法访问/dev/video*: 没有那个文件或目录1. 问题描述2. 原因分析3. 解决方法 总结 前言 一、ls:无法访问’/dev/video*: 没有那个文件或目录 使用的这…...

Java实现异步开发的方式

1&#xff09;、继承 Thread 2&#xff09;、实现 Runnable 接口 3&#xff09;、实现 Callable 接口 FutureTask &#xff08;可以拿到返回结果&#xff0c;可以处理异常&#xff09; 4&#xff09;、使用线程池 区别&#xff1a;1、2&#xff09;不能得到返回值 …...

小知识点快速总结:Batch Normalization Layer(BN层)的作用

本系列文章只做简要总结&#xff0c;不详细说明原理和公式。 目录 1. 参考文章2. 主要作用3. 具体分析3.1 正则化&#xff0c;降低过拟合3.2 提高模型收敛速度&#xff0c;加速训练3.3 减少梯度爆炸或者梯度消失的情况 4. 补充4.1 BN层做的是标准化不是归一化4.2 BN层的公式4.…...

【SpringCloud】负载均衡(Spring Cloud LoadBalancer)

负载均衡 当服务流量增大时&#xff0c;通常会采用增加机器的方式进行扩容。负载均衡就是用来在多个机器或者其他资源中&#xff0c;按照一定的规则合理分配负载。其中的实现可以分成客户端负载均衡和服务端负载均衡。 服务端负载均衡 在服务端进行负载均衡的算法分配。 比…...

三生随记——输入法之谜

在深夜的电脑前&#xff0c;李浩专心致志地敲打着键盘&#xff0c;为他的小说写下最后一章。然而&#xff0c;随着他不断输入文字&#xff0c;他渐渐察觉到一丝不对劲。每次他尝试输入特定的词汇&#xff0c;输入法都会自动跳转到一些与主题毫不相关的句子&#xff0c;甚至有些…...

【名词解释】Unity中的3D物理系统:刚体

Unity中的3D物理系统是用于模拟现实世界中物体的运动和相互作用的一套工具和组件。刚体&#xff08;Rigidbody&#xff09;是Unity 3D物理系统中的一个核心组件&#xff0c;它允许游戏对象&#xff08;GameObject&#xff09;受到重力和外力的影响&#xff0c;并参与碰撞检测。…...

icon转svg处理

一般情况下&#xff0c;图标我们可以找UI或者去iconfont.cn获得一个svg格式的文件。然后再IDE中以文本的方式打开&#xff0c;然后格式化&#xff0c;就可以看到代码。代码中一般是最外层一个svg标签&#xff0c;里面是一个或者多个path。这个时候&#xff0c;我们使用h方法来实…...

已成功见刊检索的国际学术会议论文海报展示(2)

【先投稿先送审】第四届计算机、物联网与控制工程国际学术会议&#xff08;CITCE 2024) 大会官网&#xff1a;www.citce.org 时间地点&#xff1a;2024年11月1-3日&#xff0c;中国-武汉 收录检索&#xff1a;EI Compendex&#xff0c;Scopus 主办单位&#xff1a;四川师范…...

EasyCVR/EasyDSS无人机直播技术助力野生动物监测

近日有新闻报道&#xff0c;一名挖掘机师傅在清理河道时&#xff0c;意外挖出一只稀有的扬子鳄&#xff0c;挖机师傅小心翼翼地将其放在一边&#xff0c;扬子鳄也顺势游回一旁的河道中。 随着人类对自然环境的不断探索和开发&#xff0c;野生动物及其栖息地的保护显得愈发重要。…...

AI视频教程下载-ChatGPT 生产力 + 时间管理

ChatGPT Productivity Time Management. ChatGPT Productivity ChatGPT 显著提升生产力 不寻常的时间管理技巧。ChatGPT 工作&#xff0c;Chat GPT 自动化&#xff0c;ChatGPT 2023&#xff01; 对关于ChatGPT的讨论感到好奇&#xff0c;想知道如何利用它为自己带来好处吗&a…...

Java 集合框架:LinkedList 的介绍、使用、原理与源码解析

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 014 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…...

【Ruby爬虫01】某吃瓜网站图片数据采集

介绍 由于最近在学习Ruby&#xff0c;写一个爬虫锻炼一下。涉及xml解析、多线程、xpath语法等基础知识。 实现代码 使用说明 使用前请先安装如下gem gem install nokogiri http openssl# nokogiri&#xff1a;一个解析xml和html的库&#xff0c;支持css、xpath语法 # htt…...

物流网站建设方案权限管理/微信搜索seo优化

1、const成员函数&#xff0c;和 非const成员函数&#xff0c;可以构成重载。 2、const成员变量是可以的&#xff0c;而且初始化必须要在参数化列表初始化。 3、int f(int &x) { cout << x << endl; } f(3*3); 这样是不行的&#xff0c;无法引用一个临时变量&a…...

建立网站是什么建立的/免费行情软件网站下载

由于单机Redis存储能力受单机限制&#xff0c;以及无法实现读写操作的负载均衡和读写分离&#xff0c;无法保证高可用。本篇就来介绍 Redis 集群搭建方案及实现原理&#xff0c;实现Redis对数据的冗余备份&#xff0c;从而保证数据和服务的高可用。主从复制是哨兵和集群的基石&…...

建设网站 证件/网店运营在哪里学比较好些

鸢尾花&#xff08;adam同时结合SGDM一阶动量和RMSPro二阶动量&#xff09; # 利用鸢尾花数据集&#xff0c;实现前向传播、反向传播&#xff0c;可视化loss曲线 # adam同时结合SGDM一阶动量和RMSPro二阶动量import tensorflow as tf from sklearn import datasets from matpl…...

有什么字体设计的网站/推广关键词优化

extjs getel 怎么用 分享| 2014-10-27 11:16电波1764 |浏览 250 次Javascript编程语言软件开发2014-10-27 11:57 提问者采纳getEl component.el 就是一个组件的顶级的元素....可以理解为最外层的那个div... 直接用component.getEl() 就可以 123456789Ext.create("Ext.Pan…...

想找人做网站/湛江百度seo公司

有朋友提到上篇文章的操作步骤太简略&#xff0c;那么这里再发一个详细版。读者完全可以按照指导一步一步搭建自己的Minecraft编程环境。Python下载及安装&#xff0c;这里略过&#xff0c;推荐Python3.7以上版本&#xff0c;具体的下载、安装和学习&#xff0c;网上有很多教程…...

东莞企业网站定制设计/简单的网页设计源代码

csrf防护手段 登陆csrf建议使用严格的referer验证策略来防御登陆csrf&#xff0c;登陆表单一般都是通过https发送&#xff0c;在合法请求里面的referer都是真实可靠的。如果没有referer字段登陆请求&#xff0c;网站应该直接拒绝以防御这种恶意的修改。 对于使用https协议的网…...