如何用Java实现登录验证 Java用户登录功能开发方法

用户登录验证的核心步骤为:1.前端收集用户名和密码并通过post请求发送;2.后端接收数据并根据用户名查询数据库中的哈希密码与盐值;3.使用相同算法对输入密码进行哈希处理并比对;4.认证成功则创建会话维持登录状态,失败则提示错误并实施防暴力破解机制。密码需采用bcrypt、scrypt或argon2等安全算法存储,确保加盐与密钥延伸,防止彩虹表攻击。会话管理通过httpsession或jwt实现,保障用户状态识别与安全性。登录失败时应模糊提示、限制尝试次数、记录日志并优化找回密码流程,以兼顾用户体验与系统安全。

如何用Java实现登录验证 Java用户登录功能开发方法

在Java中实现登录验证,核心在于安全地比对用户提供的凭据与系统中存储的信息。这通常涉及几个关键步骤:前端收集数据、后端接收并处理、数据库查询与密码比对,最后是会话管理以维持用户登录状态。这不仅仅是技术实现,更关乎用户数据的安全与系统的健壮性。

如何用Java实现登录验证 Java用户登录功能开发方法

用户登录功能开发方法

要实现一个可靠的Java用户登录功能,我们通常会遵循一套成熟的流程。首先,前端(比如一个HTML表单)负责收集用户的用户名和密码。当用户点击登录按钮时,这些数据会通过HTTP POST请求发送到后端服务器。

立即学习“Java免费学习笔记(深入)”;

如何用Java实现登录验证 Java用户登录功能开发方法

在后端,一个Servlet或Spring MVC控制器会接收到这个请求。这里是关键:我们不能直接拿用户输入的密码去和数据库里存的明文密码比对,那太危险了。正确的做法是,数据库里存的密码必须是经过哈希加盐(salted hash)处理的。所以,后端会根据用户提供的用户名去数据库查询对应的用户信息,包括那个哈希过的密码和盐值。

拿到数据库里的哈希密码和盐值后,我们会用同样的哈希算法和盐值,对用户刚刚输入的明文密码进行哈希处理。然后,比对这个新生成的哈希值和数据库里取出的哈希值是否一致。如果一致,恭喜,验证通过!这时,我们通常会创建一个用户会话(HttpSession),把用户的ID或者其他标识符存进去,然后重定向用户到他们想去的页面,比如个人中心。如果比对失败,那就提示用户“用户名或密码错误”,并让他们重试。

如何用Java实现登录验证 Java用户登录功能开发方法

这个过程中,错误处理和安全性是重中之重。比如,防止SQL注入、防止暴力破解、确保密码哈希算法的强度,以及妥善管理用户会话的生命周期。

用户认证的核心挑战是什么?

谈到用户认证,我个人觉得最大的挑战从来都不是“怎么写代码”,而是“怎么写出安全且用户体验好的代码”。这听起来有点玄乎,但确实是这样。首先是安全性,这毋庸置疑是基石。密码泄露、弱密码攻击、SQL注入、跨站脚本(XSS)、跨站请求伪造(CSRF)等等,这些都是实实在在的威胁。一个简单的MD5哈希密码,在今天看来简直是“裸奔”,很容易被彩虹表破解。所以,选择正确的密码存储方案、实施多因素认证(MFA)机制、以及对各种安全漏洞的防范,都是绕不开的硬骨头。

再来就是用户体验。想想看,如果你的登录页面总是报错,或者登录流程特别繁琐,用户很快就会流失。比如,登录失败后是给出笼统的“用户名或密码错误”,还是具体到是用户名不存在还是密码不对?后者虽然看似更友好,但在安全上却可能给攻击者提供更多信息。所以,需要在用户体验和安全性之间找到一个平衡点。此外,处理并发登录、会话过期、记住我功能等,也都是需要细致考虑的细节。这些挑战往往不是单一技术点能解决的,它需要一个系统性的思考和实践。

如何选择合适的密码加密算法?

关于密码加密,我经常看到一些初学者或者甚至一些老项目还在用MD5或者SHA-1这种“过时”的哈希算法来存储密码。这简直是给自己挖坑。这些算法设计之初并不是为了密码存储,它们速度太快,且容易被彩虹表攻击。

