Android 27+ 限制App所有未加密的http连接

官方说法:

Android致力于保护用户们的设备和数据安全。我们保证数据安全的方法之一是保护所有进入或离开Android设备的数据在传输中使用传输层安全性(TLS)。正如我们在Android P开发人员预览中所宣布的那样,我们通过阻止针对Android P的应用程序默认允许未加密的连接来进一步改进这些保护。这是我们多年来为更好地保护Android用户而做出的各种更改。为了防止意外的未加密连接,我们android:usesCleartextTraffic在Android Marshmallow中引入了manifest属性。在Android Nougat中,我们通过创建Network Security Config功能扩展了该属性,该功能允许应用程序指示他们不打算在没有加密的情况下发送网络流量。在Android Nougat和Oreo中,我们仍然允许明文连接。

所以,后续我们在新建Android项目或者升级Android项目 API版本(targetSdkVersion),当选择27或者27以上时候,就会出现http请求失效的情况

解决方法

1、配置允许明文通信域

res/xml/network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <trust-anchors>
            <certificates src="@raw/my_ca"/>
        </trust-anchors>
        <domain-config cleartextTrafficPermitted="false">
            <domain includeSubdomains="true">secure.example.com</domain>
        </domain-config>
    </domain-config>
</network-security-config>

2、或者直接在manifest文件里开启明文网络支持(最简单方法)

<application
    ...
    android:usesCleartextTraffic="true"
android:usesCleartextTraffic 作用:

Indicates whether the app intends to use cleartext network traffic, such as cleartext HTTP

