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

安卓处理登录权限问题

在安卓应用中实现登录权限控制,需确保用户登录后才能访问特定功能。以下是分步骤的解决方案:

1. 保存和检查登录状态

使用安全存储保存登录凭证:
推荐使用 EncryptedSharedPreferences 存储敏感信息(如Token、用户ID),确保数据安全。

// 初始化 EncryptedSharedPreferences
String masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC);
SharedPreferences sharedPreferences = EncryptedSharedPreferences.create("secret_shared_prefs",masterKeyAlias,context,EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
);// 保存登录状态
sharedPreferences.edit().putString("user_token", token).apply();// 检查登录状态
public boolean isUserLoggedIn() {return sharedPreferences.contains("user_token");
}

2. 控制Activity跳转

创建基类 BaseActivity:
所有需要登录的Activity继承此基类,自动检查登录状态。

public abstract class BaseActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (!isUserLoggedIn()) {redirectToLogin();}}private boolean isUserLoggedIn() {// 检查存储中的登录状态SharedPreferences prefs = getEncryptedSharedPreferences();return prefs.contains("user_token");}private void redirectToLogin() {Intent intent = new Intent(this, LoginActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);startActivity(intent);finish();}
}

登录成功后跳转并清除返回栈:
登录成功后,跳转至主界面并清除登录界面。

// 在LoginActivity中
private void onLoginSuccess() {Intent intent = new Intent(this, MainActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);finish();
}

3. 处理网络请求中的Token过期

使用OkHttp拦截器全局处理401错误:
拦截网络响应,Token过期时跳转至登录界面。

