安卓程序作为web服务端的技术实现:AndServer 实现登录权限拦截

ops/2025/1/23 13:25:09/

AndServer官方地址:入门 · GitBook

1.在安卓项目的两个build.grade中添加相关依赖:

2.目录结构:

以我写的顺序去进行理解:

首先创建一个server的管理类:进行初始化,启动,停止操作等


import android.content.Context;
import android.util.Log;import com.yanzhenjie.andserver.AndServer;
import com.yanzhenjie.andserver.Server;import java.util.concurrent.TimeUnit;
public class ServerManager {private Server mServer;private static ServerManager instance;private ServerManager(Context context) {mServer = AndServer.webServer(context).port(8080).timeout(10, TimeUnit.SECONDS).listener(new Server.ServerListener() {@Overridepublic void onStarted() {// TODO The server started successfully.}@Overridepublic void onStopped() {// TODO The server has stopped.}@Overridepublic void onException(Exception e) {// TODO An exception occurred while the server was starting.}}).build();}public static ServerManager getInstance(Context context) {if (instance == null) {instance = new ServerManager(context);}return instance;}public void startServer() {if (mServer.isRunning()) {// TODO The server is already up.} else {mServer.startup();}}public void stopServer() {if (mServer.isRunning()) {mServer.shutdown();} else {Log.w("AndServer", "The server has not started yet.");}}
}

在mainactivity中增加启动代码:

其实这个时候运行到真机或者模拟机上时就已经启动了,为了方便测试,增加几个测试接口:

 

@RestController
@RequestMapping(path = "/api")
public class TestController {@GetMapping("/user/get")public String test(@RequestParam("id") String id) {return "id = " + id;}
}

通过浏览器访问安卓设备的IP:8080/api/user/get?id=1会看到浏览器出现id=1的字样

配置web网站的目录:

@Config
public class AppConfig implements WebConfig {@Overridepublic void onConfig(Context context, Delegate delegate) {// 增加一个位于assets的web目录的网站delegate.addWebsite(new AssetsWebsite(context, "/web/"));}
}

这样网页就被映射到assets下的web目录中:

可以通过page去测试:

@Controller
public class PageController {@GetMapping("/")public String index() {return "forward:/index.html";}@GetMapping("/page")public String page() {return "forward:/page.html";}
}

访问根目录:

访问page:

启动已经🆗那么也需要在activity销毁时进行服务的关闭操作:

这个时候已经完成了基本的流程的,那么如何进行登录状态的保存以及拦截呢?

因为一般在安卓终端设备中都是相对比较简单的项目,那么本次我采用的登录状态保存方式是session(当然你可以使用其他方式,原理类似)

编写一个拦截类:

@Interceptor
public class AuthInterceptor implements HandlerInterceptor {@Overridepublic boolean onIntercept(@NonNull HttpRequest request, @NonNull HttpResponse response, @NonNull RequestHandler handler) throws Exception {String path = request.getPath();Log.w("AuthInterceptor", "path = " + path);if (path.startsWith("/api/")) {Session session = request.getSession(); // 获取现有 Session,不创建新 Sessionif (session == null || session.getAttribute("user") == null) {response.setStatus(StatusCode.SC_UNAUTHORIZED);// 将字符串转换为字节数组String responseBodyString = "Unauthorized access. Please login first.";StringResponseBody responseBody = new StringResponseBody(responseBodyString);response.setBody(responseBody);return true; // 拦截请求}return false; // 放行请求}return false; // 放行请求}
}

这里只拦截了以api开头的url  需要登录状态去访问 

注意:返回false是不拦截  true是拦截

这里通过

@Interceptor

这种注释方式去进行拦截

StringResponseBody代码
public class StringResponseBody implements ResponseBody {private String content;public StringResponseBody(String content) {this.content = content;}@Overridepublic boolean isRepeatable() {return true; // Assuming it is repeatable}@Overridepublic boolean isChunked() {return false; // Not chunked}@Overridepublic long contentLength() {return content.length();}@Nullable@Overridepublic MediaType contentType() {return null;}@Overridepublic void writeTo(@NonNull OutputStream output) throws IOException {output.write(content.getBytes());}
}

访问:

结束  告辞


http://www.ppmy.cn/ops/152477.html

相关文章

MyBatis最佳实践:参数详解

第一章:MyBatis 参数详解 parameterType: 简单数据类型: int double String Long 简单的写法: Java.lang.Integer > int、Int、integer、Integer 都可以,框架提供简写的方式 POJO(JavaBean 实体类):对…

win暂停更新设置

暂停更新 Windows Registry Editor Version5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings] "FlightSettingsMaxPauseDays"dword:00001b58 "PauseFeatureUpdatesStartTime""2023-07-07T10:00:52Z" "PauseFeatureU…

【玩转全栈】----Django模板的继承

先赞后看,养成习惯!!! 目录 模板继承的好处 模板继承的语法规则 更新代码 上文中的部门管理页面: 【玩转全栈】----Django制作部门管理页面-CSDN博客 大家会发现,由于定义了多个html文件,多个ht…

EF Core 乐观、悲观并发控制

目录 并发控制的概念 悲观并发控制 实现 问题 乐观并发控制 实现 RowVersion 实体类及配置 概念 总结 并发控制的概念 并发控制:避免多个用户同时操作资源造成的并发冲突问题。举例:统计点击量。最好的解决方案:非数据库解决方案。…

IJCAI-2024 | 具身导航的花样Prompts!VLN-MP:利用多模态Prompts增强视觉语言导航能力

作者: Haodong Hong1,2 , Sen Wang1∗ , Zi Huang1 , Qi Wu3 and Jiajun Liu2,1 单位:昆士兰大学,澳大利亚科学与工业研究组织,阿德莱德大学 论文标题:Why Only Text: Empowering Vision-and-Language Navigation wi…

maven常见知识点

1、maven是什么? maven是Java的包管理工具,因为java包太多了,使用工具统一管理。 2、引入同一个包时使用哪个? 会遵循 路径最短优先 和 声明顺序优先 两大原则。解决这个问题的过程也被称为 Maven 依赖调解。 3、什么是 POM&…

Netty搭建websocket服务器,postman可以连接,浏览器无法连接

简介:Netty搭建websocket服务器,postman可以连接,浏览器无法连接,很奇怪,不知道为什么。最后更换端口解决问题,原来端口时6666,把6666改成其他端口就可以了。 过程: 前端代码 后端…

MySQL——主从同步

提醒:进行配置时,需要确保一主两从的操作系统、MySQL版本一致,否则将出现问题 环境介绍 服务器IP主服务器172.25.254.10从服务器-1172.25.254.11从服务器-2172.25.254.12 配置 # 快速配置,选择多重执行,确保版本一…