那么,现在应该用什么呢?业界公认的密码哈希算法,至少得是 BCrypt、SCrypt 或者 Argon2。它们都有几个关键特性:

加盐(Salting):为每个用户生成一个独一无二的随机盐值,和密码一起进行哈希。即使两个用户设置了相同的密码,它们的哈希值也会因为盐值不同而不同。这能有效防御彩虹表攻击。密钥延伸(Key Stretching)/迭代次数:通过多次重复哈希过程来增加计算成本。这意味着攻击者破解一个密码所需的时间会呈几何级数增长。BCrypt允许你指定迭代次数(work factor),SCrypt和Argon2也有类似的参数。

在Java生态中,如果你使用Spring Security,那么 BCryptPasswordEncoder 是一个非常方便且推荐的选择。它已经封装了加盐和密钥延伸的逻辑,你只需要简单地配置和使用即可。

AppMall应用商店 AppMall应用商店

AI应用商店,提供即时交付、按需付费的人工智能应用服务

AppMall应用商店 56 查看详情 AppMall应用商店

一个简单的BCrypt使用示例(不依赖Spring Security,但原理相同):

import org.mindrot.jbcrypt.BCrypt; // 需要引入jbcrypt库public class PasswordUtil {    // 生成哈希密码    public static String hashPassword(String plainPassword) {        // BCrypt.gensalt() 会生成一个随机盐值,并包含迭代次数信息        // 默认迭代次数是10,可以根据需要调整        return BCrypt.hashpw(plainPassword, BCrypt.gensalt());    }    // 验证密码    public static boolean checkPassword(String plainPassword, String hashedPassword) {        return BCrypt.checkpw(plainPassword, hashedPassword);    }    public static void main(String[] args) {        String userPassword = "mySecretPassword123";        String hashedPassword = hashPassword(userPassword);        System.out.println("Hashed Password: " + hashedPassword);        boolean isMatch = checkPassword(userPassword, hashedPassword);        System.out.println("Password matches: " + isMatch); // 应该为 true        boolean isWrongMatch = checkPassword("wrongPassword", hashedPassword);        System.out.println("Wrong password matches: " + isWrongMatch); // 应该为 false    }}

选择这些算法,不仅仅是追赶潮流,更是对用户数据负责的表现。它们虽然计算成本略高,但与密码泄露的代价相比,这点成本微不足道。

会话管理在登录验证中扮演什么角色?

HTTP协议本身是无状态的,这意味着服务器在处理完一个请求后,就“忘记”了之前发生了什么。但对于登录验证来说,用户一旦登录成功,我们希望他在接下来的多次请求中(比如访问个人资料、购物车等)都能保持登录状态,而不需要每次都重新输入用户名和密码。这就是会话管理(Session Management)的核心作用。

在Java Web应用中,最常见的会话管理方式是使用 HttpSession。当用户首次登录成功后,服务器会创建一个唯一的会话ID,并将其存储在服务器端(通常是内存或数据库)。同时,这个会话ID会通过一个名为 JSESSIONID 的Cookie发送给用户的浏览器。此后,浏览器在每次发送请求时,都会自动带上这个Cookie,服务器就能通过这个会话ID找到对应的会话信息,从而识别出是哪个用户在操作。

会话管理的重要性在于:

维持用户状态:它是实现“一次登录,多次访问”的基础。存储用户特定数据:除了用户ID,你还可以将会话中需要频繁访问的用户权限、偏好设置等信息存储在 HttpSession 对象中,避免每次都去数据库查询。安全性考量:会话ID的生成必须足够随机和复杂,防止被猜测或暴力破解。同时,会话的生命周期管理也很重要,比如设置合理的超时时间,以及在用户登出时立即销毁会话,防止会话劫持。

当然,除了传统的 HttpSession,在RESTful API盛行的今天,无状态的Token认证(如JWT – JSON Web Tokens)也越来越流行。JWT将用户认证信息加密后直接返回给客户端,客户端在后续请求中携带这个Token,服务器通过解密Token来验证用户身份,而无需在服务器端存储会话状态。虽然JWT与传统Session在实现上有所不同,但它们都殊途同归:为了在无状态的HTTP协议之上,模拟出一种“有状态”的用户体验。选择哪种方式,往往取决于你的应用架构和具体需求。

