时间:2021-07-01 10:21:17 帮助过:10人阅读
SendPhoneVerifyCode----->ajax发送数据的后端servlet,接收前端发来的电话号码,并执行发送验证码的动作
public class SendPhoneVerifyCode extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); //获取电话号码 String phone = request.getParameter("phone"); //给当前号码发送验证码,返回验证码存在session里,就是这里把我限制了,云信都登不上了,不过不影响使用 String code = new PhoneVerifyCode(phone).sendCode(); request.getSession().setAttribute("phoneCode",code);//session是存在于服务器上滴,cookie是在客户端滴 //将json数据返回前端,提示用户 response.getWriter().write("{\"message\":\"信息已发送\"}"); } }
PhoneVerifyCode--->网易云信的提示中有代码,记得在copy一下它的CheckSumBuilder类,会用到,还要添加两个JAR包httpcore-4.4.3.jar和httpclient-4.5.1.jar,如果报错中有logging等字眼,再添加com.springsource.org.apache.commons.logging-1.1.1.jar
public class PhoneVerifyCode { //发送验证码的请求路径URL private static final String SERVER_URL="https://api.netease.im/sms/sendcode.action"; //网易云信分配的账号,请替换你在管理后台应用下申请的Appkey private static final String APP_KEY="d39afb7b5b9ece021935351e74f75d98"; //网易云信分配的密钥,请替换你在管理后台应用下申请的appSecret private static final String APP_SECRET="543d6e574be7"; //随机数 private static final String NONCE="123456"; //短信模板ID private static final String TEMPLATEID="4062279"; //手机号 private static String MOBILE=""; //验证码长度,范围4~10,默认为4 private static final String CODELEN="6"; public PhoneVerifyCode(String MOBILE){ this.MOBILE=MOBILE; } public String sendCode(){ DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(SERVER_URL); String curTime = String.valueOf((new Date()).getTime() / 1000L); /* * 参考计算CheckSum的java代码,在上述文档的参数列表中,有CheckSum的计算文档示例 */ String checkSum = CheckSumBuilder.getCheckSum(APP_SECRET, NONCE, curTime); // 设置请求的header httpPost.addHeader("AppKey", APP_KEY); httpPost.addHeader("Nonce", NONCE); httpPost.addHeader("CurTime", curTime); httpPost.addHeader("CheckSum", checkSum); httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); // 设置请求的的参数,requestBody参数 List<NameValuePair> nvps = new ArrayList<NameValuePair>(); /* * 1.如果是模板短信,请注意参数mobile是有s的,详细参数配置请参考“发送模板短信文档” * 2.参数格式是jsonArray的格式,例如 "[‘13888888888‘,‘13666666666‘]" * 3.params是根据你模板里面有几个参数,那里面的参数也是jsonArray格式 */ nvps.add(new BasicNameValuePair("templateid", TEMPLATEID)); nvps.add(new BasicNameValuePair("mobile", MOBILE)); nvps.add(new BasicNameValuePair("codeLen", CODELEN)); try { httpPost.setEntity(new UrlEncodedFormEntity(nvps, "utf-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } // 执行请求 HttpResponse response = null; try { response = httpClient.execute(httpPost); } catch (IOException e) { e.printStackTrace(); } /* * 1.打印执行结果,打印结果一般会200、315、403、404、413、414、500 * 2.具体的code有问题的可以参考官网的Code状态表 */ String respJSON= null; try { respJSON = EntityUtils.toString(response.getEntity(), "utf-8"); System.out.println(respJSON); } catch (IOException e) { e.printStackTrace(); } Gson gson=new Gson(); CodeEntity entity = gson.fromJson(respJSON, CodeEntity.class); String ss=entity.getObj(); //因为把我限制了,导致给我的验证码格式不对,截取前面的即是验证码,正常用户直接getobj()即是验证码,没办法被限制了... System.out.println(ss.substring(0,7)); return ss.substring(0,7); } }
UserRegisterServlet---->用户注册判断用户填写的数据是否可以注册的servlet
public class UserRegisterServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("r_username"); String password = request.getParameter("r_password"); String telephone = request.getParameter("r_telephone"); String phoneVerifyCode = request.getParameter("phoneVerifyCode"); User user=new User(username, MD5Util.md5(password),telephone); //开始注册业务 UserRegister userRegister=new Dao.UserRegister(); if(userRegister.isRepeatUsername(username)){ request.getSession().setAttribute("messageShow","用户名重复"); response.sendRedirect("Register.jsp"); return; } if(!userRegister.isRightCode(phoneVerifyCode, (String) request.getSession().getAttribute("phoneCode"))){ request.getSession().setAttribute("messageShow","验证码错误"); response.sendRedirect("Register.jsp"); return; } userRegister.insertUser(user); request.getSession().setAttribute("username",username); request.getRequestDispatcher("RegisterSuccess.jsp").forward(request,response); } }
UserRegister--->实现业务层的接口,对数据库进行CRUD操作的类
public class UserRegister implements Service.UserRegister{ private DataSource dataSource=new ComboPooledDataSource(); private QueryRunner qr=new QueryRunner(dataSource); @Override public boolean isRightCode(String code, String rightCode) { return code.equalsIgnoreCase(rightCode); } @Override public boolean isRepeatUsername(String username) { User user=null; try { user = qr.query("select * from user where username=?", new BeanHandler<>(User.class), username); } catch (SQLException e) { e.printStackTrace(); } return user!=null; } @Override public void insertUser(User user) { try { qr.update("insert into user(username,password,telephone) values (?,?,?)",user.getUsername(),user.getPassword(),user.getTelephone()); } catch (SQLException e) { e.printStackTrace(); } } }
以上为注册模块主要的代码,剩下的要么是实体类(User类用来封装用户输入的信息、CodeEntity类用来将手机验证码返回的jsonArray转为该对象),要么是工具类(MD5加密密码),要么就是业务层定义的接口(用户注册的功能设定)。
差不多就这样了,就不放上来了,这么多也不一定看的完..........代码臃肿,得治。。。注册短信验证码到这里就实现了,剩下邮件验证激活和登录......先放着。
收到的短信可以自己设置模板,但是要审核,不要刷的太频繁,不然o( ̄ヘ ̄o#)---------->{"code":416,"msg":"mobile limit","obj":"4322605||+86-xxxxxxxxx"},mobile limit,电话号码就xxxxx了。
注册成功后进入,邮箱激活界面,用户名可在注册的Sevlet中存session,在这个页面通过el获取-----.>
2018.02.02 记
Jsp+Servlet+MYSQL注册登录案例(界面难看,ε=(´ο`*)))唉)
标签:service build out ted span success substring tle 分享