show | version | enable_checker |
---|---|---|
step |
1.0 |
true |
- 这次解决了重复用户名的问题
- 但是还是可能有问题的
- 比如数据库中我们的数据存储宽度是30
- 如果提交的字符串长度大于30,会如何呢?🤔
- 30有点太大了
- 把列宽直接干到10
- 错误就很容易发生了😏
alter table login alter column username type varchar(10);
- 修改之后想要插入超过10个字符的内容
- 果然就无法插入了
- 不过,程序插入的时候会报错
- 我们需要在insert里面进行验证
- 并且报错
- 这样就可以重定向到/error
- msg=usernameTooLong
- 这个消息需要在ErrorServlet里面处理
- 我再去注册一个特别长的用户名
- 如果提交的用户名大于10的话
- 会直接重定向/error
- 不过如果用户名大于10的话应该直接跳转
- 还需要执行查询么?
- 不用去执行红框中的查询
- 代码顺序需要调整
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class InsertServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException{
request.setCharacterEncoding("utf-8");
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
Connection c = null;
Statement stmt = null;
try {
Class.forName("org.postgresql.Driver");
c = DriverManager.getConnection(
"jdbc:postgresql://localhost:5432/oeasy", "postgres",
"oeasy@pg");
c.setAutoCommit(false);
out.println("db connection is ok!!<br/>");
stmt = c.createStatement();
String Username = request.getParameter("username");
String Password = request.getParameter("password");
if(null!=Username&&Username.length()>10){
System.out.println("=====yes username too loog");
stmt.close();
c.commit();
c.close();
response.sendRedirect("http://localhost:8080/oeasy/error?msg=usernameTooLong");
}
else{
ResultSet rs = stmt.executeQuery("select * from login where Username='"+Username+"'");
if(rs.next()){
stmt.close();
c.commit();
c.close();
response.sendRedirect("http://localhost:8080/oeasy/error?msg=usernameExists");
}
else{
String sql = "insert into login(username,password) values('"+Username+"','"+Password+"');";
System.out.print("sql======================" + sql);
stmt.executeUpdate(sql);
stmt.close();
c.commit();
c.close();
response.sendRedirect("http://localhost:8080/oeasy/select");
}
}
} catch (Exception e) {
e.printStackTrace();
System.err.println(e.getClass().getName() + ": " + e.getMessage());
}
}
}
- 但是如果在网页前端就可以报错的话
- 可以降低后台的读写压力
- 可以降低网络传输压力
- 可以第一时间进行提示
- 因为浏览器直接就报了错了
- 可以找到用户名文本框对应的字符串长度
- 我在提交的时候
- 需要先在前端验证
- 然后再提交
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta http-equiv="content-Type" content="text/html;charset=utf-8"/>
<title>prepareInsert</title>
</head>
<body>
<form id="RegistForm" onsubmit="return doSubmit()" action="./insert" method="post">
用户名:<input id="username" name="username" type="text" />
<br/>
密码:<input id="password" name="password" type="text" />
<br/>
<input type="submit" value="注册" >
<input type="reset" value="重置" >
</form>
</body>
<script>
function doSubmit(){
var username = document.getElementById("username");
if(username.value.length>10){
alert("用户名有"+username.value.length+",请不要超过10位");
return false;
}
else{
var form = document.getElementById("RegistForm");
form.submit();
}
}
</script>
</html>
- 有的时候不是弹窗报错
- 而是在网页上报错
- 应该怎么办呢?
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta http-equiv="content-Type" content="text/html;charset=utf-8"/>
<title>prepareInsert</title>
</head>
<body>
<form id="RegistForm" onsubmit="return doSubmit()" action="./insert" method="post">
用户名:<input id="username" name="username" type="text" />
<br/>
密码:<input id="password" name="password" type="text" />
<br/>
<input type="submit" value="注册" >
<input type="reset" value="重置" >
</form>
<span id="errormsg"></span>
</body>
<script>
function doSubmit(){
var username = document.getElementById("username");
if(username.value.length>10){
errormsg.innerHTML = "用户名有"+username.value.length+"位,请不要超过10位";
return false;
}
else{
var form = document.getElementById("RegistForm");
form.submit();
}
}
</script>
</html>
- 前端已经验证了
- 还有必要在后端再验证一次么?🤔
- 前端是堂倌明确地拒绝了客人
- 不能点蒸熊掌
- 第一时间在本地就告诉了客人
- 节省时间和带宽
- 但是客人可能直接去找初始
- 强制构造表单并提交
- 后端是厨师
- 让厨师牢记不能做蒸熊掌
- 这样就在后厨立下规矩
- 避免对数据库做不规范操作
- 这次解决了用户名字符串长度控制问题
- 后端控制了之后
- 再在前端先验证
- 这样前后端都验证
- 前端负责高效
- 后端负责保险
- 但是有的时候密码要求比较高
- 不但要求有大写小写数字和符号
- 还要求输入两次比对一下
- 这怎么做呢?🤔
- 下次再说!👋