登录验证失败后,如何提升用户体验和安全性?

当用户登录失败时,我们不应该只是简单地抛出一个“登录失败”的提示。这背后其实有很多可以优化的地方,既能提升用户体验,又能增强系统的安全性。

首先,错误提示的策略。通常,最安全的做法是给出模糊的错误信息,比如“用户名或密码不正确”。虽然这可能让用户有点摸不着头脑,但它能有效阻止攻击者通过反复试错来判断哪些用户名是有效的,哪些是无效的,从而避免账户枚举攻击。过于具体的错误提示,比如“用户名不存在”或“密码错误”,可能会给攻击者提供便利。

其次,防暴力破解机制。这是非常关键的一环。

尝试次数限制:在一定时间内(比如5分钟内)如果某个IP地址或某个用户名连续登录失败超过N次(比如5次),就暂时锁定该IP或该用户,禁止其在一段时间内再次尝试登录。验证码(CAPTCHA):当检测到异常的登录行为(如短时间内大量失败尝试)时,强制要求用户输入验证码。这能有效区分是人类用户还是自动化脚本在尝试登录。账户锁定:如果一个账户的登录失败次数达到某个阈值(比如10次),就永久性地锁定该账户,需要用户通过其他方式(如邮箱验证)才能解锁。

再者,日志记录与监控。每一次登录尝试,无论是成功还是失败,都应该被详细记录下来。日志中应包含尝试登录的用户名、IP地址、时间戳以及结果。这些日志是安全审计的重要依据,可以帮助我们发现潜在的攻击行为,比如某个IP地址在半夜对大量账户进行暴力破解。通过实时监控这些日志,可以及时触发告警机制。

最后,友好的找回密码流程。虽然这与登录失败的直接处理不是一回事,但它能极大地改善用户因忘记密码而无法登录的体验。一个安全、便捷的密码找回流程(通常通过邮箱或手机验证)是必不可少的。同时,在找回密码时,也需要注意防止账户劫持的风险。

总的来说,登录失败后的处理,不仅仅是给用户一个提示那么简单,它是一个系统安全和用户体验的综合体现。

以上就是如何用Java实现登录验证 Java用户登录功能开发方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/239199.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Linux系统中常见的web服务器故障及其修复方法
上一篇 2026年10月5日 04:04:11
scrapy爬虫库入门教程
下一篇 2025年12月13日 12:35:34