<think>好的,我现在需要帮助用户了解如何使用Android Studio、Spring Boot和MySQL开发一个医疗挂号应用程序。首先,用户的问题涉及三个主要技术栈:Android前端、Spring Boot后端和MySQL数据库。我需要分步骤解释整个开发流程,并提供示例代码。同时,用户要求结构清晰,确保回答真实可靠,并引用提供的参考资料。 首先,我需要确定用户可能需要的功能模块。医疗挂号应用通常包括用户注册登录、科室医生查询、预约挂号、订单管理等功能。因此,后端需要设计相应的RESTful API,前端Android应用调用这些API,数据库则存储相关数据。 接下来,我需要参考用户提供的引用内容。引用[1]提到RBAC权限管理系统,可能在后端的用户权限管理部分有用。引用[3]提到了图片加载库如Glide,可能在Android端显示医生头像时使用。不过用户的问题中没有提到图片处理,但可能需要考虑扩展功能。 首先,后端部分使用Spring Boot搭建。需要创建实体类,如User、Department、Doctor、Appointment。使用JPA进行数据库操作,这样可以简化MySQL的交互。然后创建Controller处理HTTP请求,比如注册、登录、获取科室列表、预约等功能。需要确保接口符合RESTful规范,返回JSON数据。 数据库设计方面,用户表存储用户信息,科室表、医生表关联科室,预约表记录用户和医生的预约信息。可能需要外键关联,比如appointment表中的user_id和doctor_id关联到user和doctor表。 Android端需要实现界面,比如登录注册界面、科室列表、医生列表、预约界面等。使用Retrofit或OkHttp进行网络请求,调用后端的API。例如,用户登录时发送POST请求到/auth/login,获取token后保存到SharedPreferences中,后续请求携带token进行鉴权。 在代码示例部分,后端可以提供一个DoctorController,处理获取科室列表的GET请求。Android使用RecyclerView展示科室列表,通过Retrofit调用接口获取数据。需要处理异步请求,更新UI。 需要考虑的安全性问题,比如使用HTTPS传输数据,用户密码加密存储(Spring Security的密码编码),JWT token进行身份验证。引用[1]中的RBAC可能用于管理不同用户角色,比如患者、医生、管理员,但用户的问题可能暂时只需要患者角色,所以可以后续扩展。 可能遇到的问题包括数据库连接配置、API跨域处理、Android端网络权限和主线程网络请求限制(需要使用异步任务或协程)。此外,预约时间的冲突处理,比如同一用户不能重复预约同一时间段。 在教程步骤中,需要分步指导:环境搭建(安装Android Studio、IntelliJ IDEA、MySQL)、创建Spring Boot项目、配置数据库连接、定义实体和Repository、创建Controller、测试API。然后创建Android项目,设计界面,实现网络请求,处理数据展示和用户交互。 示例代码部分,后端可能需要User实体和Repository,AuthController处理登录注册。Android端需要有LoginActivity,发送登录请求,处理响应,跳转到主界面。主界面显示科室列表,点击进入医生列表,选择医生后进入预约界面,提交预约。 需要确保代码符合最佳实践,比如Android的MVP或MVVM架构,后端的分层结构(Controller-Service-Repository)。引用[2]提到Java开发手册,可能涉及代码规范,如命名约定、异常处理等。 最后,生成相关问题,可能涉及性能优化、第三方库使用(如Glide加载图片)、安全加固、部署流程等。需要根据用户提供的引用和常见问题来设计。 总结:步骤分为后端开发、数据库设计、前端开发,每部分提供关键代码示例,引用相关资料,确保用户能够跟随教程搭建基础框架,并了解扩展方向。</think>### 医疗挂号APP开发教程(Android + Spring Boot + MySQL) #### 一、系统架构设计 采用**前后端分离架构**,Android端负责UI交互,Spring Boot提供RESTful API,MySQL存储数据。权限控制采用RBAC模型[^1]。 #### 二、后端开发(Spring Boot) 1. **数据库设计** 创建`hospital`数据库,包含核心表: ```sql CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) UNIQUE, password VARCHAR(100) -- Spring Security BCrypt加密存储 ); CREATE TABLE department ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) -- 科室名称(内科/外科) ); CREATE TABLE doctor ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), department_id INT, -- 外键关联科室 FOREIGN KEY (department_id) REFERENCES department(id) ); CREATE TABLE appointment ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, doctor_id INT, appointment_time DATETIME ); ``` 2. **Spring Boot实体类定义** ```java @Entity public class Doctor { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToOne @JoinColumn(name = "department_id") private Department department; } ``` 3. **RESTful API接口示例** ```java @RestController @RequestMapping("/api/doctors") public class DoctorController { @Autowired private DoctorRepository doctorRepository; @GetMapping("/byDepartment") public List<Doctor> getByDepartment(@RequestParam Long departmentId) { return doctorRepository.findByDepartmentId(departmentId); } } ``` #### 三、Android端开发 1. **网络请求配置(Retrofit)** ```kotlin interface ApiService { @GET("api/doctors/byDepartment") suspend fun getDoctorsByDepartment(@Query("departmentId") departmentId: Long): Response<List<DoctorDTO>> } val retrofit = Retrofit.Builder() .baseUrl("http://your-server-ip:8080/") .addConverterFactory(GsonConverterFactory.create()) .build() ``` 2. **科室列表展示(RecyclerView)** ```xml <androidx.recyclerview.widget.RecyclerView android:id="@+id/rvDepartments" android:layout_width="match_parent" android:layout_height="match_parent" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/> ``` #### 四、关键功能实现 1. **用户认证** 使用JWT实现安全认证: ```java // Spring Security配置 @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/auth/**").permitAll() .anyRequest().authenticated() .and() .addFilter(new JwtAuthenticationFilter(authenticationManager())); } ``` 2. **预约冲突检测** SQL查询优化: ```sql SELECT COUNT(*) FROM appointment WHERE doctor_id = ? AND appointment_time BETWEEN ? AND ? ``` #### 五、部署与优化建议 1. 使用Nginx反向代理Spring Boot应用 2. 启用MySQL查询缓存 3. Android端图片加载推荐使用Glide库[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值