(2)AlterPSWActivity.java
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.text.method.PasswordTransformationMethod;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.example.administrator.loginclient.ActivityCollectors.ActivityCollector;
import com.example.administrator.loginclient.HttpsUtils.HTTPSTrustManager;
import com.example.administrator.loginclient.R;
import com.example.administrator.loginclient.RsaUtils.GenKeyFromString;
import com.example.administrator.loginclient.RsaUtils.MyConstant;
import com.example.administrator.loginclient.RsaUtils.RSAUtil;
import org.bouncycastle.util.encoders.Base64;
import org.json.JSONException;
import org.json.JSONObject;
import java.security.interfaces.RSAPublicKey;
import java.util.HashMap;
import java.util.Map;
/**
- 修改密码
*/
public class AlterPSWActivity extends BaseActivity implements View.OnClickListener {
private EditText et_now,et_new,et_new2;
private EditText et_email;
private Button btn_update;
private Button btn_forget;
public static RequestQueue queue;
private static Context mContext;
@Override
protected void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_alter_psw);
queue = Volley.newRequestQueue(getApplicationContext());
mContext = this;
initView();//初始化UI
}
/**
- 初始化UI
*/
private void initView() {
et_now=(EditText)findViewById(R.id.et_now);
et_new=(EditText)findViewById(R.id.et_new);
et_new2=(EditText)findViewById(R.id.et_new_password);
et_now.setTransformationMethod(PasswordTransformationMethod.getInstance());//密码不可见
et_new.setTransformationMethod(PasswordTransformationMethod.getInstance());//密码不可见
et_new2.setTransformationMethod(PasswordTransformationMethod.getInstance());//密码不可见
et_email=(EditText)findViewById(R.id.et_email);
btn_forget=(Button)findViewById(R.id.update_forget_psw);
btn_update=(Button)findViewById(R.id.btn_update_password);
btn_update.setOnClickListener(this);
btn_forget.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_update_password:
//重置密码
String now=et_now.getText().toString().trim();
String pass1=et_new.getText().toString().trim();
String pass2=et_new2.getText().toString().trim();
final String psw_old = et_now.getText().toString().trim();
final String psw_new = et_new.getText().toString().trim();
final String email=et_email.getText().toString().trim();
// 获取Rsa 工具类对象
RSAUtil rsa = new RSAUtil();
// 获取公钥
RSAPublicKey pubKey = (RSAPublicKey) GenKeyFromString
.getPubKey(MyConstant.pubKey1);
// 使用公钥加密 数据
byte[] enRsaByte_psw_old = new byte[0];
byte[] enRsaBytes_psw_new = new byte[0];
byte[] enRsaBytes_psw_email = new byte[0];
try {
enRsaByte_psw_old = rsa.encrypt(pubKey, psw_old.getBytes());//旧密码加密
enRsaBytes_psw_new = rsa.encrypt(pubKey, psw_new.getBytes());//新密码加密
enRsaBytes_psw_email=rsa.encrypt(pubKey,email.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
/**
- base64对byte数组进行编码,进过编码后得到String传输到对服务端解码得出byte数组。
*/
String enRsaStr_psw_old = new String(Base64.encode(enRsaByte_psw_old));//旧密码byte数组转成字符串
String enRsaStr_psw_new = new String(Base64.encode(enRsaBytes_psw_new));//新密码byte数组转成字符串
String enRsaStr_psw_email=new String(Base64.encode(enRsaBytes_psw_email));//邮箱byte数组转成字符串
if(!TextUtils.isEmpty(now)&&!TextUtils.isEmpty(pass1)&&!TextUtils.isEmpty(pass2)){
//和原始密码一致
if(pass1.equals(now)||pass2.equals(now)){
Toast.makeText(AlterPSWActivity.this, “新旧密码不能一样,请再想个新密码!”, Toast.LENGTH_SHORT).show();
}else if(pass1.equals(pass2)){
Toast.makeText(AlterPSWActivity.this, “密码校验成功”, Toast.LENGTH_SHORT).show();
//此处做修改密码操作
UpdatePSWRequest(enRsaStr_psw_old,enRsaStr_psw_new,enRsaStr_psw_email);
}else{
Toast.makeText(AlterPSWActivity.this, “两次密码输入不一致!”, Toast.LENGTH_SHORT).show();
}
}else{
Toast.makeText(AlterPSWActivity.this, “输入框不能为空!”, Toast.LENGTH_SHORT).show();
}
break;
case R.id.update_forget_psw:
Intent intent = new Intent(AlterPSWActivity.this,ForgetPswActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//关掉所要到的界面中间的activity
AlterPSWActivity.this.startActivity(intent);
// ActivityCollector.finishAll();//关掉之前的所有活动
break;
}
}
public static void UpdatePSWRequest(final String password,final String updatePassword,final String email){
//请求地址
String url = “http://localhost:8083/MyFirstWebAPP/UpdatePasswordServlet”; //注①
String tag = “Alter”; //注②
//取得请求队列
RequestQueue requestQueue = queue;
//防止重复请求,所以先取消tag标识的请求队列
requestQueue.cancelAll(tag);
HTTPSTrustManager.allowAllSSL();//允许所有https请求
//创建StringRequest,定义字符串请求的请求方式为POST(省略第一个参数会默认为GET方式)
final StringRequest request = new StringRequest(Request.Method.POST, url,
new Response.Listener() {
@Override
public void onResponse(String response) {
try {
JSONObject jsonObject = (JSONObject) new JSONObject(response).get(“params”); //注③
String result = jsonObject.getString(“Result”); //注④
if (result.equals(“UpdateSuccess”)) { //注⑤
Toast.makeText(mContext, “修改密码成功,请重新登录!”, Toast.LENGTH_LONG).show();
Intent intent = new Intent(mContext,MainActivity.class);
//intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//关掉所要到的界面中间的activity
mContext.startActivity(intent);
ActivityCollector.finishAll();//关掉之前的所有活动
}
else if (result.equals(“TheOldPasswordIsError”)){
//做自己的登录失败操作,如Toast提示
Toast.makeText(mContext, “原始密码错误”, Toast.LENGTH_LONG).show();
} else if (result.equals(“TheEmailIsError”)){
//做自己的登录失败操作,如Toast提示
Toast.makeText(mContext, “邮箱不存在”, Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
//做自己的请求异常操作,如Toast提示(“无网络连接”等)
Log.e(“TAG”, e.getMessage(), e);
Toast.makeText(mContext, “无网络连接”, Toast.LENGTH_LONG).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//做自己的响应错误操作,如Toast提示(“请稍后重试”等)
Log.e(“TAG”, error.getMessage(), error);
Toast.makeText(mContext, “请稍后重试”, Toast.LENGTH_LONG).show();
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put(“Password”, password);
params.put(“UpdatePassword”, updatePassword);
params.put(“Email”, email);
return params;
}
};
//设置Tag标签
request.setTag(tag);
//将请求添加到队列中
requestQueue.add(request);
}
}
(3)用到的依赖:
implementation fileTree(include: [‘*.jar’], dir: ‘libs’)
implementation ‘androidx.core:core:1.3.0’
implementation ‘androidx.constraintlayout:constraintlayout:1.1.3’
testImplementation ‘junit:junit:4.12’
implementation ‘androidx.appcompat:appcompat:1.1.0’
implementation ‘com.android.volley:volley:1.1.1’
implementation files(‘libs/sun.misc.BASE64Decoder.jar’)
implementation files(‘libs/bcprov-jdk15-1.45.jar’)
//noinspection GradleDeprecated
implementation ‘com.google.android.gms:play-services-appindexing:9.8.0’
androidTestImplementation(‘androidx.test.espresso:espresso-core:3.1.0’, {
exclude group: ‘com.android.support’, module: ‘support-annotations’
})
implementation ‘com.google.android.material:material:1.3.0-alpha01’
外部包自行下载添加依赖,提取码:jd3v
============================================================================
(1)web.xml增加
UpdatePasswordServlet
net.jw.MyFirstWebAPP.ServletPackage.UpdatePasswordServlet
UpdatePasswordServlet
/UpdatePasswordServlet
(2)UpdatePasswordServlet.java(servlet)
import java.io.IOException;
import java.io.PrintWriter;
import java.security.interfaces.RSAPrivateKey;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.jw.MyFirstWebAPP.RSAutil.GenKeyFromString;
import net.jw.MyFirstWebAPP.RSAutil.MyConstant;
import net.jw.MyFirstWebAPP.RSAutil.RSAUtil;
import net.jw.MyFirstWebAPP.User;
import net.jw.MyFirstWebAPP.UserDAO;
import net.sf.json.JSONObject;
import org.bouncycastle.util.encoders.Base64;
/**
*更新密码
- @author Administrator
*/
public class UpdatePasswordServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应内容类型
response.setContentType(“text/html;charset=utf-8”);
request.setCharacterEncoding(“utf-8”);
response.setCharacterEncoding(“utf-8”);
try (PrintWriter out = response.getWriter()) {
//获得请求中传来的旧密码、新密码
String Old_Password = request.getParameter(“Password”).trim();
String password = request.getParameter(“UpdatePassword”).trim();
String email = request.getParameter(“Email”).trim();
//密码验证结果
byte[] byterepsw_old = Base64.decode(Old_Password);//旧密码解密BASE64
byte[] byterepsw = Base64.decode(password);//密码解密BASE64
byte[] bytere_email = Base64.decode(email);//密码解密BASE64
// System.out.println(byteres);
// System.out.println(“字符串转成byte数组:”+new String(byteres));
// 获取私钥
RSAUtil rsa = new RSAUtil();
RSAPrivateKey priKey = (RSAPrivateKey) GenKeyFromString
.getPrivateKey(MyConstant.priKey1);
// 拿着私钥解旧密码
byte[] encRsaByte_old = rsa.decrypt(priKey,
byterepsw_old);
// 拿着私钥解 新密码
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/fc3777d168219d6629d82a55b519e519.jpeg)
尾声
开发是需要一定的基础的,我是08年开始进入Android这行的,在这期间经历了Android的鼎盛时期,和所谓的Android”凉了“。中间当然也有着,不可说的心酸,看着身边朋友,同事一个个转前端,换行业,其实当时我的心也有过犹豫,但是我还是坚持下来了,这次的疫情就是一个好的机会,大浪淘沙,优胜劣汰。再等等,说不定下一个黄金浪潮就被你等到了。
- 330页 PDF Android核心笔记
- 几十套阿里 、字节跳动、腾讯、华为、美团等公司2020年的面试题
- PDF和思维脑图,包含知识脉络 + 诸多细节
- Android进阶系统学习视频
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
4lCoPEF.jpg" />
尾声
开发是需要一定的基础的,我是08年开始进入Android这行的,在这期间经历了Android的鼎盛时期,和所谓的Android”凉了“。中间当然也有着,不可说的心酸,看着身边朋友,同事一个个转前端,换行业,其实当时我的心也有过犹豫,但是我还是坚持下来了,这次的疫情就是一个好的机会,大浪淘沙,优胜劣汰。再等等,说不定下一个黄金浪潮就被你等到了。
- 330页 PDF Android核心笔记
[外链图片转存中…(img-YKaYL219-1713587969894)]
- 几十套阿里 、字节跳动、腾讯、华为、美团等公司2020年的面试题
[外链图片转存中…(img-cXUq45AI-1713587969895)]
[外链图片转存中…(img-ekaLkSvX-1713587969896)]
- PDF和思维脑图,包含知识脉络 + 诸多细节
[外链图片转存中…(img-GZp8bzSU-1713587969897)]
- Android进阶系统学习视频
[外链图片转存中…(img-OPGsNBMp-1713587969898)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!