相关推荐

  • 和硕:美国建厂计划评估进入最后阶段 最快6月公布

    和硕:美国建厂计划评估进入最后阶段 最快6月公布和硕:美国建厂计划评估进入最后阶段 最快6月公布和硕:美国建厂计划评估进入最后阶段 最快6月公布和硕:美国建厂计划评估进入最后阶段 最快6月公布

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 6月6日,苹果和戴尔的主要供应商和硕总裁兼首席执行官(ceo)郑光志向股东表示,该公司正处于评估其美国工厂计划的最后阶段,预计将于6月或7公布最终决定。 郑光志在一次年度股东大会上表示,和硕的主…

    2026年10月5日 • 用户投稿
    100
  • Macbook Air如何连接外接显示器_Macbook Air外接显示器连接教程

    Macbook Air如何连接外接显示器_Macbook Air外接显示器连接教程Macbook Air如何连接外接显示器_Macbook Air外接显示器连接教程Macbook Air如何连接外接显示器_Macbook Air外接显示器连接教程Macbook Air如何连接外接显示器_Macbook Air外接显示器连接教程

    MacBook Air M2可通过USB-C/Thunderbolt接口连接外接显示器,支持扩展、镜像等模式。首先确认显示器接口类型,选择合适的USB-C线缆或转接器完成物理连接,注意开启显示器并切换输入源。随后进入系统设置→显示器,检测并配置外接屏,拖动布局图匹配实际摆放,取消“镜像显示器”以启用…

    2026年10月5日 • 用户投稿
    100
  • composer提示“Could not find package…”怎么办

    composer提示“Could not find package…”怎么办composer提示“Could not find package…”怎么办composer提示“Could not find package…”怎么办composer提示“Could not find package…”怎么办

    先确认包名称是否正确,再检查版本是否存在,最后排查镜像或仓库配置。常见原因包括拼写错误、大小写不匹配、指定版本不存在、稳定性设置限制、镜像源同步问题或私有包认证缺失。通过 Packagist 确认包名与版本,必要时调整 minimum-stability 或添加仓库配置,并确保网络和认证无误。 当你…

    2026年10月5日 • 用户投稿
    200
  • Mac如何修复磁盘权限_Mac使用磁盘工具修复磁盘权限教程

    Mac如何修复磁盘权限_Mac使用磁盘工具修复磁盘权限教程Mac如何修复磁盘权限_Mac使用磁盘工具修复磁盘权限教程Mac如何修复磁盘权限_Mac使用磁盘工具修复磁盘权限教程Mac如何修复磁盘权限_Mac使用磁盘工具修复磁盘权限教程

    首先使用“磁盘工具”急救功能修复磁盘权限,进入恢复模式后运行急救扫描并修复文件系统与权限问题;其次可通过终端命令diskutil verifyVolume和repairVolume手动验证并修复指定卷宗的权限错误。 如果您发现Mac上的应用程序无法正常访问某些文件,或者系统运行出现异常,这可能是由于…

    2026年10月5日 • 用户投稿
    100
  • 夸克手机版免费入口 夸克app免费手机版下载

    夸克手机版免费入口 夸克app免费手机版下载夸克手机版免费入口 夸克app免费手机版下载夸克手机版免费入口 夸克app免费手机版下载夸克手机版免费入口 夸克app免费手机版下载

    夸克app免费手机版下载入口在官网http://www.quark.cn,其使用亮点包括AI智能搜索、AI写作与PPT生成、超大网盘及高清追剧等功能。 夸克app免费手机版下载入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来夸克手机版免费入口及使用亮点,感兴趣的网友一起随小编来瞧瞧吧!…

    2026年10月5日 • 用户投稿
    100
  • Java中从文本文件读取并填充矩阵的教程

    本教程详细介绍了如何在Java中从特定格式的文本文件读取数据并将其填充到一个二维整数矩阵中。我们将首先探讨如何计算矩阵的正确维度,然后逐步讲解如何逐行读取文件内容,将每行解析为字符数组,并最终将这些字符转换为数字值填充到矩阵中,同时提供完整的代码示例和注意事项。 从文本文件读取矩阵数据 在java应…

    2026年10月5日
    000
  • 如何在Java中防止内存泄漏 Java内存管理优化技巧说明

    如何在Java中防止内存泄漏 Java内存管理优化技巧说明如何在Java中防止内存泄漏 Java内存管理优化技巧说明如何在Java中防止内存泄漏 Java内存管理优化技巧说明如何在Java中防止内存泄漏 Java内存管理优化技巧说明

    java防止内存泄漏的核心在于理解gc机制并主动切断无用引用链。首先,及时释放不再需要的对象引用,避免逻辑上不再需要但代码上仍存在强引用的情况。其次,正确使用java引用类型,如软引用、弱引用用于缓存场景,使对象在必要时可被gc回收。再者,妥善管理外部资源,利用try-with-resources确…

    2026年10月5日 • 用户投稿
    200
  • 苹果的特殊照顾:iPhone Air 韩国官网没有捏合手势动画

    苹果的特殊照顾:iPhone Air 韩国官网没有捏合手势动画苹果的特殊照顾:iPhone Air 韩国官网没有捏合手势动画苹果的特殊照顾:iPhone Air 韩国官网没有捏合手势动画苹果的特殊照顾:iPhone Air 韩国官网没有捏合手势动画

    9 月 10 日消息,苹果正式发布了 iphone 17、iphone 17 pro、iphone 17 pro max 以及全新机型 iphone air。目前,苹果全球各地官网已同步更新,上线了本次发布的新款设备。 ▲ 图源:苹果官网截图(中国大陆)为突出 iPhone Air 极致轻薄的设计特…

    2026年10月5日 • 用户投稿
    200
  • 虫虫漫画网页入口_虫虫漫画在线高清观看

    虫虫漫画网页入口_虫虫漫画在线高清观看虫虫漫画网页入口_虫虫漫画在线高清观看虫虫漫画网页入口_虫虫漫画在线高清观看虫虫漫画网页入口_虫虫漫画在线高清观看

    要找到虫虫漫画的稳定入口,可从可信的动漫导航站或搜索引擎入手,优先选择界面整洁、支持HTTPS、无强制下载要求的站点,并通过论坛等渠道获取最新链接;辨别真伪时注意网址简洁性与安全性标识,避免广告泛滥的山寨网站;提升观看体验需优化网络环境,选用Chrome或Edge等浏览器配合广告屏蔽插件,手动选择高…

    2026年10月5日 • 用户投稿
    200
  • Anthropic 官方确认 Claude 模型回复质量下降,现已修复

    Anthropic 官方确认 Claude 模型回复质量下降,现已修复Anthropic 官方确认 Claude 模型回复质量下降,现已修复Anthropic 官方确认 Claude 模型回复质量下降,现已修复Anthropic 官方确认 Claude 模型回复质量下降,现已修复

    Anthropic官方发布声明称,已识别并修复了两个导致Claude系列模型输出质量下滑的技术问题。公司明确表示,从未出于控制成本或应对请求压力等考虑而主动降低模型性能。 据说明,首个问题自8月5日起影响部分Claude Sonnet 4的调用请求,至8月29日后波及范围有所增加。第二个问题则在8月…

    2026年10月5日 • 用户投稿
    600
  • MySQL怎样优化索引结构 复合索引与索引选择性优化

    MySQL怎样优化索引结构 复合索引与索引选择性优化MySQL怎样优化索引结构 复合索引与索引选择性优化MySQL怎样优化索引结构 复合索引与索引选择性优化MySQL怎样优化索引结构 复合索引与索引选择性优化

    索引优化的核心在于合理构建复合索引和提升索引选择性,以加快mysql查询效率。1. 构建复合索引时应遵循最左前缀原则,并优先选择区分度高、查询频率高的列;2. 索引选择性越高,查询效率越高,低选择性列可与其他高选择性列组合成复合索引或采用其他策略;3. 使用explain命令分析索引使用情况,关注t…

    2026年10月5日 • 用户投稿
    000
  • composer如何处理git ssh密钥认证失败

    composer如何处理git ssh密钥认证失败composer如何处理git ssh密钥认证失败composer如何处理git ssh密钥认证失败composer如何处理git ssh密钥认证失败

    答案:SSH认证失败需检查密钥配置、启动SSH agent并测试连接。确认本地存在id_rsa或id_ed25519密钥,若无则生成;将公钥添加至GitHub/GitLab;执行ssh -T git@github.com测试连通性;确保ssh-agent运行且密钥已加载;必要时通过composer …

    2026年10月5日 • 用户投稿
    100
  • 夸克浏览器如何设置下载速度限制_夸克浏览器下载管理的优化技巧

    夸克浏览器如何设置下载速度限制_夸克浏览器下载管理的优化技巧夸克浏览器如何设置下载速度限制_夸克浏览器下载管理的优化技巧夸克浏览器如何设置下载速度限制_夸克浏览器下载管理的优化技巧夸克浏览器如何设置下载速度限制_夸克浏览器下载管理的优化技巧

    可通过调整线程数、关闭预加载、切换网络或使用第三方工具限制夸克浏览器下载速度。1、进入下载设置将线程数降至1-2个;2、在通用设置中关闭智能预加载;3、切换至稳定网络环境;4、用IDM+等工具接管下载并设速。 如果您在使用夸克浏览器下载文件时发现速度过快影响其他网络应用,或希望优化下载效率,可以通过…

    2026年10月5日 • 用户投稿
    200
  • 夸克浏览器网址入口 夸克浏览器最新网址入口

    夸克浏览器网址入口 夸克浏览器最新网址入口夸克浏览器网址入口 夸克浏览器最新网址入口夸克浏览器网址入口 夸克浏览器最新网址入口夸克浏览器网址入口 夸克浏览器最新网址入口

    夸克浏览器网址入口是https://www.quark.cn/,用户可通过该官网访问浏览器网页版,使用其集成的搜索、文件管理、个性化设置及智能推荐等功能,享受简洁流畅的浏览体验。 夸克浏览器网址入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来夸克浏览器最新网址入口,感兴趣的网友一起随小…

    2026年10月5日 • 用户投稿
    100
  • 如何用Java实现二维码生成 Java二维码创建方法和工具

    如何用Java实现二维码生成 Java二维码创建方法和工具如何用Java实现二维码生成 Java二维码创建方法和工具如何用Java实现二维码生成 Java二维码创建方法和工具如何用Java实现二维码生成 Java二维码创建方法和工具

    使用zxing库是java生成二维码的首选方案。具体步骤包括:1. 在maven项目中添加zxing的core和javase依赖;2. 使用multiformatwriter编码内容并生成bitmatrix;3. 通过matrixtoimagewriter将bitmatrix转为bufferedim…

    2026年10月5日 • 用户投稿
    200
  • 抖音视频ld号怎么获取?视频LD号和UID有什么区别?

    抖音视频ld号怎么获取?视频LD号和UID有什么区别?抖音视频ld号怎么获取?视频LD号和UID有什么区别?抖音视频ld号怎么获取?视频LD号和UID有什么区别?抖音视频ld号怎么获取?视频LD号和UID有什么区别?

    抖音视频的LD号是每条视频独有的身份标识,掌握其获取方式对分享、追踪或分析视频内容非常有帮助。无论你是普通用户还是内容运营者,了解这些技巧都能提升使用效率。 一、如何获取抖音视频的LD号? 获取LD号的方法多样,以下几种方式简单易操作,适合不同使用场景: 通过分享链接提取 打开抖音App,进入你想获…

    2026年10月5日 • 用户投稿
    300
  • PHP动态控制HTML背景色的正确方法:避免重复的标签

    <img src="https://img.php.cn/upload/article/001/246/273/175963200728795.jpg" alt="PHP动态控制HTML背景色的正确方法:避免重复的标签”>标签” /&…

    用户投稿 2026年10月5日
    100
  • Java大数据处理 Java并行流与ForkJoin框架应用

    Java大数据处理 Java并行流与ForkJoin框架应用Java大数据处理 Java并行流与ForkJoin框架应用Java大数据处理 Java并行流与ForkJoin框架应用Java大数据处理 Java并行流与ForkJoin框架应用

    java处理大数据时,应优先使用并行流和forkjoin框架提升性能。1. 并行流适用于大型集合的过滤、映射、归约等操作,通过调用.parallel()方法自动并行执行任务,简化多线程编程。2. forkjoin框架适合自定义分治逻辑,通过recursivetask或recursiveaction实…

    2026年10月5日 • 用户投稿
    100
  • 《爱氏物语》:在手绘像素的柔光中,抵达人性与AI交汇的边界

    《爱氏物语》:在手绘像素的柔光中,抵达人性与AI交汇的边界《爱氏物语》:在手绘像素的柔光中,抵达人性与AI交汇的边界《爱氏物语》:在手绘像素的柔光中,抵达人性与AI交汇的边界《爱氏物语》:在手绘像素的柔光中,抵达人性与AI交汇的边界

    由马来西亚华人独立开发者 mas 打造的像素风格剧情向 rpg 作品《爱氏物语》(artis impact),于 2025 年 8 月 7 日正式登陆 steam 平台。这款基于 rpg maker mv 引擎制作的游戏,在预告阶段便以细腻的手绘美术与动人的叙事风格吸引了大量关注。而随着完整版上线,…

    2026年10月5日 • 用户投稿
    100
  • 新版Edge浏览器可以安装于win7系统

    新版Edge浏览器可以安装于win7系统新版Edge浏览器可以安装于win7系统新版Edge浏览器可以安装于win7系统新版Edge浏览器可以安装于win7系统

    昨天,%ignore_a_1%正式为windows 10推送了基于chromium内核的全新edge浏览器,目前该浏览器提供了dev(每周更新)和canary(每日更新)两个版本供用户选择。微软还透露,他们正在研发适用于windows 7/8.1以及macos的版本。不过,据外媒测试发现,这款新浏览…

    2026年10月5日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信