public class TokenInterceptor implements Interceptor {private Context context;public TokenInterceptor(Context context) {this.context = context.getApplicationContext();}@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();Response response = chain.proceed(request);if (response.code() == 401) {handleTokenExpired();}return response;}private void handleTokenExpired() {new Handler(Looper.getMainLooper()).post(() -> {// 清除用户信息clearUserData();// 跳转登录Intent intent = new Intent(context, LoginActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);context.startActivity(intent);});}private void clearUserData() {SharedPreferences.Editor editor = getEncryptedSharedPreferences().edit();editor.remove("user_token");editor.apply();}
}

配置OkHttpClient:
在Retrofit或OkHttpClient中添加拦截器。

OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new TokenInterceptor(context)).build();

4. 用户主动退出登录

清除数据并跳转至登录界面:
退出时清除所有用户数据并重置返回栈。

public void logout() {clearUserData();Intent intent = new Intent(this, LoginActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);startActivity(intent);finish();
}

5. 处理深层链接或通知

确保所有入口检查登录状态:
通过BaseActivity的检查机制,任何需要登录的Activity都会自动验证用户状态。

6. 优化用户体验

避免重复跳转:
设置LoginActivity的launchMode为singleTop,避免同一Activity多次实例化。

<activityandroid:name=".LoginActivity"android:launchMode="singleTop" />

7. 使用Session管理(可选)

单例管理登录状态:
通过SessionManager统一管理状态,便于全局访问和监听。

public class SessionManager {private static SessionManager instance;private final SharedPreferences sharedPreferences;public static synchronized SessionManager getInstance(Context context) {if (instance == null) {instance = new SessionManager(context);}return instance;}private SessionManager(Context context) {sharedPreferences = context.getSharedPreferences("user_session", Context.MODE_PRIVATE);}public void saveUserToken(String token) {sharedPreferences.edit().putString("user_token", token).apply();}public boolean isLoggedIn() {return sharedPreferences.contains("user_token");}public void logout() {sharedPreferences.edit().clear().apply();}
}

总结

通过上述步骤,可以实现以下效果:

自动登录检查:所有需要权限的Activity继承BaseActivity,在创建时自动验证登录状态。

安全存储:使用加密存储保护用户凭证。

Token过期处理:网络层自动拦截401错误,全局跳转登录。

返回栈管理:登录成功后清除历史栈,避免用户返回登录页。

退出登录处理:彻底清除用户数据并重置导航栈。

此方案兼顾安全性与用户体验,确保权限控制严密且流程顺畅。

相关文章:

安卓处理登录权限问题

在安卓应用中实现登录权限控制&#xff0c;需确保用户登录后才能访问特定功能。以下是分步骤的解决方案&#xff1a; 1. 保存和检查登录状态 使用安全存储保存登录凭证&#xff1a; 推荐使用 EncryptedSharedPreferences 存储敏感信息&#xff08;如Token、用户ID&#xff09…...

Java写数据结构:栈

1.概念&#xff1a; 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&#xff1a;栈的插…...

使用Unity Cache Server提高效率

2021年1月20日19:04:28 1 简介 Unity Cache Server,翻译过来就是Unity缓存服务器 1.1 缓存服务器の官方介绍 Unity 有一个完全自动的资源管线。每当修改 .psd 或 .fbx 文件等源资源时,Unity 都会检测到更改并自动将其重新导入。随后,Unity 以内部格式存储从文件导入的数…...

29个常见的Terraform 面试问题

问题 1&#xff1a;假设您使用 Terraform 创建了一个 EC2 实例&#xff0c;创建完成后&#xff0c;您从状态文件中删除了该条目&#xff0c;那么运行 Terraform Apply 命令时会发生什么&#xff1f; 由于我们已从该状态文件中删除了该条目&#xff0c;因此 Terraform 将不再管…...

机器学习-08-推荐算法-案例

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中关联规则 参考 机器学习&#xff08;三&#xff09;&#xff1a;Apriori算法&#xff08;算法精讲&#xff09; Apriori 算法 理论 重点 MovieLens:一个常用的电影推荐系统领域的数据集 23张图&#x…...

LLM中的N-Gram、TF-IDF和Word embedding

文章目录 1. N-Gram和TF-IDF&#xff1a;通俗易懂的解析1.1 N-Gram&#xff1a;让AI学会"猜词"的技术1.1.1 基本概念1.1.2 工作原理1.1.3 常见类型1.1.4 应用场景1.1.5 优缺点 1.2 TF-IDF&#xff1a;衡量词语重要性的尺子1.2.1 基本概念1.2.2 计算公式1.2.3 为什么需…...

uniapp APP端 DOM生成图片保存到相册

<template> <view class"container" style"padding-bottom: 30rpx;"> <view class"hdbg pr w100 " style"height: 150rpx;"> <top-bar content分享 Back"Back"></top-b…...

Office文件内容提取 | 获取Word文件内容 |Javascript提取PDF文字内容 |PPT文档文字内容提取

关于Office系列文件文字内容的提取 本文主要通过接口的方式获取Office文件和PDF、OFD文件的文字内容。适用于需要获取Word、OFD、PDF、PPT等文件内容的提取实现。例如在线文字统计以及论文文字内容的提取。 一、提取Word及WPS文档的文字内容。 支持以下文件格式&#xff1a; …...

算法——背包问题(分类)

背包问题&#xff08;Knapsack Problem&#xff09;是一类经典的组合优化问题&#xff0c;广泛应用于资源分配、投资决策、货物装载等领域。根据约束条件和问题设定的不同&#xff0c;背包问题主要分为以下几种类型&#xff1a; 1. 0-1 背包问题&#xff08;0-1 Knapsack Probl…...

HXBC编译相关错误

0、Keil MDK报错:Browse information of one or more files is not available----解决方法: 1、使用cubemax生成的工程中,某些引脚自定义了的,是在main.h中,要记得移植。 注意:cubemax生成的spi.c后,在移植的时候,注意hal_driver下面要对应增加hal_stm32H7xxxspi.c …...

Windows 环境下 Apache 配置 WebSocket 支持

目录 前言1. 基本知识2. 实战前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 原先写过apache的http配置:Apache httpd-vhosts.conf 配置详解(附Demo) 1. 基本知识 🔁 WebSocket 是 HTTP 的升级协议 客户…...

运维概述(linux 系统)

1、运维的基本概念 2、企业的运行模式 3、计算机硬件 运维概述 运维岗位的定义 在技术人员&#xff08;写代码的&#xff09;之间&#xff0c;一致对运维有一个开玩笑的认知&#xff1a;运维就是修电脑的、装网线的、背锅的岗位。 IT运维管理是指为了保障企业IT系统及网络…...

C语言 数据结构 【堆】动态模拟实现,堆排序,TOP-K问题

引言 堆的各个接口的实现&#xff08;以代码注释为主&#xff09;&#xff0c;实现堆排序&#xff0c;解决经典问题&#xff1a;TOP-K问题 一、堆的概念与结构 堆 具有以下性质 • 堆中某个结点的值总是不大于或不小于其父结点的值&#xff1b; • 堆总是一棵完全二叉树。 二…...

MFC文件-写MP4

下载本文件 本文件将创作MP4视频文件代码整合到两个文件中&#xff08;Mp4Writer.h和Mp4Writer.cpp)&#xff0c;将IYUV视频流编码为H264&#xff0c;PCM音频流编码为AAC&#xff0c;写入MP4文件。本文件仅适用于MFC程序。 使用方法 1.创建MFC项目。 2.将Mp4Writer.h和Mp4Wri…...

8.观察者模式:思考与解读

原文地址:观察者模式&#xff1a;思考与解读 更多内容请关注&#xff1a;7.深入思考与解读设计模式 引言 在开发软件时&#xff0c;系统的某些状态可能会发生变化&#xff0c;而你希望这些变化能够自动通知到依赖它们的其他模块。你是否曾经遇到过&#xff0c;系统中某个对象…...

CMake execute_process用法详解

execute_process 是 CMake 中的一个命令&#xff0c;用于在 CMake 配置阶段&#xff08;即运行 cmake 命令时&#xff09;执行外部进程。它与 add_custom_command 或 add_custom_target 不同&#xff0c;后者是在构建阶段&#xff08;如 make 或 ninja&#xff09;执行命令。ex…...

模型加载常见问题

safetensors_rust.SafetensorError: Error while deserializing header: HeaderTooLarge 问题代码&#xff1a; model AutoModelForVision2Seq.from_pretrained( "/data-nvme/yang/Qwen2.5-VL-32B-Instruct", trust_remote_codeTrue, torch_dtypetorc…...

PyTorch 深度学习实战(37):分布式训练(DP/DDP/Deepspeed)实战

在上一篇文章中&#xff0c;我们探讨了混合精度训练与梯度缩放技术。本文将深入介绍分布式训练的三种主流方法&#xff1a;Data Parallel (DP)、Distributed Data Parallel (DDP) 和 DeepSpeed&#xff0c;帮助您掌握大规模模型训练的关键技术。我们将使用PyTorch在CIFAR-10分类…...

微信小程序通过mqtt控制esp32

目录 1.注册巴法云 2.设备连接mqtt 3.微信小程序 备注 本文esp32用的是MicroPython固件&#xff0c;MQTT服务用的是巴法云。 本文参考巴法云官方教程&#xff1a;https://bemfa.blog.csdn.net/article/details/115282152 1.注册巴法云 注册登陆并新建一个topic&#xff…...

1.Vue3 - 创建Vue3工程

目录 一、 基于vue-cli 脚手架二、基于vite 推荐2.1 介绍2.2 创建项目2.3 文件介绍2.3.1 extensions.json2.3.2 脚手架的根目录2.3.3 主要文件 src2.3.3.1 main.js2.3.3.2 App.vue 组件2.3.3.3 conponents 2.3.4 env.d.ts2.3.5 index.html 入口文件2.3.6 package2.3.7 tsconfig…...

AI编写的“黑科技风格、自动刷新”的看板页面

以下的 index.html 、 script.js 和 styles.css 文件&#xff0c;实现一个具有黑科技风格、自动刷新的能源管理系统实时监控看板。 html页面 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name&q…...

11-DevOps-Jenkins Pipeline流水线作业

前面已经完成了&#xff0c;通过在Jenkins中创建自由风格的工程&#xff0c;在界面上的配置&#xff0c;完成了发布、构建的过程。 这种方式的缺点就是如果要在另一台机器上进行同样的配置&#xff0c;需要一项一项去填写&#xff0c;不方便迁移&#xff0c;操作比较麻烦。 解…...

23种设计模式-结构型模式之外观模式(Java版本)

Java 外观模式&#xff08;Facade Pattern&#xff09;详解 &#x1f9ed; 什么是外观模式&#xff1f; 外观模式是结构型设计模式之一&#xff0c;为子系统中的一组接口提供一个统一的高层接口&#xff0c;使得子系统更易使用。 就像是酒店前台&#xff0c;帮你处理入住、叫…...

【JavaWeb后端开发03】MySQL入门

文章目录 1. 前言1.1 引言1.2 相关概念 2. MySQL概述2.1 安装2.2 连接2.2.1 介绍2.2.2 企业使用方式(了解) 2.3 数据模型2.3.1 **关系型数据库&#xff08;RDBMS&#xff09;**2.3.2 数据模型 3. SQL语句3.1 DDL语句3.1.1 数据库操作3.1.1.1 查询数据库3.1.1.2 创建数据库3.1.1…...

Github 热点项目 Jumpserver开源堡垒机让服务器管理效率翻倍

Jumpserver今日喜提160星&#xff0c;总星飙至2.6万&#xff01;这个开源堡垒机有三大亮点&#xff1a;① 像哆啦A梦的口袋&#xff0c;支持多云服务器一站式管理&#xff1b;② 安全审计功能超硬核&#xff0c;操作记录随时可回放&#xff1b;③ 网页终端无需装插件&#xff0…...

第七届传智杯全国IT技能大赛程序设计赛道 国赛(总决赛)—— (B组)题解

1.小苯的木棍切割 【解析】首先我们先对数列排序&#xff0c;找到其中最小的数&#xff0c;那么我们就保证了对于任意一个第i1个的值都会大于第i个的值那么第i2个的值也比第i个大&#xff0c;那么我们第i1次切木棍的时候一定会当第i个的值就变为了0的&#xff0c;第i1减去的应该…...

Netty前置基础知识之BIO、NIO以及AIO理论详细解析和实战案例

前言 Netty是什么&#xff1f; Netty 是一个基于 Java 的 ​高性能异步事件驱动网络应用框架&#xff0c;主要用于快速开发可维护的协议服务器和客户端。它简化了网络编程的复杂性&#xff0c;特别适合构建需要处理海量并发连接、低延迟和高吞吐量的分布式系统。 1)Netty 是…...

开源身份和访问管理(IAM)解决方案:Keycloak

一、Keycloak介绍 1、什么是 Keycloak&#xff1f; Keycloak 是一个开源的身份和访问管理&#xff08;Identity and Access Management - IAM&#xff09;解决方案。它旨在为现代应用程序和服务提供安全保障&#xff0c;简化身份验证和授权过程。Keycloak 提供了集中式的用户…...

深入理解 TCP 协议 | 流量、拥塞及错误控制机制

注&#xff1a;本文为 “TCP 协议” 相关文章合辑。 原文为繁体&#xff0c;注意术语描述差异。 略作重排&#xff0c;如有内容异常&#xff0c;请看原文。 作者在不同的文章中互相引用其不同文章&#xff0c;一并汇总于此。 可从本文右侧目录直达本文主题相关的部分&#xff…...

VSCode远程图形化GDB

VSCode远程图形化GDB 摘要一、安装VSCode1、使用.exe安装包安装VSCode2、VSCode 插件安装3、VSCode建立远程连接 二、core dump找bug1、开启core文件2、永久生效的方法3、编写测试程序4、运行结果5、查看core段错误位置6、在程序中开启core dump并二者core文件大小 三、gdbserv…...