8.11(web doget方法乱码)

本文探讨了用户注册登录系统中的SQL注入漏洞,并通过使用PreparedStatement接口进行了修复。此外,还介绍了如何运用MVC设计模式分离业务逻辑与界面显示,提高了软件的可维护性和扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述

解决漏洞

1、问题探索:
昨天写的用户注册登录系统中存在漏洞,如下:在登陆界面下,当输入密码时时有 sdef’ or 1=’1 等类似的情况时,不论原密码是否正确都会登录成功。原因是:该处出现了1=1这个正确的结论,这也是90年的黑客问题。
这里写图片描述

2、解决办法:
接口 PreparedStatement
SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。
注:用于设置 IN 参数值的设置方法(setShort、setString 等等)必须指定与输入参数的已定义 SQL 类型兼容的类型。例如,如果 IN 参数具有 SQL 类型 INTEGER,那么应该使用 setInt 方法。
代码如下:

try {
            if (!con.isClosed()) {
PreparedStatement state = con.prepareStatement("select * from user where user_name=? and password=?");
                state.setString(1, Username);
                state.setString(2, password);
                ResultSet set = state.executeQuery();
                set.last();
                int num = set.getRow();
                System.out.println("查询结果:" + num);

事务

事务(一组不可拆分的操作) 例如ATM取款 中间任何一个过程失败,前面的过程全都恢复操作
之前的状态。
在此,提出了事务这一词,在一个过程需要多条语句执行时,往往用到事务,例如添加用户时:

public class Commit {
    public static void main(String[] args) {
    //添加4个用户用户
        String s1 = "insert into user(user_name,password)value('lili','123456')";
        String s2 = "insert into user(user_name,password)value('lgr','12y456')";
        String s3 = "insert into user(user_nae,password)value('lcvg','123ui56')";//这里name故意写错
        String s4 = "insert into user(user_name,password)value('frgtli','123r6')";
        Connection con = SQLManager.newInstance().getCon();// 与数据库建立连接
        // 数据库操作类
        try {
            Statement state = con.createStatement();//数据库连接默认为每一条语句都是一个事务,会单独执行
            con.setAutoCommit(false);//首先设置connection不自动提交
            //execute(s1)效率比较低
            state.addBatch(s1);//执行多条语句用addBath
            state.addBatch(s2);
            state.addBatch(s3);//执行到此时,发生错误,上面的s1,s2也不能添加进库中
            state.addBatch(s4);
            state.executeBatch();
            con.commit();//// 使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection 对象当前持有的所有数据库锁。    
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

eclipse JavaEE web搭建环境

1、首先将下面这个jar文件放到安装的eclipse的plugins文件夹下
这里写图片描述
然后重新启动eclipse就会出现这样的三个图标:
这里写图片描述
2、选择JavaEE,创建Servlet工程,导入jar包等等一系列详细的步骤就不多说了,没有技术含量,可以问度娘……
3、找到WebContent文件夹,在其中点右键建立新的index.html问价
完成后出现如下代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a>ho,hhh(可以以随便输入)</a>
</body>
</html>

单例设计模式

单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。


    private static SQLManager manager;

    public static synchronized SQLManager newInstance() {
        if (manager == null) {
            manager = new SQLManager();
        }
        return manager;
    }

MVC设计模式

编程思想 modle view control 数据 界面 控制全部分开
例如在用户注册登录代码中,将注册和登陆的方法写到一个控制类中,在界面中直接调用
####Java代码如下

//操作类
 public class SQLOperate {
    private static SQLOperate operate;

    private SQLOperate() {

    }
    //设置单例
    public static synchronized SQLOperate newInstance() {
        if(operate==null){
            operate = new SQLOperate();
        }
        return operate;

    }

    public boolean signIn(String Username, String password) {//这是用户登陆方法
        Connection con = SQLManager.newInstance().getCon();

        try {
            if (!con.isClosed()) {
                PreparedStatement state = con.prepareStatement("select * from user where user_name=? and password=?");
                state.setString(1, Username);
                state.setString(2, password);
                ResultSet set = state.executeQuery();
                set.last();
                int num = set.getRow();
                System.out.println("查询结果:" + num);
                return num == 1;
            }

        } catch (SQLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        return false;
    }
    public void register(String Username,String password){//这是注册方法
        Statement state = SQLManager.newInstance().getStatement();
        String sql = "select * from user where user_name='" + Username + "'";
        try {
            ResultSet set = state.executeQuery(sql);// 运行给定的 sql
                                                    // 语句并返回单一的
                                                    // ResultSet 对象。
            set.last();// 游标移到最后一行
            int num = set.getRow();// 得到Username的行号
            if (num > 0) {
                System.out.println("已存在");
            } else {
                String login = "insert into user(user_name,password)value('" + Username + "','" + password
                        + "')";
                state.execute(login);
                System.out.println("注册成功!");
            //  return num == 1;
            }
        //  return num == 1;
        } catch (SQLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        //return false;

    }

注册时调用操作类中的注册方法:

btnNewButton = new JButton("注册");
        btnNewButton.setBounds(103, 170, 93, 23);
        btnNewButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                String Username = textFieldUserName.getText();
                String password = textFieldPassword.getText();
                SQLOperate.newInstance().register(Username, password);

用户登录时调用操作类的登陆方法:

public void actionPerformed(ActionEvent e) {
                String Username = textFieldUsername.getText();
                String password = textFieldPassword.getText();
                boolean isSignIn = SQLOperate.newInstance().signIn(Username,password);
                if(isSignIn){
                    System.out.println("登陆成功");
                }else{
                    System.out.println("用户名或密码错误");
                }

工厂设计模式

客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:前面写到的消费者消费和生产者生产产品的程序,详细的请看本人博客(8.05)

观察者模式

观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
此模式在后面的Android中将会详细介绍。

基于开源大模型的教学实训智能体软件,帮助教师生成课前备课设计、课后检测问答,提升效率与效果,提供学生全时在线练习与指导,实现教学相长。 智能教学辅助系统 这是一个智能教学辅助系统的前端项目,基于 Vue3+TypeScript 开发,使用 Ant Design Vue 作为 UI 组件库。 功能模块 用户模块 登录/注册功能,支持学生和教师角色 毛玻璃效果的登录界面 教师模块 备课与设计:根据课程大纲自动设计教学内容 考核内容生成:自动生成多样化考核题目及参考答案 学情数据分析:自动化检测学生答案,提供数据分析 学生模块 在线学习助手:结合教学内容解答问题 实时练习评测助手:生成随练题目并纠错 管理模块 用户管理:管理员/教师/学生等用户基本管理 课件资源管理:按学科列表管理教师备课资源 大屏概览:使用统计、效率指数、学习效果等 技术栈 Vue3 TypeScript Pinia 状态管理 Ant Design Vue 组件库 Axios 请求库 ByteMD 编辑器 ECharts 图表库 Monaco 编辑器 双主题支持(专业科技风/暗黑风) 开发指南 # 安装依赖 npm install # 启动开发服务器 npm run dev # 构建生产版本 npm run build 简介 本项目旨在开发一个基于开源大模型的教学实训智能体软件,帮助教师生成课前备课设计、课后检测问答,提升效率与效果,提供学生全时在线练习与指导,实现教学相长。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值