实现登录界面,自定义用户名和密码

实现一个登录界面,自定义用户名和密码,然后登录时输入用户名和密码,成功就登录进去,显示主窗口,失败则清空用户输入的用户名和密码,退出就直接退出。
但现在不论输入什么都会清空用户输入
INT_PTR CALLBACK Dialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
CreateWindow(_T("button"), _T("确认"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
0, 70, 100, 30, hDlg, (HMENU)5001, hInst, NULL);
CreateWindow(_T("button"), _T("退出"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
100, 70, 100, 30, hDlg, (HMENU)5002, hInst, NULL);
CreateWindow(_T("edit"), _T("请输入用户:"), WS_CHILD | WS_VISIBLE,
0, 0, 1024, 20, hDlg, (HMENU)6001, hInst, NULL);
CreateWindow(_T("edit"), _T("请输入密码:"), WS_CHILD | WS_VISIBLE,
0, 30, 1024, 20, hDlg, (HMENU)6002, hInst, NULL);
return (INT_PTR)TRUE;

case WM_COMMAND://命令消息
    switch (LOWORD(wParam))
    {
    case 5002:
        EndDialog(hDlg, 0);
        break;
    case 5001:
    {        

                 char str1[20] = {};
                 char str2[20] = {};
                 GetDlgItemTextA(hDlg, 6001, str1, 1024);
                 GetDlgItemTextA(hDlg, 6002, str2, 1024);

                 if (strcmp("1234",str1)==0 && strcmp("4321",str2)==0)
                 {
                     EndDialog(hDlg,0); 
                 }
                else
                 {
                    SetDlgItemText(hDlg, 6001, _T("请输入用户:"));
                    SetDlgItemText(hDlg, 6002, _T("请输入密码:"));                                   
                 }  

    }
        break;
    }

    if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
    {
        EndDialog(hDlg, LOWORD(wParam));
        return (INT_PTR)TRUE;
    }
    break;
}
return (INT_PTR)FALSE;

}

1个回答

MFC里用不到strcmp、GetDlgItemText
直接把文本框映射到成员变量,用 UpdateData 同步变量

看你问了2次了。你采纳了2个回答,给你写一个吧

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
实现一个登录界面,自定义用户名和密码
实现一个登录界面,自定义用户名和密码,然后登录时输入用户名和密码,成功就登录进去,显示主窗口,失败则清空用户输入的用户名和密码,退出就直接退出。 但现在不论输入什么都会清空用户输入 ``` ```switch (message) { case WM_INITDIALOG: CreateWindow(_T("button"), _T("确认"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 0, 70, 100, 30, hDlg, (HMENU)5001, hInst, NULL); CreateWindow(_T("button"), _T("退出"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 100, 70, 100, 30, hDlg, (HMENU)5002, hInst, NULL); CreateWindow(_T("edit"), _T("请输入用户:"), WS_CHILD | WS_VISIBLE, 0, 0, 1024, 20, hDlg, (HMENU)6001, hInst, NULL); CreateWindow(_T("edit"), _T("请输入密码:"), WS_CHILD | WS_VISIBLE, 0, 30, 1024, 20, hDlg, (HMENU)6002, hInst, NULL); return (INT_PTR)TRUE; case WM_COMMAND://命令消息 switch (LOWORD(wParam)) { case 5002: EndDialog(hDlg, 0); case 5001: { char str1[20] = {}; char str2[20] = {}; GetDlgItemTextA(hDlg, 6001, str1, 1024); GetDlgItemTextA(hDlg, 6002, str2, 1024); if (strcmp(str1, "1234")==0 && strcmp(str2, "4321")==0) { EndDialog(hDlg, 0); } else { SetDlgItemText(hDlg, 6001, _T("请输入用户:")); SetDlgItemText(hDlg, 6002, _T("请输入密码:")); } } } if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE;
.net 获取session进行简单的数据登录验证问题?
设计包含一个包含Login.aspx和Welcome.aspx两个页面的网站。要求用户登录界面如下图,输入合法的用户名和密码后才能打开Welcome.aspx页面,此时页面中显示用户名及欢迎信息。如果用户级别是admin,页面中显示“管理所有用户”和“修改个人信息”链接按钮,如果用户级别为normal页面中只显示“修改个人信息”链接按钮。 ![图片说明](https://img-ask.csdn.net/upload/201603/30/1459341536_226166.jpg) [要求]: 1. 合法用户名和密码,自己设定,至少三组; 2. 输入错误的用户名和密码,屏幕上将弹出提示信息框;若用户试图绕过登录页面,直接访问Welcome.aspx将弹出提示框; 3. 要求使用Session对象; 怎样定义一个类,来保存自己设定的用户名和密码还有权限,怎样调用它来前端输入的数据进行比较? 分析:把表单传进来的值保存在session中,然后从session中取值出来与自己设置的用户名和密码进行比较。 问题:怎样定义一个类来保存自己定义的用户名和密码,这里有3组。 怎样用这个用户名和session的值进行比较,而且还有权限的判断? 怎么在cs文件中写代码?请求帮助,万分感谢。
如何使用VS2008制作自定义安装界面?
我用VS2008制作一个安装包,但是我想给安装过程添加一个验证用户名和密码的 功能,我知道是创建一个类库并跟安装项目进行关联,然后更改其中的代码,但是我不知道具体的代码怎么写才能实现这个功能,请各位大神赐教!
Ext如何在登陆界面里同时实现动态换肤和记住密码
<p>//大家好,下面这些代码,是一个登陆界面。里面有动态换肤和记住密码两个功能。我测试过当只有其中一个(比如记住密码)功能时,一切正常,可当两个在一起时,就</p> <p>//有问题(比如换肤不彻底。或执行了  "Ext.Msg.alert("信息","去记密码了");"这句,但是测试时,没效果)我想一定是,得到cookie时,没有限得到所有的cookies,</p> <p>//而导致的,网上说用 "Ext.state.Manager.setProvider(new Ext.state.CookieProvider({}));”  可对它,一点也不了解。。。。。。。。。。。<br>Ext.onReady(function(){<br> <br> Ext.QuickTips.init();  //开启表单提示<br> //login combo 设置 Start<br> var login_store = new Ext.data.Store({<br>      proxy: new Ext.data.HttpProxy({url:'../servlet/Login_combo'}),<br>      reader: new Ext.data.ArrayReader({},[<br>         {name:'value'},<br>         {name:'text'}<br>      ])<br>  })<br> //login combo 设置  end<br> //设置 Login combo Start<br>  var login_combo = new Ext.form.ComboBox({<br>      store: login_store,<br>      fieldLabel: '角色',<br>      emptyText: '请选择',<br>      mode: 'remote',<br>      name: 'duty',<br>      triggerAction: 'all',<br>      valueField: 'value',<br>      displayField: 'text',<br>      width: 90,<br>      readOnly: true,<br>      msgTarget: 'side', <br>      allowBlank: false<br>  });<br>  //设置 Login combo end <br>  <br>  //加载Login_store中所有关于角色的数据<br>     login_store.load();<br> <br> //form设置 Start<br>  var myform = new Ext.form.FormPanel({<br>        defaultType: 'textfield',<br>        labelAlign: 'right',<br>        labelWidth: 58,<br>        x: 50,<br>        y: 40,<br>        anchor:'85% 105%', <br>        frame:true,<br>        items: [{<br>            fieldLabel: '用户名',<br>            name: 'username',<br>            id: 'username',<br>            xtype: 'numberfield',<br>            msgTarget: 'side',<br>            allowBlank: false,<br>            allowNegative: false,<br>            allowDecimals: false,<br>            decimalPrecision: 4,<br>            minValue: 0,<br>            maxValue: 150,<br>            listeners: {<br>              'blur': function() {<br>               showPassword()<br>              }<br>            }<br>        },{<br>            fieldLabel: '密码',<br>            name: 'password',<br>            msgTarget: 'side',<br>            allowBlank: false,<br>            vtype: 'alphanum'<br>        },{<br>         xtype: 'panel',<br>         layout: 'form',<br>         labelWidth: 58,<br>         items:[login_combo,{<br>           layout: 'column',<br>           items: [{<br>            columnWidth: .5,<br>             xtype: 'checkbox',<br>             name: 'remember',<br>             id: 'remember',<br>             inputValue: 'remember',//真正有用<br>             boxLabel: '记住密码'        <br>           },{<br>            columnWidth: .5,<br>             xtype: 'checkbox',<br>             name: 'autoLogin',<br>             inputValue: 'autoLogin',<br>             boxLabel: '自动登录'<br>           }]<br>         }]<br>        }]<br>    });<br>    //form设置 end<br> <br><span style="color: #993300;">    //记住密码功能 Start</span> <br>    //1.设置cookie<br>    function setCookie(name,value) {<br>     var date = new Date();<br>     date.setTime(date.getTime() + 2 * 60 * 60);<br>     window.document.cookie = name + "=" + value + ";expire=" + date.toGMTString();<br>    }<br>    //2.监听事件<br>    function remember() { <br>     if(myform.findByType("checkbox")[0].checked==true) {<br>      Ext.Msg.alert("信息","去记密码了");<br>      setCookie(Ext.get("username").getValue(),Ext.get("password").getValue());<br>     }<br>       <br>    }<br>    //3.得到username字符串长度  Start<br>    function getCookie() {<br>     var username = Ext.get("username").getValue() + "=";  <br>     var username_len = username.length;                   <br><span style="color: #993300;">     var cookie_len = window.document.cookie.length;       //感觉 这里 只有客户端只有一个cookie是才成立?????????????????</span><br>     var i = 0;<br>     while(i&lt;cookie_len) {                                <br>      var j = i + username_len;                         <br>         if(window.document.cookie.substring(i,j)==username) return getCookieValue(j);<br>      i = window.document.cookie.indexOf(" ",j);  <br>      if(i==-1) <br>      return null;<br>     }<br>    }<br>    <br>    //4.读取cookie中的password对应的值<br>    function getCookieValue(offset) {<br>     var password_len = window.document.cookie.indexOf(";",offset);<br>     if(password_len==-1)                                          <br>     password_len = window.document.cookie.length;<br>     return window.document.cookie.substring(offset,password_len);<br>    }<br>    //5.将cookie中存储的password显示出来<br>    function showPassword() {<br>     var password = getCookie();<br>     if(password!=null) {<br>      window.document.all.password.value=password;<br>     }<br>    }<br>    //记住密码功能 end <br>    <br>    //combox设置 Start<br>    //定义combox中要显示的数据,(二维数组data)<br>    var data = [<br>      ['xtheme-pink.css','粉红色'],<br>      ['xtheme-gray.css','灰色'],<br>      ['','默认']<br>    ];<br>    //定义处理数据的store<br>    var store = new Ext.data.SimpleStore({<br>      fields: ['value','text'],<br>      data: data<br>    });<br>    <br>    var combo = new Ext.form.ComboBox({<br>      fieldLabel: '皮肤',<br>      store: store,<br>      emptyText: '请选择您喜欢的皮肤',<br>      mode: 'local',<br>      triggerAction: 'all',<br>      valueField: 'value',<br>      displayField: 'text'<br>    });<br>    //combox设置 end<br>    <br>  <span style="color: #993300;">  //comboBox 事件(换肤功能) Start</span><br>    combo.on('select',function(comboBox){   <span style="color: #993300;">//执行换肤功能</span><br>       var css_skin = comboBox.getValue();<br>       var date = new Date();<br>       date.setTime(date.getTime() + 30*24*60*60);<br>       window.document.getElementsByTagName("link")[1].href="../scripts/ext/resources/css/" + css_skin;<br>       window.document.cookie = "css=" + css_skin + ";expires=" + date.toGMTString(); <br>    });<br>    //以上换肤功能只能用于当前,关闭浏览器不会保留此皮肤。下面让他保留<br><span style="color: #993300;">    var cookieArr = window.document.cookie.split(";");  //感觉 这里 只有客户端只有一个cookie是才成立??????????????????</span><br>    var css = null;<br>    for(var i=0;i&lt;cookieArr.length;i++) {<br>     var arr = cookieArr[i].split("=");<br>     if(arr[0]=="css") {<br>      css = arr[1];<br>     }<br>    };<br>      window.document.getElementsByTagName("link")[1].href="../scripts/ext/resources/css/" + css;<br>    //comboBox 事件(换肤功能) end<br>    <br>    //存放combo的form Start<br>    var combo_form = new Ext.form.FormPanel({<br>       labelWidth: 90,<br>       labelAlign: 'right',<br>       frame: true,<br>       x: 0,<br>       y: 0,<br>       anchor:'100% 25%',<br>       items:[combo]<br>    }); <br>    //存放combo的form end<br>   var _window = new Ext.Window({<br>    layout: 'absolute',<br>    buttonAlign:'center',<br>    title: '登陆',<br>    modal: true,<br>    closable: false,<br>    resizable: false,<br>    plain: true,<br>    width: 350,<br>    height: 230,<br>    items: [combo_form,myform],<br>    buttons: [{<br>            text: '确定',<br>            handler: function(){<br><span style="color: #993300;">             remember();    //执行记住密码        ?????????????????????????????</span><br>             if(!myform.getForm().isValid()) {<br>              return;<br>             }<br>             <br>             myform.getForm().submit({<br>               method: 'post',<br>               waitMsg: '正在登陆,请稍等。。。。',<br>               url: '../servlet/LoginServlet',<br>               success : function(myform, action) {<br>                      if(action.result.msg=='登陆成功'){<br>                           Ext.Msg.alert("信息",action.result.msg);<br>                            window.location.href = 'Admin_main.jsp';<br>                        }<br>                        else {<br>                         Ext.Msg.alelt("信息",action.result.msg);<br>                        }<br>                   },<br>                failure: function(myform,action) {<br>                Ext.Msg.alert("信息",action.result.msg);<br>                }<br>             })<br>              }   <br>        },{<br>           text: '取消',<br>           handler:function(){<br>             myform.getForm().reset();<br>           }<br>        }]<br>   })<br>   _window.show();<br>});</p>
java swing 登陆界面 空指针异常
我这里是一个简单的用户登录的程序,有两个Jpanel(pnlTop和主体部分),主体部分有user的JPanel,PassWord的JPanel。 其中,用户的密码、用户名信息都是存储在"information"路径下的"Customer.txt"文件里面的。 isCorrect()和checkInput()属于自定义的方法,用于检查输入和文件内的信息是否匹配。 ``` package UI; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; import Controller.CustomerController; import Customer.Customer; import myComp.MyPicPanel; public class LoginForm extends BaseDialog{ private JPanel pnlMain = null; private JPanel pnlTop = null; private JPanel pnlUsername = null; private JPanel pnlPassword =null; private JPanel pnlButton = null; private JLabel lblUsername = null; private JLabel lblPassword= null; private JButton btnExit= null; private JButton btnLogin= null; private JTextField txtUsername= null; private JPasswordField txtPassword= null; public LoginForm(){ pnlTop = new MyPicPanel("images/2.jpg",400,90); pnlTop.setPreferredSize(new Dimension(400,90)); this.add(pnlTop, BorderLayout.NORTH); pnlMain = new JPanel(); pnlMain.setLayout(new BorderLayout()); pnlMain.setBorder(new EmptyBorder(5,0,0,0)); pnlMain.setBackground(Color.LIGHT_GRAY); this.add(pnlMain, BorderLayout.CENTER); initUI(); } public void initUI(){ //user name panel pnlUsername = new JPanel(); pnlUsername.setPreferredSize(new Dimension(this.getWidth(),60)); pnlUsername.setBorder(new EmptyBorder(10,0,0,0)); pnlMain.add(pnlUsername,BorderLayout.NORTH); //password panel pnlPassword = new JPanel(); pnlPassword.setPreferredSize(new Dimension(this.getWidth(),60)); pnlMain.add(pnlPassword,BorderLayout.CENTER); //button panel pnlButton = new JPanel(); pnlButton.setPreferredSize(new Dimension(this.getWidth(),60)); pnlMain.add(pnlButton,BorderLayout.SOUTH); addUsername(pnlUsername); addPassword(pnlPassword); addButton(pnlButton); } public ActionListener onclickListener = new ActionListener(){ @Override public void actionPerformed(ActionEvent e){ JButton jb = (JButton)e.getSource(); if(jb.getActionCommand().equals("login")){ if(checkInput()){ if(isCorrect()){ Mainform main = new Mainform(); dispose(); } }else{ JOptionPane.showMessageDialog(null, "登录失败","Gourmet Coffee System", JOptionPane.ERROR_MESSAGE); } }else if(jb.getActionCommand().equals("exit")){ System.exit(0); } } }; private void addPassword(JPanel pnlPassword) { JLabel lblPassword = new JLabel("Password"); lblPassword.setFont(new Font("Microsoft YaHei UI",Font.BOLD,20)); pnlPassword.add(lblPassword); txtPassword = new JPasswordField(10); pnlPassword.add(txtPassword); } private void addUsername(JPanel pnlUsername) { JLabel lblUsername = new JLabel("Account"); lblUsername.setFont(new Font("Microsoft YaHei UI",Font.BOLD,20)); pnlUsername.add(lblUsername); txtUsername = new JTextField(10); pnlUsername.add(txtUsername); } //默认FlowLayout private void addButton(JPanel pnlButton) { btnLogin = new JButton("Login"); btnLogin.setActionCommand("login"); btnLogin.addActionListener(onclickListener); pnlButton.add(btnLogin); btnExit = new JButton("Exit"); btnExit.setActionCommand("exit"); btnExit.addActionListener(onclickListener); pnlButton.add(btnExit); } public boolean isCorrect(){ boolean flag = true; CustomerController userManager = new CustomerController(); ArrayList<Customer> customers = userManager.readObject("information","Customer.txt"); for(Customer customer: customers){ if(customer.getAccount().equals(txtUsername.getText().trim())) { if((String.valueOf(txtPassword.getPassword().equals(customer.getPassword()))) != null){ flag = true; } } } return flag; } public boolean checkInput(){ boolean flag = true; if(txtUsername.getText().trim().isEmpty()){ this.showMessage("账号不许为空!"); txtUsername.requestFocus(); flag = false; } if(String.valueOf(txtPassword.getPassword()).trim().isEmpty()){ this.showMessage("密码不许为空!"); txtPassword.requestFocus(); flag = false; } return flag; } public void showMessage(String msg){ JOptionPane.showMessageDialog(null, msg,this.getTitle(),JOptionPane.ERROR_MESSAGE); } } ``` 输出界面是这样: ![图片说明](https://img-ask.csdn.net/upload/201701/05/1483622006_749594.png) 但是每次输入用户名和密码(只要不是空,无论输入什么)都会报空指针异常。 这是异常片段: ``` Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at UI.Mainform.removeButton(Mainform.java:134) at UI.Mainform.<init>(Mainform.java:71) at UI.LoginForm$1.actionPerformed(LoginForm.java:95) ``` 折磨了我整整一个下午加晚上…明天就要交了 求救啊各位大佬……
多人聊天器,求大神发源代码!初来乍到,小弟实在不是很懂,望大神指教!在线等大神!
1. 对功能的规定 分必选项和任选项,其中,必选项是必须完成的,属于项目答辩的入口条件,所有人都要做,未完成者取消答辩资格; 任选项不是入口条件,但每完成一项都会加分,对于完成了必选项的同学,尽可能地多完成一些任选项,以期获得更高的答辩成绩。 如果所有项(包括必选和任选)都完成,那么功能分就是满分。 如果设计思路、界面效果、代码组织等方面有个性(或和别人的不同),则获得附加分。 1.1 服务器功能 1.1.1配置文件 属性:任选 描述:服务器的配置从配置文件中获取,内容包括服务器地址(服务器IP 和 port),具体格式如下: SERVER_IP = 192.168.1.11 PORT = 12012 注意:具体IP和port以本地为准 1.1.2账户文件 属性:必选 描述:客户端注册的用户名和密码需要服务器保存。必须完成下列所有情况: ●内容为用户名和用户密码列表; ●必须用文本形式; ●用户注册用户名重复,需要提示重新选择用户名 ●用户登录时用户名重复,需要提示重新选择用户名 ●用户名密码输入错误,应该提示。给3次连续错误机会,超过3次退出。 1.1.3支持多客户端 属性:必选 描述:基于tcp协议的客户端服务器通讯,服务器采用多线程支持多个客户端连接。 1.1.4业务功能 属性:必选 描述:群聊,单聊 1.1.5链表记录会话连接 属性:必选 描述:服务端使用链表记录当前客户端的会话连接,多个线程访问同一个链表,采用互斥锁来控制。 链表包含下列信息:客户端的ip地址、连接时间,用户名。 1.1.6链表记录动态维护 属性:任选 描述:服务端能够动态维护链表记录;服务器有命令供查询显示。 1.1 客户端功能 1.2.1注册 属性:必选 描述:客户端提供注册用户名,密码功能,用户名密码通过网络传输到服务器认证(用户名不可重复),认证通过后写入账户文件。 1.2.2登陆(认证) 属性:必选 描述:服务器和客户端增加用户密码登陆机制,包含如下流程: ●客户端把接受的用户名密码发送至服务器; ●服务器启动后从配置文件中读取用户信息形成数据表,根据此来验证密码。验证后返回认证结果给客户端(不可一个用户名同时登录) ●如果认证正确,服务器开始接受客户端的命令;认证错误重新认证(3次登陆错误退出) 1.3心跳机制 属性:必选 描述:客户端与服务端之间使用心跳机制,必须完成下列所有情况: ●客户端定时向服务端发送一个数据包(心跳包,内容不限,3秒间隔),证明自己活着; ●服务端显示来自某个IP地址客户端的心跳包; 1.4心跳异常 属性:任选 描述:服务器超过一定的时间没有收到客户端的心跳包(3秒间隔),连续5个包没有接收到则说明客户端出现问题,必须做出如下的处理: ●记录状况; ●断开连接; 1.5聊天功能 属性:必选 描述:两客户端之间能够直接文字通信(类似于QQ聊天), ●能够查询在线列表,具体信息从服务器的链表记录获得; ●可以和别的客户端聊天,发数据采用“用户名后面加数据”方式; 1.6日志文件 属性:任选 描述:服务端通过一个日志文件记录所有客户端连接、命令执行、断开信息(时间,IP地址,执行的命令,心跳包超时等)。 例如:“客户端连接时间 客户端IP地址 客户端的命令 数据包类型(就是上面1.6的data_type) 客户端发送的信息 ”。 2.对性能的规定 本系统在设计方面本着方便、实用的宗旨,性能方面应遵循如下原则: ●执行效率(时间): 软件运行应该尽量高效;避免没有必要的循环处理、重复处理; ●资源损耗(空间):设计尽量节约资源(内存、数组、链表等);不用的资源要及时释放; ●初始化: 变量、数组、内存块、链表节点(其next要置NULL)等都要初始化; ●健壮性:不能出现野指针、内存泄露、数组越界访问等等: ◎申请内存之后,应该立即检查指针值是否为NULL;动态内存的申请与释放必须配对,防止内存泄漏。释放了内存之后,立即将指针设置为NULL,防止产生“野指针”; ◎函数的入参必须进行有效性判断;用户输入、函数返回值(如果用到的话)都要判断; ◎switch-case一定要有default;if-else if等后要有else,除非if满足后返回或退出; ◎数组的下标不要发生“多1”或者“少1”操作。 3.对排版的规定 ●缩进要对齐; ●长行拆分; ●二元操作符的前后应当加空格,包括如下操作符: 赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如"="、"+=" ">="、"<="、"+"、"*"、"%"、"&&"、"||"、"<<", "^" 等; ●空行: ◎结构体 声明之后、每个函数定义结束之后都要加1行空行; ◎逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔; ◎一行代码只做一件事情; ◎"if"、"for"、"while"、"do"等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加 "{ }"; 4.对可维护性的规定 对可维护性的最终要求:别人能够轻松上手你的代码。 ●结构清晰: ◎模块化:对界面(显示)、菜单管理、逻辑管理、文件操作等等代码要独立,必须多个.java文件; ◎封装:一个函数只做一件事,函数功能要单一;一个函数不能超过50行; 避免重复、冗余代码; ◎代码块清晰。 ●变量命名规范,变量名应该具有自明性: ◎常量,枚举和宏定义命名 常量名,宏和枚举值由全大写字母组成,单词间通过下划线来界定; ◎函数的命名: 使用"动词"或者"动词+名词"(动宾词组)的形式,由一个或多个单词组成且以小写字母开头,以后每个单词的首字母必须大写 ◎变量的命名与定义 应当使用"名词"或者"形容词+名词",由一个或多个单词组成且以小写字母开头,以后每个单词之间用下划线隔开。 ●注释充分:变量、函数(包括参数、返回值)、代码功能块、一些复杂算法……等都需要 清晰明了地说明; 5.对个性的规定 把项目做出个性出来。下列各项中有和比人不同之处、或很有创意,即可认为有个性。独立设计的软件,一般都会出现一些个性。参考、抄袭不会出现个性。 ●设计思路:包括软件的整体架构、功能块的设计思路、函数封装等等; ●功能实现:从用户的角度,使用上发现与众不同的地方; ●其它方面;
网上下载的项目-导入ssm小米商城的后台项目访问登录界面login的时候无法跳转到其他页面是怎么回事?
在网上下载的ssm小米商城的后台项目 1:项目没有错误,,, 2:在访问登录界面login的时候- 却无法跳转到其他页面 3:数据库不知道是不是正常 4:我的数据库设置了管理员登录:admin 密码123456 5: 写了个generatorConfig.xml 6:::新增:看到有人回复说数据库的名字没有改: 我用的是mysql 数据库名是:shop 密码是:1234 userId我不知道是要赋值什么值,,一般不是userName吗??但是这个项目中的确实userId ,,所以我也给他 赋值了数据库的用户名 “root”但是这样配置根本就没有用,,同样无法跳转页面:::: 如果配置错了,,麻烦指出来,,非常感谢,,新手新手,,实力有限抱歉 求大神帮助,,,呜呜,,还是跳转不了 数据库图片: ![图片说明](https://img-ask.csdn.net/upload/201812/26/1545786449_770158.png) 数据库配置图: ![图片说明](https://img-ask.csdn.net/upload/201812/26/1545786860_325497.png) 按照网友提出的问题:修改数据库名和密码: 我把connectionURL 的 work_attendance也改成了shop,, 如下: //connectionURL="jdbc:mysql://localhost:3306/work_attendance" connectionURL="jdbc:mysql://localhost:3306/shop" <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/shop" userId="root" password="1234"> </jdbcConnection> 但是还是没有用,,,依然无法跳转,,总感觉没有错误,,,不知道错在哪了。。。。,,,,大神,,大神们求帮助中 代码如下: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" > <generatorConfiguration> <!--classPathEntry:数据库的JDBC驱动 --> <!-- location="D:\Develop\MvnRepo\mysql\mysql-connector-java\5.1.34\mysql-connector-java-5.1.34.jar"/> --> <classPathEntry location="D:\Users\lydia\workspaceSSH\shopCMS\src\main\webapp\WEB-INF\lib\mysql-connector-java-5.1.34.jar"/> <context id="MysqlTables" targetRuntime="MyBatis3"> <!-- 注意这里面的顺序确定的,不能随变更改 --> <!-- 自定义的分页插件 <plugin type="com.deppon.foss.module.helloworld.shared.PaginationPlugin"/> --> <!-- 可选的(0 or 1) --> <!-- 注释生成器 --> <commentGenerator> <!-- 是否去除自动生成的注释 true:是 : false:否 --> <property name="suppressAllComments" value="true"/> </commentGenerator> <!-- 必须的(1 required) --> <!--数据库连接的信息:驱动类、连接地址、用户名、密码 connectionURL="jdbc:mysql://localhost:3306/work_attendance" --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/shop" userId="root" password="1234"> </jdbcConnection> ,, 登录界面 ![图片说明](https://img-ask.csdn.net/upload/201812/24/1545659180_616623.jpg) 每次一点击登录: console界面就显示: [DEBUG][2018-12-24 21:47:08] org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:845) DispatcherServlet with name 'SpringMVC' processing POST request for [/shopCMS/login/check] [DEBUG][2018-12-24 21:47:08] org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:297) Looking up handler method for path /login/check [DEBUG][2018-12-24 21:47:08] org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:302) Returning handler method [public java.lang.String com.shop.shopmanager.controller.LoginController.checkLogin(javax.servlet.http.HttpServletRequest) throws java.io.UnsupportedEncodingException,java.security.NoSuchAlgorithmException] [DEBUG][2018-12-24 21:47:08] org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:248) Returning cached instance of singleton bean 'loginController' [DEBUG][2018-12-24 21:47:08] org.mybatis.spring.SqlSessionUtils.getSqlSession(SqlSessionUtils.java:104) Creating a new SqlSession [DEBUG][2018-12-24 21:47:08] org.mybatis.spring.SqlSessionUtils.getSqlSession(SqlSessionUtils.java:140) SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7738ee46] was not registered for synchronization because synchronization is not active [DEBUG][2018-12-24 21:47:08] org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:110) Fetching JDBC Connection from DataSource [DEBUG][2018-12-24 21:47:08] org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:86) JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@41131e6d] will not be managed by Spring [DEBUG][2018-12-24 21:47:08] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:139) ==> Preparing: SELECT cu.user_id AS user_id4, login_name, login_password, salt, user_name, real_name, sex, age, pic_img, cu.`status` AS status4, email, telephone, cu.create_time AS create_time4, cu.update_time AS update_time4, cr.role_id AS role_id2, role_name, role_sign, is_system, cr.`status` AS status2, cr.create_time AS create_time2, cr.update_time AS update_time2, cr.remarks AS remarks2, cm.menu_id AS menu_id1, parent_id, menu_type, menu_code, menu_name, sort, href, icon, cm.`status` AS status1, permission, cm.create_time AS create_time1, cm.update_time AS update_time1, cm.remarks AS remarks1 FROM cms_menu cm, cms_role cr, cms_role_menu crm, cms_user cu, cms_user_role cur WHERE crm.role_id = cr.role_id AND crm.menu_id = cm.menu_id AND cur.user_id = cu.user_id AND cur.role_id = cr.role_id AND cu.login_name = ?; [DEBUG][2018-12-24 21:47:08] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:139) ==> Parameters: admin(String) [DEBUG][2018-12-24 21:47:08] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:139) <== Total: 73 [DEBUG][2018-12-24 21:47:08] org.mybatis.spring.SqlSessionUtils.closeSqlSession(SqlSessionUtils.java:168) Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7738ee46] [DEBUG][2018-12-24 21:47:08] org.springframework.jdbc.datasource.DataSourceUtils.doReleaseConnection(DataSourceUtils.java:327) Returning JDBC Connection to DataSource [DEBUG][2018-12-24 21:47:08] org.apache.shiro.realm.AuthenticatingRealm.getAuthenticationInfo(AuthenticatingRealm.java:569) Looked up AuthenticationInfo [admin] from doGetAuthenticationInfo [DEBUG][2018-12-24 21:47:08] org.apache.shiro.realm.AuthenticatingRealm.cacheAuthenticationInfoIfPossible(AuthenticatingRealm.java:507) AuthenticationInfo caching is disabled for info [admin]. Submitted token: [org.apache.shiro.authc.UsernamePasswordToken - admin, rememberMe=false]. [DEBUG][2018-12-24 21:47:08] org.mybatis.spring.SqlSessionUtils.getSqlSession(SqlSessionUtils.java:104) Creating a new SqlSession [DEBUG][2018-12-24 21:47:08] org.mybatis.spring.SqlSessionUtils.getSqlSession(SqlSessionUtils.java:140) SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@33b81d6e] was not registered for synchronization because synchronization is not active [DEBUG][2018-12-24 21:47:08] org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:110) Fetching JDBC Connection from DataSource [DEBUG][2018-12-24 21:47:08] org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:86) JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@41131e6d] will not be managed by Spring [DEBUG][2018-12-24 21:47:08] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:139) ==> Preparing: SELECT cu.user_id AS user_id4, login_name, login_password, salt, user_name, real_name, sex, age, pic_img, cu.`status` AS status4, email, telephone, cu.create_time AS create_time4, cu.update_time AS update_time4, cr.role_id AS role_id2, role_name, role_sign, is_system, cr.`status` AS status2, cr.create_time AS create_time2, cr.update_time AS update_time2, cr.remarks AS remarks2, cm.menu_id AS menu_id1, parent_id, menu_type, menu_code, menu_name, sort, href, icon, cm.`status` AS status1, permission, cm.create_time AS create_time1, cm.update_time AS update_time1, cm.remarks AS remarks1 FROM cms_menu cm, cms_role cr, cms_role_menu crm, cms_user cu, cms_user_role cur WHERE crm.role_id = cr.role_id AND crm.menu_id = cm.menu_id AND cur.user_id = cu.user_id AND cur.role_id = cr.role_id AND cu.login_name = ?; [DEBUG][2018-12-24 21:47:08] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:139) ==> Parameters: admin(String) [DEBUG][2018-12-24 21:47:08] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:139) <== Total: 73 [DEBUG][2018-12-24 21:47:08] org.mybatis.spring.SqlSessionUtils.closeSqlSession(SqlSessionUtils.java:168) Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@33b81d6e] [DEBUG][2018-12-24 21:47:08] org.springframework.jdbc.datasource.DataSourceUtils.doReleaseConnection(DataSourceUtils.java:327) Returning JDBC Connection to DataSource 原密码:123456Dts7jk 加密之后的密码为:lZQ/OoEBjTylEoEfxoyWeQ== [DEBUG][2018-12-24 21:47:08] org.apache.shiro.web.servlet.SimpleCookie.addCookieHeader(SimpleCookie.java:226) Added HttpServletResponse Cookie [rememberMe=deleteMe; Path=/shopCMS; Max-Age=0; Expires=Sun, 23-Dec-2018 13:47:08 GMT] [DEBUG][2018-12-24 21:47:08] org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdviceChain.invoke(ResponseBodyAdviceChain.java:61) Invoking ResponseBodyAdvice chain for body=login_fail [DEBUG][2018-12-24 21:47:08] org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdviceChain.invoke(ResponseBodyAdviceChain.java:83) After ResponseBodyAdvice chain body=login_fail [DEBUG][2018-12-24 21:47:08] org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:163) Written [login_fail] as "text/plain;charset=ISO-8859-1" using [org.springframework.http.converter.StringHttpMessageConverter@395cf6a4] [DEBUG][2018-12-24 21:47:08] org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1018) Null ModelAndView returned to DispatcherServlet with name 'SpringMVC': assuming HandlerAdapter completed request handling [DEBUG][2018-12-24 21:47:08] org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:996) Successfully completed request [DEBUG][2018-12-24 21:47:08] org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:248) Returning cached instance of singleton bean 'sqlSessionFactory' [DEBUG][2018-12-24 21:47:08] org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:845) DispatcherServlet with name 'SpringMVC' processing GET request for [/shopCMS/login] [DEBUG][2018-12-24 21:47:08] org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:297) Looking up handler method for path /login [DEBUG][2018-12-24 21:47:08] org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:302) Returning handler method [public java.lang.String com.shop.shopmanager.controller.LoginController.login()] [DEBUG][2018-12-24 21:47:08] org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:248) Returning cached instance of singleton bean 'loginController' [DEBUG][2018-12-24 21:47:08] org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:931) Last-Modified value for [/shopCMS/login] is: -1 [DEBUG][2018-12-24 21:47:08] org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1225) Rendering view [org.springframework.web.servlet.view.JstlView: name 'login'; URL [/WEB-INF/views/login.jsp]] in DispatcherServlet with name 'SpringMVC' [DEBUG][2018-12-24 21:47:08] org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:166) Forwarding to resource [/WEB-INF/views/login.jsp] in InternalResourceView 'login' [DEBUG][2018-12-24 21:47:08] org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:996) Successfully completed request [DEBUG][2018-12-24 21:47:08] org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:248) Returning cached instance of singleton bean 'sqlSessionFactory' ``` ``` 我的数据库中有admin和密码 123456,,但是就是无法跳转到登录后的页面希望大佬能帮我看看是什么原因》》》 ------------------------------------ 后续添加,,,,麻烦大佬结合上述和下述看看是什么问题,,拜托拜托, 1:数据库用户表信息: ![图片说明](https://img-ask.csdn.net/upload/201812/28/1545962958_570862.png) 2:我的项目结构: ![图片说明](https://img-ask.csdn.net/upload/201812/28/1545962858_134226.png) 3:以下是登录控制器“LoginController”的代码: package com.shop.shopmanager.controller; import java.io.UnsupportedEncodingException; import java.security.NoSuchAlgorithmException; import javax.servlet.http.HttpServletRequest; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.shop.shopmanager.service.CmsUserService; /** * @Author 康健 * @Date 2017/8/14 14:54 */ @Controller @RequestMapping("login") public class LoginController { @Autowired private CmsUserService cmsUserService; /** * @Author JackWang [www.coder520.com] * @Date 2017/6/18 12:47 * @Description 登录页面 */ @RequestMapping public String login() { return "login"; } /** * @Author JackWang [www.coder520.com] * @Date 2017/6/18 12:47 * @Description 校验登录 */ @RequestMapping("/check") @ResponseBody public String checkLogin(HttpServletRequest request) throws UnsupportedEncodingException, NoSuchAlgorithmException { String username = request.getParameter("username"); String pwd = request.getParameter("password"); UsernamePasswordToken token = new UsernamePasswordToken(username, pwd); // token.setRememberMe(true); Subject subject = SecurityUtils.getSubject(); try { subject.login(token); SecurityUtils.getSubject().getSession().setTimeout(1800000); } catch (Exception e) { return "login_fail"; } return "login_succ"; } /* @RequestMapping("/register") @ResponseBody public String register(@RequestBody User user) throws UnsupportedEncodingException, NoSuchAlgorithmException { userService.createUser(user); return "succ"; }*/ } 4:UsernamePasswordToken 我没有这个类,这好像是一个方法-------网上好像说这是个认证机制,,不知道跳转不了跟这个有没有关系 网上解释:是最常见的用户名/密码的认证机制;同时,由于它实现了RememberMeAuthenticationToken接口,我们可以通过令牌设置“记住我”的功能。 但是,“已记住”和“已认证”是有区别的: 已记住的用户仅仅是非匿名用户,你可以通过subject.getPrincipals()获取用户信息。但是它并非是认证通过的用户,当你访问需要认证用户的功能时,你仍然需要重新提交认证信息。 这一区别可以参考淘宝网站,网站会默认记住登录的用户,再次访问网站时,对于非敏感的页面功能,页面上会显示记住的用户信息,但是当你访问网站账户信息时仍然需要再次进行登录认证。 5: 我的自定义数据库配置“jdbc.properties”: driverClassName=com.mysql.jdbc.Driver validationQuery=SELECT 1 jdbc_url=jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false jdbc_username=root jdbc_password=1234 6:"generatorConfig.xml" 这个就是上面的数据库驱动的配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" > <generatorConfiguration> <!--classPathEntry:数据库的JDBC驱动 --> <!-- location="D:\Develop\MvnRepo\mysql\mysql-connector-java\5.1.34\mysql-connector-java-5.1.34.jar"/> --> <classPathEntry location="D:\Users\lydia\workspaceSSH\shopCMS\src\main\webapp\WEB-INF\lib\mysql-connector-java-5.1.34.jar"/> <context id="MysqlTables" targetRuntime="MyBatis3"> <!-- 注意这里面的顺序确定的,不能随变更改 --> <!-- 自定义的分页插件 <plugin type="com.deppon.foss.module.helloworld.shared.PaginationPlugin"/> --> <!-- 可选的(0 or 1) --> <!-- 注释生成器 --> <commentGenerator> <!-- 是否去除自动生成的注释 true:是 : false:否 --> <property name="suppressAllComments" value="true"/> </commentGenerator> <!-- 必须的(1 required) --> <!--数据库连接的信息:驱动类、连接地址、用户名、密码 connectionURL="jdbc:mysql://localhost:3306/work_attendance" --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/shop" userId="root" password="1234"> </jdbcConnection> <!-- 可选的(0 or 1) --> <!-- 类型转换器或者加类型解析器 --> <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer true,把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal --> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- 必须的(1 required) --> <!-- java模型生成器 --> <!-- targetProject:自动生成代码的位置 --> <javaModelGenerator targetPackage="com.coder520.user.entity" targetProject="D:\Develop\IDEAWorkPlace\work-attendance\src\main\java" > <!--TODO enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="true"/> <!-- 从数据库返回的值被清理前后的空格 --> <property name="trimStrings" value="true"/> </javaModelGenerator> <!-- 必须的(1 required) --> <!-- map xml 生成器 <sqlMapGenerator targetPackage="com.coder520.user.dao" targetProject="D:\Develop\IDEAWorkPlace\work-attendance\src\main\java"> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> --> <sqlMapGenerator targetPackage="com.coder520.user.dao" targetProject="D:\Users\lydia\workspaceSSH\shopCMS\src\main\java"> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> <!-- 可选的(0 or 1) --> <!-- mapper 或者就是dao接口生成器 --> <javaClientGenerator targetPackage="com.coder520.user.dao" targetProject="D:\Users\lydia\workspaceSSH\shopCMS\src\main\java" type="XMLMAPPER"> <property name="enableSubPackages" value="true"/> </javaClientGenerator> <!-- 必须的(1...N) --> <!-- pojo 实体生成器 --> <!-- tableName:用于自动生成代码的数据库表;domainObjectName:对应于数据库表的javaBean类名 --> <!-- schema即为数据库名 可不写 --> <table tableName="role" domainObjectName="Role" enableInsert="true" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"> <!-- 忽略字段 可选的(0 or 1) --> <!-- <ignoreColumn column="is_use" /> --> <!--//无论字段是什么类型,生成的类属性都是varchar。 可选的(0 or 1) 测试无效 --> <!-- <columnOverride column="city_code" jdbcType="VARCHAR" /> --> </table> <table tableName="permission" domainObjectName="Permission" enableInsert="true" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"> <!-- 忽略字段 可选的(0 or 1) --> <!-- <ignoreColumn column="is_use" /> --> <!--//无论字段是什么类型,生成的类属性都是varchar。 可选的(0 or 1) 测试无效 --> <!-- <columnOverride column="city_code" jdbcType="VARCHAR" /> --> </table> </context> </generatorConfiguration> 万分感谢大佬,,,,,帮我解决这问题我就认你当师傅,,,大佬 ,,拜托了,,,还需要什么麻烦留下言哈
多人聊天器求大神代码!
1. 对功能的规定 分必选项和任选项,其中,必选项是必须完成的,属于项目答辩的入口条件,所有人都要做,未完成者取消答辩资格; 任选项不是入口条件,但每完成一项都会加分,对于完成了必选项的同学,尽可能地多完成一些任选项,以期获得更高的答辩成绩。 如果所有项(包括必选和任选)都完成,那么功能分就是满分。 如果设计思路、界面效果、代码组织等方面有个性(或和别人的不同),则获得附加分。 1.1 服务器功能 1.1.1配置文件 属性:任选 描述:服务器的配置从配置文件中获取,内容包括服务器地址(服务器IP 和 port),具体格式如下: SERVER_IP = 192.168.1.11 PORT = 12012 注意:具体IP和port以本地为准 1.1.2账户文件 属性:必选 描述:客户端注册的用户名和密码需要服务器保存。必须完成下列所有情况: ●内容为用户名和用户密码列表; ●必须用文本形式; ●用户注册用户名重复,需要提示重新选择用户名 ●用户登录时用户名重复,需要提示重新选择用户名 ●用户名密码输入错误,应该提示。给3次连续错误机会,超过3次退出。 1.1.3支持多客户端 属性:必选 描述:基于tcp协议的客户端服务器通讯,服务器采用多线程支持多个客户端连接。 1.1.4业务功能 属性:必选 描述:群聊,单聊 1.1.5链表记录会话连接 属性:必选 描述:服务端使用链表记录当前客户端的会话连接,多个线程访问同一个链表,采用互斥锁来控制。 链表包含下列信息:客户端的ip地址、连接时间,用户名。 1.1.6链表记录动态维护 属性:任选 描述:服务端能够动态维护链表记录;服务器有命令供查询显示。 1.1 客户端功能 1.2.1注册 属性:必选 描述:客户端提供注册用户名,密码功能,用户名密码通过网络传输到服务器认证(用户名不可重复),认证通过后写入账户文件。 1.2.2登陆(认证) 属性:必选 描述:服务器和客户端增加用户密码登陆机制,包含如下流程: ●客户端把接受的用户名密码发送至服务器; ●服务器启动后从配置文件中读取用户信息形成数据表,根据此来验证密码。验证后返回认证结果给客户端(不可一个用户名同时登录) ●如果认证正确,服务器开始接受客户端的命令;认证错误重新认证(3次登陆错误退出) 1.3心跳机制 属性:必选 描述:客户端与服务端之间使用心跳机制,必须完成下列所有情况: ●客户端定时向服务端发送一个数据包(心跳包,内容不限,3秒间隔),证明自己活着; ●服务端显示来自某个IP地址客户端的心跳包; 1.4心跳异常 属性:任选 描述:服务器超过一定的时间没有收到客户端的心跳包(3秒间隔),连续5个包没有接收到则说明客户端出现问题,必须做出如下的处理: ●记录状况; ●断开连接; 1.5聊天功能 属性:必选 描述:两客户端之间能够直接文字通信(类似于QQ聊天), ●能够查询在线列表,具体信息从服务器的链表记录获得; ●可以和别的客户端聊天,发数据采用“用户名后面加数据”方式; 1.6日志文件 属性:任选 描述:服务端通过一个日志文件记录所有客户端连接、命令执行、断开信息(时间,IP地址,执行的命令,心跳包超时等)。 例如:“客户端连接时间 客户端IP地址 客户端的命令 数据包类型(就是上面1.6的data_type) 客户端发送的信息 ”。 2.对性能的规定 本系统在设计方面本着方便、实用的宗旨,性能方面应遵循如下原则: ●执行效率(时间): 软件运行应该尽量高效;避免没有必要的循环处理、重复处理; ●资源损耗(空间):设计尽量节约资源(内存、数组、链表等);不用的资源要及时释放; ●初始化: 变量、数组、内存块、链表节点(其next要置NULL)等都要初始化; ●健壮性:不能出现野指针、内存泄露、数组越界访问等等: ◎申请内存之后,应该立即检查指针值是否为NULL;动态内存的申请与释放必须配对,防止内存泄漏。释放了内存之后,立即将指针设置为NULL,防止产生“野指针”; ◎函数的入参必须进行有效性判断;用户输入、函数返回值(如果用到的话)都要判断; ◎switch-case一定要有default;if-else if等后要有else,除非if满足后返回或退出; ◎数组的下标不要发生“多1”或者“少1”操作。 3.对排版的规定 ●缩进要对齐; ●长行拆分; ●二元操作符的前后应当加空格,包括如下操作符: 赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如"="、"+=" ">="、"<="、"+"、"*"、"%"、"&&"、"||"、"<<", "^" 等; ●空行: ◎结构体 声明之后、每个函数定义结束之后都要加1行空行; ◎逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔; ◎一行代码只做一件事情; ◎"if"、"for"、"while"、"do"等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加 "{ }"; 4.对可维护性的规定 对可维护性的最终要求:别人能够轻松上手你的代码。 ●结构清晰: ◎模块化:对界面(显示)、菜单管理、逻辑管理、文件操作等等代码要独立,必须多个.java文件; ◎封装:一个函数只做一件事,函数功能要单一;一个函数不能超过50行; 避免重复、冗余代码; ◎代码块清晰。 ●变量命名规范,变量名应该具有自明性: ◎常量,枚举和宏定义命名 常量名,宏和枚举值由全大写字母组成,单词间通过下划线来界定; ◎函数的命名: 使用"动词"或者"动词+名词"(动宾词组)的形式,由一个或多个单词组成且以小写字母开头,以后每个单词的首字母必须大写 ◎变量的命名与定义 应当使用"名词"或者"形容词+名词",由一个或多个单词组成且以小写字母开头,以后每个单词之间用下划线隔开。 ●注释充分:变量、函数(包括参数、返回值)、代码功能块、一些复杂算法……等都需要 清晰明了地说明; 5.对个性的规定 把项目做出个性出来。下列各项中有和比人不同之处、或很有创意,即可认为有个性。独立设计的软件,一般都会出现一些个性。参考、抄袭不会出现个性。 ●设计思路:包括软件的整体架构、功能块的设计思路、函数封装等等; ●功能实现:从用户的角度,使用上发现与众不同的地方; ●其它方面;
springmvc框架,HandlerInterceptor拦截器跳转不了
**需求**:用户session十分钟内无请求就会自动删除。无论用户发送什么请求都要被拦截器拦截,并跳转到登录页面。 **问题**:拦截器能拦截到用户的访问行为,可是,跳转语句五法执行。 **我的代码**: HandlerInteceptor: ``` @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { HttpSession session = request.getSession(true); // session中获取用户名信息 Object obj = session.getAttribute(Constant.LOGIN_SESSION); System.out.println("session中的数据:---> " + obj); if (obj == null || "".equals(obj.toString())) { String location = "/login.jsp" ; response.sendRedirect(location); return false; } return true; } ``` springmvc.xml拦截器配置: ``` <!-- Session失效拦截 --> <mvc:interceptors> <!-- 定义拦截器 --> <mvc:interceptor> <!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller --> <mvc:mapping path="/**" /> <!-- 不需要拦截的地址 --> <!-- 直接用ip:端口号可以打开登录页 --> <mvc:exclude-mapping path="/" /> <!-- 可以浏览器地址栏输入login.jsp后缀访问登录页 --> <mvc:exclude-mapping path="/login.jsp" /> <!-- 以下为静态资源,不需要过滤 --> <mvc:exclude-mapping path="/App/**" /> <mvc:exclude-mapping path="/common/**" /> <mvc:exclude-mapping path="/css/**" /> <mvc:exclude-mapping path="/image/**" /> <mvc:exclude-mapping path="/js/**" /> <mvc:exclude-mapping path="/jsp/**" /> <mvc:exclude-mapping path="/kindeditor/**" /> <mvc:exclude-mapping path="/lib/**" /> <bean class="com.ryzh0310.interceptor.SystemSessionInterceptor"></bean> </mvc:interceptor> </mvc:interceptors> ``` web.xml中session删除配置(为了测试我写了最小时间1): ``` <!-- 登录退出session控制 --> <session-config> <session-timeout>1</session-timeout> </session-config> ``` 我的项目结构: ![图片说明](https://img-ask.csdn.net/upload/201712/15/1513299471_920782.png) 先谢谢你们啊 你们说我的重定向路径应该写成request.getContextPath() 而不应该直接写成/login.jsp 我打印了日志了,日志内容是: request.getContextPath() = /login.js 请帮我看下是不是其他问题吧。 我用的是springmvc+mybatis 抱歉,我是这么测试的,结果就是上面那行日志内容 ``` System.out.println("request.getContextPath() = " + request.getContextPath() + "/login.jsp"); ``` 先感谢大家了。 我改了改springmvc.xml配置文件, ``` <!-- Session失效拦截 --> <mvc:interceptors> <!-- 定义拦截器 --> <mvc:interceptor> <!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller --> <mvc:mapping path="/**" /> <!-- 不需要拦截的地址 --> <mvc:exclude-mapping path="/login.jsp" /> <mvc:exclude-mapping path="/user/login" /> <mvc:exclude-mapping path="/App" /> <mvc:exclude-mapping path="/common" /> <mvc:exclude-mapping path="/css" /> <mvc:exclude-mapping path="/image" /> <mvc:exclude-mapping path="/js" /> <mvc:exclude-mapping path="/jsp" /> <mvc:exclude-mapping path="/kindeditor" /> <mvc:exclude-mapping path="/lib" /> <bean class="com.ryzh0310.interceptor.SystemSessionInterceptor"></bean> </mvc:interceptor> </mvc:interceptors> ``` mvn:mapping Path由 "/" 改为 "/**" mvc:exclude-mapping path也由 "/file/**"改成了"/file" **现在的情况是:** 1.可以跳转到登录界面了,然而地址栏上显示的是被拦截的请求所请求的目标界面的url。 2.这样跳转来的登陆界面,根本不能登录,可以输入帐号密码,却不能发送登录请求
大神帮忙 谢谢
/** *############################################################################## * * [ 项目名 ] : 阳光酒店管理系统 * [ 公司名 ] : 清华IT * [ 模块名 ] : 系统登陆窗口 * [ 文件名 ] : Login.java * [ 相关文件 ] : * [ 文件实现功能] : 系统登陆窗口 * [ 作者 ] : 顾俊 * [ 版本 ] : 1.1 * ---------------------------------------------------------------------------- * [ 备注 ] : * ---------------------------------------------------------------------------- * [ 修改记录 ] : * * [ 日 期 ] [版本] [修改人] [修改内容] * 2006/04/02 1.0 顾俊 创建 * 2006/04/06 1.1 顾俊 增加注释 * 2006/04/19 1.2 顾俊 自动记录登录日志 * ##-------------------------------------------------------------------------- * 版权所有(c) 2006-2007, SunshineSOFT Corporation * --------------------------------------------------------------------------## * * [ 函数说明 ] : * * [## public Login() {} ]: * 功能: 构造函数 组建登录窗口 * * [## private void buildCenter() {} ]: * 功能: 组建用户名密码面板,仅类内使用 * * [## private void quit() {} ]: * 功能: 关闭系统函数,仅类内使用 * * [## private void dengLu() {} ]: * 功能: 密码验证通过,进入主操作界面,仅类内使用 * * [ 遗留问题 ] : * *############################################################################## */ package com.sunshine.login; import javax.swing.*; import javax.swing.border.*; import java.awt.*; import java.awt.event.*; import java.sql.*; import com.sunshine.sunsdk.sql.*; import com.sunshine.sunsdk.swing.*; import com.sunshine.sunsdk.system.*; import com.sunshine.mainframe.*; public class Login extends JFrame implements ActionListener, KeyListener, ItemListener, FocusListener { JLabel top, bott; JComboBox cb; JPasswordField pf; JButton bt1, bt2; JPanel panelMain, panelInfo; String clue = " 提 示 : "; int flag = 0; //登记次数记数器 /**=======================================================================** * [## public Login() {} ]: 构造函数 * 参数 :无 * 返回值 :无 * 修饰符 :public * 功能 :组建登录窗口 **=======================================================================** */ public Login() { super("系 统 登 录"); top = new JLabel (new ImageIcon("pic/login_top.gif")); bott = new JLabel(); panelMain = new JPanel(new BorderLayout(10, 10)); bott.setBorder(new LineBorder (new Color(184, 173, 151))); buildCenter(); panelMain.add("North", top); panelMain.add("South", bott); panelMain.add(panelInfo); //加事件监听 bt1.addActionListener(this); bt2.addActionListener(this); bt1.addFocusListener (this); bt2.addFocusListener (this); bt1.addKeyListener (this); bt2.addKeyListener (this); cb.addItemListener (this); cb.addFocusListener(this); pf.addFocusListener(this); cb.addKeyListener (this); pf.addKeyListener (this); //加窗口监听 new WindowAdapter适配器类 this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent we) { quit(); }//End windowClosing }); this.setContentPane(panelMain); //设置窗口面板 this.setSize(350, 235); this.setResizable (false); //设置窗口不可放大缩小 this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); sunswing.setWindowCenter(this); this.setVisible(true); pf.requestFocus(true); //设置焦点给密码框 } /**=======================================================================** * [## private void buildCenter() {} ]: 制作用户名密码面板 * 参数 :无 * 返回值 :无 * 修饰符 :private * 功能 :组建用户名密码面板,仅类内使用 **=======================================================================** */ private void buildCenter() { JLabel lb1, lb2; JPanel pa1, pa2, pa3; lb1 = new JLabel("用 户 名 :"); lb2 = new JLabel("登录密码 :"); cb = new JComboBox(); pf = new TJPasswordField (15); bt1 = new TJButton ("pic/key.gif", "登 录", "登录系统"); bt2 = new TJButton ("pic/exit.gif", "退 出", "关闭系统"); sunsql.initJComboBox (cb, "select userid from pwd where delmark=0"); //定义面板为无部局 panelInfo = new JPanel(null); //加入组件 panelInfo.add(lb1); panelInfo.add(lb2); panelInfo.add(cb); panelInfo.add(pf); panelInfo.add(bt1); panelInfo.add(bt2); lb1.setBounds(50,14,60,20); lb2.setBounds(50,48,60,20); bt1.setBounds(68,77,86,28); bt2.setBounds(186,77,86,28); cb.setBounds (115,12,168,23); pf.setBounds (115,46,170,23); //设定边框线 panelInfo.setBorder(BorderFactory.createTitledBorder("")); } /**=======================================================================** * [## private void quit() {} ]: 系统退出 * 参数 :无 * 返回值 :无 * 修饰符 :private * 功能 :关闭系统函数,仅类内使用 **=======================================================================** */ private void quit() { int flag = 0; String msg = "您 现 在 要 关 闭 系 统 吗 ?"; flag = JOptionPane.showConfirmDialog(null, msg, "提示", JOptionPane.YES_NO_OPTION); if(flag == JOptionPane.YES_OPTION) { this.setVisible(false); System.exit(0); }//End if(flag == JOptionPane.YES_OPTION) return; } /**=======================================================================** * [## private void dengLu() {} ]: 系统登录 * 参数 :无 * 返回值 :无 * 修饰符 :private * 功能 :密码验证通过,进入主操作界面,仅类内使用 **=======================================================================** */ private void dengLu() { String user = cb.getSelectedItem() + ""; String pwd = String.valueOf(pf.getPassword()); String code = "select pwd,puis from pwd where delmark=0 and userid='" + user + "'"; ResultSet rs = sunsql.executeQuery (code); try { if(rs.next()) { //用户名存在 if(pwd.equals(rs.getString(1))) { bott.setText(clue + "登录成功,正在进入系统 ..."); String puis = rs.getString(2); //获得操作员权限 boolean flag = Journal.writeJournalInfo(user, "登录本系统", Journal.TYPE_LG); if(flag) { //记录日志 new com.sunshine.mainframe.HotelFrame(user, puis); //进入主程序窗口(用户名, 权限) this.setVisible(false); }else { String msg = "写日志错误,请与系统管理员联系 ..."; JOptionPane.showMessageDialog(null, msg, "错误", JOptionPane.ERROR_MESSAGE); System.exit(0); } } else { bott.setText(clue + "用户 [ " + user + " ] 的密码不正确,请重新输入 ..."); flag++; if(flag == 3) { //三次密码验证 JOptionPane.showMessageDialog(null, "您不是本系统的管理员,系统关闭 ...", "警告", JOptionPane.ERROR_MESSAGE); System.exit(0); }//End if(flag == 3) return; }//End if(pwd.equals(rs.getString(1))) } else { bott.setText(clue + "用户ID [ " + user + " ] 不存在 ..."); }//End if(rs.next()) } catch (Exception ex) { ex.printStackTrace(); }//End try } /**=======================================================================** * ActionListener 监听 **=======================================================================** */ public void actionPerformed (ActionEvent ae) { //动作监听 if(ae.getSource() == bt1) { //登录按键 dengLu(); } else { quit(); }//End if(ae.getSource() == bt1) } /**=======================================================================** * ItemListener 监听 **=======================================================================** */ public void itemStateChanged (ItemEvent ie) { pf.requestFocus(true); } /**=======================================================================** * KeyListener 监听 **=======================================================================** */ public void keyPressed (KeyEvent ke) { //键盘按下监听 int key = ke.getKeyCode(); if(key == KeyEvent.VK_ENTER) { if(ke.getSource() == cb) pf.requestFocus(true); //将焦点从用户名给密码 if(pf.getPassword().length > 0) dengLu(); //按Enter键登录系统 } else if(key == KeyEvent.VK_ESCAPE) { //按ESC键退出系统 quit(); }//End if } public void keyReleased (KeyEvent ke) { //键盘释放监听 } public void keyTyped (KeyEvent ke) { //按键型监听 } /**=======================================================================** * FocusListener 监听 **=======================================================================** */ public void focusGained (FocusEvent fe) { //焦点监听 if(fe.getSource() == cb) //窗口最下方的功能提示 bott.setText(clue + "请选择操作员名称 ..."); else if(fe.getSource() == pf) bott.setText(clue + "请输入登录密码 ..."); else if(fe.getSource() == bt1) bott.setText(clue + "登录系统 ..."); else if(fe.getSource() == bt2) bott.setText(clue + "退出系统 ..."); } public void focusLost (FocusEvent fe) { //失去焦点监听 } /**=======================================================================** * [## public static void main(String sd[]) {} ]: 主函数 * 参数 :String sd[] * 返回值 :无 * 修饰符 :public static * 功能 :程序入口 **=======================================================================** */ public static void main(String sd[]) { sunswing.setWindowStyle(sunini.getIniKey("Sys_style").charAt(0)); new FStartWindow ("pic/Login.gif", new Frame(), 1200); new Login(); } } 错误提示: Load CONFIG.INI is false!! The [ Sys_style ] Key is not exist!! Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0 at java.lang.String.charAt(Unknown Source) at com.sunshine.login.Login.main(Login.java:313)
求大神帮忙 谢谢
/** *############################################################################## * * [ 项目名 ] : 阳光酒店管理系统 * [ 公司名 ] : 清华IT * [ 模块名 ] : 系统登陆窗口 * [ 文件名 ] : Login.java * [ 相关文件 ] : * [ 文件实现功能] : 系统登陆窗口 * [ 作者 ] : 顾俊 * [ 版本 ] : 1.1 * ---------------------------------------------------------------------------- * [ 备注 ] : * ---------------------------------------------------------------------------- * [ 修改记录 ] : * * [ 日 期 ] [版本] [修改人] [修改内容] * 2006/04/02 1.0 顾俊 创建 * 2006/04/06 1.1 顾俊 增加注释 * 2006/04/19 1.2 顾俊 自动记录登录日志 * ##-------------------------------------------------------------------------- * 版权所有(c) 2006-2007, SunshineSOFT Corporation * --------------------------------------------------------------------------## * * [ 函数说明 ] : * * [## public Login() {} ]: * 功能: 构造函数 组建登录窗口 * * [## private void buildCenter() {} ]: * 功能: 组建用户名密码面板,仅类内使用 * * [## private void quit() {} ]: * 功能: 关闭系统函数,仅类内使用 * * [## private void dengLu() {} ]: * 功能: 密码验证通过,进入主操作界面,仅类内使用 * * [ 遗留问题 ] : * *############################################################################## */ package com.sunshine.login; import javax.swing.*; import javax.swing.border.*; import java.awt.*; import java.awt.event.*; import java.sql.*; import com.sunshine.sunsdk.sql.*; import com.sunshine.sunsdk.swing.*; import com.sunshine.sunsdk.system.*; import com.sunshine.mainframe.*; public class Login extends JFrame implements ActionListener, KeyListener, ItemListener, FocusListener { JLabel top, bott; JComboBox cb; JPasswordField pf; JButton bt1, bt2; JPanel panelMain, panelInfo; String clue = " 提 示 : "; int flag = 0; //登记次数记数器 /**=======================================================================** * [## public Login() {} ]: 构造函数 * 参数 :无 * 返回值 :无 * 修饰符 :public * 功能 :组建登录窗口 **=======================================================================** */ public Login() { super("系 统 登 录"); top = new JLabel (new ImageIcon("pic/login_top.gif")); bott = new JLabel(); panelMain = new JPanel(new BorderLayout(10, 10)); bott.setBorder(new LineBorder (new Color(184, 173, 151))); buildCenter(); panelMain.add("North", top); panelMain.add("South", bott); panelMain.add(panelInfo); //加事件监听 bt1.addActionListener(this); bt2.addActionListener(this); bt1.addFocusListener (this); bt2.addFocusListener (this); bt1.addKeyListener (this); bt2.addKeyListener (this); cb.addItemListener (this); cb.addFocusListener(this); pf.addFocusListener(this); cb.addKeyListener (this); pf.addKeyListener (this); //加窗口监听 new WindowAdapter适配器类 this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent we) { quit(); }//End windowClosing }); this.setContentPane(panelMain); //设置窗口面板 this.setSize(350, 235); this.setResizable (false); //设置窗口不可放大缩小 this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); sunswing.setWindowCenter(this); this.setVisible(true); pf.requestFocus(true); //设置焦点给密码框 } /**=======================================================================** * [## private void buildCenter() {} ]: 制作用户名密码面板 * 参数 :无 * 返回值 :无 * 修饰符 :private * 功能 :组建用户名密码面板,仅类内使用 **=======================================================================** */ private void buildCenter() { JLabel lb1, lb2; JPanel pa1, pa2, pa3; lb1 = new JLabel("用 户 名 :"); lb2 = new JLabel("登录密码 :"); cb = new JComboBox(); pf = new TJPasswordField (15); bt1 = new TJButton ("pic/key.gif", "登 录", "登录系统"); bt2 = new TJButton ("pic/exit.gif", "退 出", "关闭系统"); sunsql.initJComboBox (cb, "select userid from pwd where delmark=0"); //定义面板为无部局 panelInfo = new JPanel(null); //加入组件 panelInfo.add(lb1); panelInfo.add(lb2); panelInfo.add(cb); panelInfo.add(pf); panelInfo.add(bt1); panelInfo.add(bt2); lb1.setBounds(50,14,60,20); lb2.setBounds(50,48,60,20); bt1.setBounds(68,77,86,28); bt2.setBounds(186,77,86,28); cb.setBounds (115,12,168,23); pf.setBounds (115,46,170,23); //设定边框线 panelInfo.setBorder(BorderFactory.createTitledBorder("")); } /**=======================================================================** * [## private void quit() {} ]: 系统退出 * 参数 :无 * 返回值 :无 * 修饰符 :private * 功能 :关闭系统函数,仅类内使用 **=======================================================================** */ private void quit() { int flag = 0; String msg = "您 现 在 要 关 闭 系 统 吗 ?"; flag = JOptionPane.showConfirmDialog(null, msg, "提示", JOptionPane.YES_NO_OPTION); if(flag == JOptionPane.YES_OPTION) { this.setVisible(false); System.exit(0); }//End if(flag == JOptionPane.YES_OPTION) return; } /**=======================================================================** * [## private void dengLu() {} ]: 系统登录 * 参数 :无 * 返回值 :无 * 修饰符 :private * 功能 :密码验证通过,进入主操作界面,仅类内使用 **=======================================================================** */ private void dengLu() { String user = cb.getSelectedItem() + ""; String pwd = String.valueOf(pf.getPassword()); String code = "select pwd,puis from pwd where delmark=0 and userid='" + user + "'"; ResultSet rs = sunsql.executeQuery (code); try { if(rs.next()) { //用户名存在 if(pwd.equals(rs.getString(1))) { bott.setText(clue + "登录成功,正在进入系统 ..."); String puis = rs.getString(2); //获得操作员权限 boolean flag = Journal.writeJournalInfo(user, "登录本系统", Journal.TYPE_LG); if(flag) { //记录日志 new com.sunshine.mainframe.HotelFrame(user, puis); //进入主程序窗口(用户名, 权限) this.setVisible(false); }else { String msg = "写日志错误,请与系统管理员联系 ..."; JOptionPane.showMessageDialog(null, msg, "错误", JOptionPane.ERROR_MESSAGE); System.exit(0); } } else { bott.setText(clue + "用户 [ " + user + " ] 的密码不正确,请重新输入 ..."); flag++; if(flag == 3) { //三次密码验证 JOptionPane.showMessageDialog(null, "您不是本系统的管理员,系统关闭 ...", "警告", JOptionPane.ERROR_MESSAGE); System.exit(0); }//End if(flag == 3) return; }//End if(pwd.equals(rs.getString(1))) } else { bott.setText(clue + "用户ID [ " + user + " ] 不存在 ..."); }//End if(rs.next()) } catch (Exception ex) { ex.printStackTrace(); }//End try } /**=======================================================================** * ActionListener 监听 **=======================================================================** */ public void actionPerformed (ActionEvent ae) { //动作监听 if(ae.getSource() == bt1) { //登录按键 dengLu(); } else { quit(); }//End if(ae.getSource() == bt1) } /**=======================================================================** * ItemListener 监听 **=======================================================================** */ public void itemStateChanged (ItemEvent ie) { pf.requestFocus(true); } /**=======================================================================** * KeyListener 监听 **=======================================================================** */ public void keyPressed (KeyEvent ke) { //键盘按下监听 int key = ke.getKeyCode(); if(key == KeyEvent.VK_ENTER) { if(ke.getSource() == cb) pf.requestFocus(true); //将焦点从用户名给密码 if(pf.getPassword().length > 0) dengLu(); //按Enter键登录系统 } else if(key == KeyEvent.VK_ESCAPE) { //按ESC键退出系统 quit(); }//End if } public void keyReleased (KeyEvent ke) { //键盘释放监听 } public void keyTyped (KeyEvent ke) { //按键型监听 } /**=======================================================================** * FocusListener 监听 **=======================================================================** */ public void focusGained (FocusEvent fe) { //焦点监听 if(fe.getSource() == cb) //窗口最下方的功能提示 bott.setText(clue + "请选择操作员名称 ..."); else if(fe.getSource() == pf) bott.setText(clue + "请输入登录密码 ..."); else if(fe.getSource() == bt1) bott.setText(clue + "登录系统 ..."); else if(fe.getSource() == bt2) bott.setText(clue + "退出系统 ..."); } public void focusLost (FocusEvent fe) { //失去焦点监听 } /**=======================================================================** * [## public static void main(String sd[]) {} ]: 主函数 * 参数 :String sd[] * 返回值 :无 * 修饰符 :public static * 功能 :程序入口 **=======================================================================** */ public static void main(String sd[]) { sunswing.setWindowStyle(sunini.getIniKey("Sys_style").charAt(0)); new FStartWindow ("pic/Login.gif", new Frame(), 1200); new Login(); } } 下面是错误提示 The [ Sys_style ] Key is not exist!! Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0 at java.lang.String.charAt(Unknown Source) at com.sunshine.login.Login.main(Login.java:313)
springboot下 shiro + redis 验证后无动作
shiro + redis 由于shiro之前没有用过 , 这次使用也是比较仓促 希望大佬们多多帮组 > 跪谢 可以在redis中看到 session的存储 验证后并不跳转到首页 附上 代码 1. 目录结构 ![图片说明](https://img-ask.csdn.net/upload/201904/26/1556279189_984298.jpg) 2. shiroConfig.java ``` import com.chenzs.common.mapper.RoleMapper; import org.apache.shiro.authc.credential.HashedCredentialsMatcher; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; import org.crazycake.shiro.RedisCacheManager; import org.crazycake.shiro.RedisManager; import org.crazycake.shiro.RedisSessionDAO; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.annotation.Resource; import java.util.LinkedHashMap; import java.util.Map; /** * @author ChenZS */ @Configuration public class ShiroConfig { @Resource private RoleMapper roleMapper; @Bean public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { System.err.println("ShiroConfiguration.shirFilter() ---> start "); ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); //拦截器. Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>(); // 配置不会被拦截的链接 顺序判断 // filterChainDefinitionMap.put("/css/**", "authc"); // filterChainDefinitionMap.put("/js/**", "authc"); // filterChainDefinitionMap.put("/img/**", "authc"); // filterChainDefinitionMap.put("/components/**", "authc"); // filterChainDefinitionMap.put("/favicon.ico", "authc"); //配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了 // filterChainDefinitionMap.put("/logout", "logout"); //<!-- 过滤链定义,从上向下顺序执行,一般将/**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了; //<!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问--> // filterChainDefinitionMap.put("/**", "authc"); // 如果不设置默认会自动寻找Web工程根目录下的"/login"页面 shiroFilterFactoryBean.setLoginUrl("/login"); // // 登录成功后要跳转的链接 shiroFilterFactoryBean.setSuccessUrl("/blog"); //未授权界面; shiroFilterFactoryBean.setUnauthorizedUrl("/404"); filterChainDefinitionMap.put("/static/**", "anon"); // filterChainDefinitionMap.put("/", "perms[admin]"); // filterChainDefinitionMap.put("/user/**", "authc"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); // //从数据库获取 对应角色 // List<Role> list = roleMapper.selectByExample(null); // // for (SysPermissionInit sysPermissionInit : list) { // filterChainDefinitionMap.put(sysPermissionInit.getUrl(), // sysPermissionInit.getPermissionInit()); // } // // shiroFilterFactoryBean // .setFilterChainDefinitionMap(filterChainDefinitionMap); System.out.println("Shiro拦截器工厂类注入成功"); return shiroFilterFactoryBean; } /** * 凭证匹配器 * (由于我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了 * ) * @return */ @Bean public HashedCredentialsMatcher hashedCredentialsMatcher(){ HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher(); //散列算法:这里使用MD5算法; hashedCredentialsMatcher.setHashAlgorithmName("md5"); //散列的次数,比如散列两次,相当于 md5(md5("")); hashedCredentialsMatcher.setHashIterations(1); return hashedCredentialsMatcher; } @Bean public MyShiroRealm myShiroRealm(){ MyShiroRealm myShiroRealm = new MyShiroRealm(); myShiroRealm.setCredentialsMatcher(hashedCredentialsMatcher()); return myShiroRealm; } @Bean public SecurityManager securityManager(){ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); //设置realm securityManager.setRealm(myShiroRealm()); // 自定义缓存实现 使用redis securityManager.setCacheManager(cacheManager()); // 自定义session管理 使用redis securityManager.setSessionManager(sessionManager()); return securityManager; } /** * 开启shiro aop注解支持. * 使用代理方式;所以需要开启代码支持; * @param securityManager * @return */ @Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){ AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); return authorizationAttributeSourceAdvisor; } /** * cacheManager 缓存 redis实现 * 使用的是shiro-redis开源插件 * * @return */ public RedisCacheManager cacheManager() { RedisCacheManager redisCacheManager = new RedisCacheManager(); redisCacheManager.setRedisManager(redisManager()); return redisCacheManager; } /** * 配置shiro redisManager * 使用的是shiro-redis开源插件 * * @return */ public RedisManager redisManager() { RedisManager redisManager = new RedisManager(); redisManager.setHost("192.168.0.12"); redisManager.setPort(6379); redisManager.setExpire(1800 * 60 *30);// 配置缓存过期时间 redisManager.setTimeout(0); redisManager.setPassword("123456789+"); // redisManager.setPassword(password); return redisManager; } /** * Session Manager * 使用的是shiro-redis开源插件 */ @Bean public DefaultWebSessionManager sessionManager() { DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); sessionManager.setSessionDAO(redisSessionDAO()); return sessionManager; } // @Bean("sessionManager") // public SessionManager sessionManager(ShiroSessionDao shiroSessionDa){ // DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); // sessionManager.setGlobalSessionTimeout(60 * 60 * 1000); // sessionManager.setSessionValidationSchedulerEnabled(true); // sessionManager.setSessionIdUrlRewritingEnabled(false); // sessionManager.setSessionDAO(shiroSessionDao); // /** 此注释代码 就是将JSESSIONID变成自定义名称 WEBJSESSIONID // sessionManager.setSessionIdCookieEnabled(true); // SimpleCookie cookie = new SimpleCookie("WEBJSESSIONID"); // cookie.setHttpOnly(true); // cookie.setMaxAge(60 * 60 * 1000); // sessionManager.setSessionIdCookie(cookie); **/ // return sessionManager; // } /** * RedisSessionDAO shiro sessionDao层的实现 通过redis * 使用的是shiro-redis开源插件 */ @Bean public RedisSessionDAO redisSessionDAO() { RedisSessionDAO redisSessionDAO = new RedisSessionDAO(); redisSessionDAO.setRedisManager(redisManager()); // // DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); // sessionManager.setGlobalSessionTimeout(60 * 60 * 1000); // sessionManager.setSessionValidationSchedulerEnabled(true); // sessionManager.setSessionIdUrlRewritingEnabled(false); // /** 此注释代码 就是将JSESSIONID变成自定义名称 WEBJSESSIONID */ // sessionManager.setSessionIdCookieEnabled(true); // SimpleCookie cookie = new SimpleCookie("WEBJSESSIONID"); // cookie.setHttpOnly(true); // cookie.setMaxAge(60 * 60 * 1000); // sessionManager.setSessionIdCookie(cookie); return redisSessionDAO; } } ``` ------ 3. MyShiroRealm.java ``` import com.chenzs.common.model.Role; import com.chenzs.common.model.User; import com.chenzs.common.service.RoleService; import com.chenzs.common.service.UserService; import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import javax.annotation.Resource; import java.io.Serializable; import java.util.List; /** * @author ChenZS */ public class MyShiroRealm extends AuthorizingRealm{ @Resource private UserService userService; @Resource private RoleService roleService; @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { System.out.println("权限配置-->MyShiroRealm.doGetAuthorizationInfo()"); SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); // User user = (User) principals.getPrimaryPrincipal(); // List<Role> roleList = roleService.listRolesByUser(user); // TODO 后续应根据用户id 获取对应的权限,而不是现在的所有权限 ( 现在只有一种权限 --> admin ) List<Role> roleList = roleService.getListRole(); for (Role role : roleList) { authorizationInfo.addRole(role.getRole()); } return authorizationInfo; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { System.err.println("MyShiroRealm.doGetAuthenticationInfo() --> 开始权限验证!"); //获取用户的输入的账号. String username = (String) token.getPrincipal(); System.out.println(token.getCredentials()); //通过username从数据库中查找 User对象,如果找到,没找到. //实际项目中,这里可以根据实际情况做缓存,如果不做,Shiro自己也是有时间间隔机制,2分钟内不会重复执行该方法 User user = userService.getUser(username); if (user.getId() == null) { return null; } // User user = response.getData(); if (!user.getStatus()) { throw new LockedAccountException(username + "账号未激活或账号被封禁!"); } SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo( user, user.getPassword(), getName() ); return authenticationInfo; } } ``` 4. loginController .java ``` import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.IncorrectCredentialsException; import org.apache.shiro.authc.LockedAccountException; import org.apache.shiro.authc.UnknownAccountException; import org.apache.shiro.authc.UsernamePasswordToken; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller @RequestMapping("/login") public class LoginController { private static final String PATH = "login/"; @RequestMapping("") public String index() { return PATH + "index"; } /** * 登录提交 * @param model * @return * @throws Exception */ @PostMapping("/login_info") public String login(@RequestParam(required = true, value = "userName") String userName,@RequestParam(required = true, value = "password") String password, Model model) throws Exception { //1、验证用户名和密码 org.apache.shiro.subject.Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(userName, password); String msg = "OK"; try { subject.login(usernamePasswordToken); // return "myhome/index"; } catch (UnknownAccountException e) { System.err.println("UnknownAccountException -- > 账号不存在:"); msg = "账号不存在!"; } catch (IncorrectCredentialsException e) { System.err.println("IncorrectCredentialsException -- > 密码不正确:"); msg = "密码不正确!"; } catch (LockedAccountException e) { System.err.println("LockedAccountException -- > 账号被锁定"); msg = "账号被锁定!"; } catch (Exception e) { System.err.println(e.getMessage()); } model.addAttribute("msg", msg); // return PATH + "index"; return "myhome/index"; } } ``` wechat: chen1749144759 求大佬 帮助 真的没有赏金了
java读取txt文件中的数据
代码有错误,但是自己搜了一下感觉没毛病啊求大佬们帮忙看下 ![图片说明](https://img-ask.csdn.net/upload/201812/29/1546083350_693281.png) public void actionPerformed(ActionEvent e){ java.awt.Dimension dim1=new java.awt.Dimension(1500, 1000); java.awt.Dimension dim2=new java.awt.Dimension(100, 40); Map<String, String> map = new HashMap<String , String>(); String path = "D:\\test.txt"; File file = new File(path); BufferedReader bReader = new BufferedReader(new FileReader(file)); String line = ""; String pc[] = null; String key = ""; String value = ""; while ((line = bReader.readLine()) != null) { pc = line.split(","); key = pc[0]; value = pc[1]; map.put(key, value); } Set <String> keySet = map.keySet(); //利用get方法来获取账号和密码对象的文本信息 for (String string2 : keySet) if(zh.getText().equals(string2)&mm.getText().equals(map.get(string2))){ init2(); login1.dispose();//用dispose关闭登录界面 } else { final JFrame tips = new JFrame("提示"); //选择布局类型,定义流式布局的对象,并且设置每个组件之间距离为20 FlowLayout f1 = new FlowLayout(FlowLayout.CENTER,20,20); tips.setLayout(f1); JLabel tishi = new JLabel("请正确输入用户名及对应的密码!"); tips.setBounds(220, 8, 50, 300); tips.add(tishi); JButton yes = new JButton(); yes.setText("确认"); yes.setBounds(220, 60, 50, 300); tips.add(yes); tips.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); tips.setLocationRelativeTo(null);//设置窗口位于屏幕居中位置 tips.setSize(300, 170); tips.setResizable(true); tips.setVisible(true);//设置窗体可见 yes.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { tips.dispose();//销毁登陆窗口 } }); } }
ext editorGrid 问题
我从网上看到editorGrid的一个实例,就下了下来,想学习一下,结果出现以下问题 添加用户时,id先是和最后一个id一样后来又成了始终为1了 显示数据时,总有和数据条数相同书目的空白条 [img]http://dl.iteye.com/upload/attachment/175952/13b30933-c726-36ee-b3c4-57016d5dde4b.jpg[/img] [code="java"]/** * 在线通讯录制作: 刘长炯 beansoft@126.com http://beansoft.blogjava.net/ 2008年5月 */ // 定义一个用户对象,这样便于我们动态的添加记录,虽然也可以设置成匿名内置对象 var User = Ext.data.Record.create([ // 下面的 "username" 匹配读到的标签名称 { name : 'id', type : 'int' }, { name : 'user' }, { name : 'password' } ]); /** * 创建文本列模型. * * @param {ID} * _id * @param {列名显示文本} * _header * @param {数据ID} * _dataIndex * @param {宽度} * _width 可选 * @param {是否为空} * notBlank 可选 * @param {渲染器} * _renderer 可选 * @param {自定义修改器} * _editor 可选 */ function createTextColumn(_id, _header, _dataIndex, _width, notBlank, _renderer, _editor) { var object = { id : _id, header : _header, dataIndex : _dataIndex, width : _width }; if (_editor) { object.editor = _editor; } else if (notBlank == true) { object.editor = new Ext.form.TextField({ allowBlank : false // 不能为空 }); } else { object.editor = new Ext.form.TextField(); } if (_renderer) { object.renderer = _renderer; } return object; } /** * 快速创建文本列 * * @param {数据ID} * _dataIndex * @param {列名显示文本} * _header * @param {宽度} * _width 可选 * @return {列对象} */ function qCreateColumn(_dataIndex, _header, _width) { return createTextColumn(_dataIndex, _header, _dataIndex, _width); } Ext.onReady(function() { Ext.QuickTips.init(); // 格式化日期显示 function formatDate(value) { return value ? value.dateFormat('Y, M d') : ''; } // 格式化性别显示,这是个 renderer, 渲染器 function formatSex(value) { return value ? "男" : "女"; } // 弄个缩写的别名 var fm = Ext.form; // 列模型定义了表格所有列的信息, // dataIndex 将特定的列映射到数据源(Data Store)中的数据列(在后面创建) var cm = new Ext.grid.ColumnModel([ { id : 'id', header : "编号", dataIndex : 'id', width : 50 }, /* * { id : 'username', header : "姓名", dataIndex : 'username', width : * 250, editor : new fm.TextField({ allowBlank : false // 不能为空 }) } */ createTextColumn('username', '姓名', 'user', 50, true), createTextColumn('password', '密码', 'password', 50, true) ]); // 默认情况下列是可排序的 cm.defaultSortable = true; // 创建 Data Store var store = new Ext.data.Store({ // 使用 HTTP 加载 url : 'nb_xml.jsp', // 因为返回值是 XML, 所以我们创建一个解析器 reader : new Ext.data.XmlReader({ // 记录必须包含 "user" 标签 record : 'user' }, User), sortInfo : { field : 'username', direction : 'ASC' }// 排序信息 }); // 创建编辑器表格 var grid = new Ext.grid.EditorGridPanel({ store : store, cm : cm, renderTo : 'editor-grid', width : 500, height : 300, autoExpandColumn : 'username', title : '通讯录',// 标题 frame : true, clicksToEdit : 2,// 设置点击几次才可编辑 selModel : new Ext.grid.RowSelectionModel({ singleSelect : false }),// 设置单行选中模式, 否则将无法删除数据 // 顶部工具栏按钮 tbar : [ { text : '添加用户', iconCls : 'add',// 按钮图标的CSS名称 handler : function() {// 点击按钮执行的操作 var n = grid.getStore().getCount();// 获得总行数 // 显示等待对话框 Ext.Msg.wait("请等候", "添加用户", "操作进行中..."); // 调用 DWR 进行添加操作, 操作完成后调用方法来更新界面 JUserManagerNB.addUser('user' + n , function(data) { if (data) { Ext.Msg.hide();// 隐藏对话框 var p = new User({ id : data, username : 'user'+n , password:'user' }); grid.stopEditing();// 停止编辑 store.insert(n, p);// 插入到最后一行 grid.startEditing(n, 1);// 开始编辑1单元格 } }); } }, { text : '导出为Excel格式', iconCls : 'details', handler : function() { document.location = "nb_excel.jsp"; } }, { text : '删除所选', iconCls : 'remove', handler : function() { var record = grid.getSelectionModel().getSelected();// 返回值为 // Record 类型 if (!record) { Ext.Msg.alert("提示", "请先选择要删除的行!"); return; } // 弹出对话框警告 if (record) { Ext.MessageBox.confirm('确认删除', '你真的要删除所选用户吗?', function(btn) { if (btn == 'yes') {// 选中了是按钮 // 调用 DWR, 执行结果成功时方删除所有数据 // 显示等待对话框 Ext.Msg.wait("请等候", "删除用户", "操作进行中..."); JUserManagerNB.removeUser(record.get("id"), function(data) { if (data) { // 更新界面, 来真正删除数据 store.remove(record); Ext.Msg.hide();// 隐藏对话框 } else { Ext.Msg.alert("出错了!", "单个用户数据删除失败!"); } }); } }); } } } ] }); // 单元格编辑后事件处理 grid.on("afteredit", afterEdit, grid); // 事件处理函数 function afterEdit(e) { var record = e.record;// 被编辑的记录 // 显示等待对话框 Ext.Msg.wait("请等候", "修改中", "操作进行中..."); // 调用 DWR, 执行结果成功时方删除所有数据 JUserManagerNB.editUser(record.get("id"), e.field, e.value, function(data) { if (data) { // 更新界面, 来真正删除数据 // Ext.Msg.alert('您成功修改了用户信息', "被修改的用户是:" // + e.record.get("username") + "\n 修改的字段是:" // + e.field);// 取得用户名 Ext.Msg.hide();// 隐藏对话框 // // 更改最后更新的时间,同步到后台 // JUserManagerNB.editUser(record.get("id"), 'modified', // (new Date()).clearTime()); // 更新界面 record.set('modified', (new Date()).clearTime()); } else { Ext.Msg.alert("出错了!", "修改数据失败,将重置为修改前的值!", function() { record.set(e.field, e.originalValue); }); } }); }; // 触发数据加载 store.load(); }); [/code]
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
阿里面试官问我:如何设计秒杀系统?我的回答让他比起大拇指
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图和个人联系方式,欢迎Star和指教 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n...
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
Android性能优化(4):UI渲染机制以及优化
文章目录1. 渲染机制分析1.1 渲染机制1.2 卡顿现象1.3 内存抖动2. 渲染优化方式2.1 过度绘制优化2.1.1 Show GPU overdraw2.1.2 Profile GPU Rendering2.2 卡顿优化2.2.1 SysTrace2.2.2 TraceView 在从Android 6.0源码的角度剖析View的绘制原理一文中,我们了解到View的绘制流程有三个步骤,即m...
微服务中的Kafka与Micronaut
今天,我们将通过Apache Kafka主题构建一些彼此异步通信的微服务。我们使用Micronaut框架,它为与Kafka集成提供专门的库。让我们简要介绍一下示例系统的体系结构。我们有四个微型服务:订单服务,行程服务,司机服务和乘客服务。这些应用程序的实现非常简单。它们都有内存存储,并连接到同一个Kafka实例。 我们系统的主要目标是为客户安排行程。订单服务应用程序还充当网关。它接收来自客户的请求...
致 Python 初学者们!
作者| 许向武 责编 | 屠敏 出品 | CSDN 博客 前言 在 Python 进阶的过程中,相信很多同学应该大致上学习了很多 Python 的基础知识,也正在努力成长。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 Python 这门编程语言,从2009年开始单一使用 Python 应对所有的开发工作,直至今...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip installselenium -ihttps://pypi.tuna.tsinghua.edu.cn/simple/ ...
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca...
SpringBoot2.x系列教程(三十六)SpringBoot之Tomcat配置
Spring Boot默认内嵌的Tomcat为Servlet容器,关于Tomcat的所有属性都在ServerProperties配置类中。同时,也可以实现一些接口来自定义内嵌Servlet容器和内嵌Tomcat等的配置。 关于此配置,网络上有大量的资料,但都是基于SpringBoot1.5.x版本,并不适合当前最新版本。本文将带大家了解一下最新版本的使用。 ServerProperties的部分源...
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o...
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ...... ...
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学...
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合...
爬取薅羊毛网站百度云资源
这是疫情期间无聊做的爬虫, 去获取暂时用不上的教程 import threading import time import pandas as pd import requests import re from threading import Thread, Lock # import urllib.request as request # req=urllib.request.Requ...
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的内功,从而进阶成为一名真正意义上的大神。与此同时,希望这些文章能够帮助到更多的读者,让大家在学习的路上不再寂寞、空虚和冷。 ...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名...
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计...
HTML5适合的情人节礼物有纪念日期功能
前言 利用HTML5,css,js实现爱心树 以及 纪念日期的功能 网页有播放音乐功能 以及打字倾诉感情的画面,非常适合情人节送给女朋友 具体的HTML代码 具体只要修改代码里面的男某某和女某某 文字段也可自行修改,还有代码下半部分的JS代码需要修改一下起始日期 注意月份为0~11月 也就是月份需要减一。 当然只有一部分HTML和JS代码不够运行的,文章最下面还附加了完整代码的下载地址 &lt;!...
Python新型冠状病毒疫情数据自动爬取+统计+发送报告+数据屏幕(三)发送篇
今天介绍的项目是使用 Itchat 发送统计报告 项目功能设计: 定时爬取疫情数据存入Mysql 进行数据分析制作疫情报告 使用itchat给亲人朋友发送分析报告 基于Django做数据屏幕 使用Tableau做数据分析 来看看最终效果 目前已经完成,预计2月12日前更新 使用 itchat 发送数据统计报告 itchat 是一个基于 web微信的一个框架,但微信官方并不允许使用这...
python沙箱逃逸
沙箱逃逸是CTF和实际场景中经常遇到的一种情况。需要利用python的特性来实现逃逸。本文详细介绍了关于python逃逸的基础以及一些构造payload方法,并且附加习题提供练习。
作为程序员的我,大学四年一直自学,全靠这些实用工具和学习网站!
我本人因为高中沉迷于爱情,导致学业荒废,后来高考,毫无疑问进入了一所普普通通的大学,实在惭愧???? 我又是那么好强,现在学历不行,没办法改变的事情了,所以,进入大学开始,我就下定决心,一定要让自己掌握更多的技能,尤其选择了计算机这个行业,一定要多学习技术。 在进入大学学习不久后,我就认清了一个现实:我这个大学的整体教学质量和学习风气,真的一言难尽,懂的人自然知道怎么回事? 怎么办?我该如何更好的提升自...
新来个技术总监,禁止我们使用Lombok!
我有个学弟,在一家小型互联网公司做Java后端开发,最近他们公司新来了一个技术总监,这位技术总监对技术细节很看重,一来公司之后就推出了很多"政策",比如定义了很多开发规范、日志规范、甚至是要求大家统一使用某一款IDE。 但是这些都不是我这个学弟和我吐槽的点,他真正和我吐槽的是,他很不能理解,这位新来的技术总监竟然禁止公司内部所有开发使用Lombok。但是又没给出十分明确的,可以让人信服的理由。 于...
教你如何编写第一个简单的爬虫
很多人知道爬虫,也很想利用爬虫去爬取自己想要的数据,那么爬虫到底怎么用呢?今天就教大家编写一个简单的爬虫。 下面以爬取笔者的个人博客网站为例获取第一篇文章的标题名称,教大家学会一个简单的爬虫。 第一步:获取页面 #!/usr/bin/python # coding: utf-8 import requests #引入包requests link = "http://www.santostang....
相关热词 c#导入fbx c#中屏蔽键盘某个键 c#正态概率密度 c#和数据库登陆界面设计 c# 高斯消去法 c# codedom c#读取cad文件文本 c# 控制全局鼠标移动 c# temp 目录 bytes初始化 c#
立即提问