《信息领域热词分析》中的六大质量属性
《信息领域热词分析》中出现的六大质量属性
日期:2020/3/5
我编写的这个登录来解释安全性。
这个的验证码:
@WebServlet("/ServletDemo4")
public class ServletDemo4 extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
//这个方法实现验证码的生成
BufferedImage bi = new BufferedImage(68, 22, BufferedImage.TYPE_INT_RGB);//创建图像缓冲区
Graphics g = bi.getGraphics(); //通过缓冲区创建一个画布
Color c = new Color(255, 255, 255); //创建颜色
/*根据背景画了一个矩形框
*/
g.setColor(c);//为画布创建背景颜色
g.fillRect(0, 0, 68, 22); //fillRect:填充指定的矩形
// X和Y用于指定矩形左上角也就是相对于原点的位置,width和height用于指定矩形的宽和高。
char[] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();//转化为字符型的数组
Random r = new Random();
int len = ch.length;
int index; //index用于存放随机数字
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++) {
index = r.nextInt(len);//产生随机数字
g.setColor(new Color(r.nextInt(88), r.nextInt(188), r.nextInt(255))); //设置颜色随机
g.drawString(ch[index] + "", (i * 15) + 3, 18);//画数字以及数字的位置
sb.append(ch[index]);
}
request.getSession().setAttribute("piccode", sb.toString()); //将数字保留在session中,便于后续的使用
ImageIO.write(bi, "JPG", response.getOutputStream());
}
}
@WebServlet("/ServletDemo5")
public class ServletDemo5 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
//用于验证验证码
{
String piccode = (String) request.getSession().getAttribute("piccode");
String checkCode = request.getParameter("checkCode"); //取值
//checkCode=checkCode.toUpperCase(); //把字符全部转换为大写的(此语句可以用于验证码不区分大小写)
response.setContentType("text/html;charset=gbk");//解决乱码问题
PrintWriter out = response.getWriter();
Map<String,String> map=new HashMap<>();
String html = "<html><head><title></title></head><body><p>登录成功</p><a href='File5.jsp'>返回</a></body></html>";//设置登录成功页面
if (checkCode.equals(piccode)) {
request.getRequestDispatcher("File5.jsp").forward(request,response);
}
else{
out.println("验证码输入错误!!!");
}
out.flush();//将流刷新
out.close();//将流关闭
}
}
验证码的目的:防止恶意破解密码、刷票、论坛灌水、刷页。有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录尝试,实际上使用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,百度社区),我们利用比较简易的方式实现了这个功能。虽然登录麻烦一点,但是对网友的密码安全来说这个功能还是很有必要,也很重要。但我们还是 提醒大家要保护好自己的密码 ,尽量使用混杂了数字、字母、符号在内的6位以上密码,不要使用诸如1234之类的简单密码或者与用户名相同、类似的密码 ,免得你的账号被人盗用给自己带来不必要的麻烦。 验证码通常使用一些线条和一些不规则的字符组成,主要作用是为了防止一些黑客把密码数据化盗取。
体现的安全性。
这个注册界面:账号密码均为xg123,然后利用MD5将密码加密,注册数据库中密码为:
主要代码:
public static String MD5(String s) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytes = md.digest(s.getBytes("utf-8"));
return toHex(bytes);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static String toHex(byte[] bytes) {
final char[] HEX_DIGITS = "0123456789ABCDEF".toCharArray();
StringBuilder ret = new StringBuilder(bytes.length * 2);
for (int i = 0; i < bytes.length; i++) {
ret.append(HEX_DIGITS[(bytes[i] >> 4) & 0x0f]);
ret.append(HEX_DIGITS[bytes[i] & 0x0f]);
}
return ret.toString();
}
}
这样是保护了用户账户的安全性,防止密码中途被窃取。
性能战术
性能性:性能是指系统的响应能力。性能与时间有关。事件(中断、消息、用户请求或时间已到)发生时,系统必须做出响应。事件到达和相应有很多特性,但性能基本上与事件发生时,将要耗费系统多长时间做出响应有关。
*时间、空间(如:内存)架构平衡时间空间
目标:对一定时间限制内到达系统的时间生成一个响应,这些事件可以是消息到达、定时器到时,系统状态的变化。
影响响应时间的两个因素:
1.资源消耗:资源包括CPU、数据存储、网络通信带宽和内存等;资源消耗是指实际需要耗费的时间;
资源消耗包括:每个事件都要经过一定的处理序列
2.闭锁时间:由于资源争用、资源不可用或长时间计算导致事件无法处理,这是指计算机可能等待的时间
在性能方面,空间和时间是不可兼得的,要想得到快速响应,就一定要拿空间来换取,相反,想要减少空间的占用,那么运行时间一定会有所影响,一定不存在占用空间少的同时,运行速度又非常迅速的情况。
三个分类:
1.资源需求-分析影响性能的资源因素
事件流是需求的源;
需求两个特性:
1.资源流中事件之间的时间间隔
2.每个请求所消耗的资源
在这里我是在算法中对信息热词爬取进行优化,加快爬取效率,更好删除无用字,生成更加有效的热词。
可测试性:可测试性战术的目标是允许在完成软件开发的一个增量后,轻松的对软件进行测试。测试的目标是发现错误。
在热词分析中,可以查看信息的输入输出。
可修改性:
可修改性战术的目标是控制实现、测试和部署变更的时间和成本。
就我的理解其实就是在编写软件代码的时候需要为以后的维护,修改着想,其实就是在以后的检测以及修改的时候尽可能的节省时间以及成本。
在这里面,我并没有体现很多的可修改性的东西,若想让用户随意添加想要爬取的网址,那么就得更改正则表达式,很是困难。
易用性:
有效地使用系统
系统如何能提高用户的操作效率?
将错误的影响降到最低
系统怎样使用户所犯的错误造成的影响最小?
使系统适应用户的需要
用户(或系统本身)可以如何使用户的任务变得更轻松?
提高自信和满意度
系统可如何使用户确信采取了正确的行动?
在热词分析系统中,只需要点击查看热词图分析就显示出来了,还可以查看各个热词百度百科的网址。点击直接进去。很方便。
可用性:
阻止错误发展为故障,或者至少能够把错误的影响限制在一定范围内,从而使系统恢复成为可能。
错误检测:
在代码层面我们要重视错误检测,在可能会出现错误的地方多使用错误检测方法中的异常来处理程序,将错误在语义上转换为可以被处理的形式多使用try/catch等来判断是否有错误,然后设计一些方式在错误出现后能够使系统很快的恢复正常供用户使用。比如连接数据库的代码使用了很多try/catch来判断:
public class DBUtil{
public static String db_url="jdbc:mysql://localhost:3306/xinfang?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT";
public static String db_user="root";
public static String db_password="password";
public static Connection getConn() {
Connection conn=null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn=DriverManager.getConnection(db_url, db_user, db_password);
System.out.println("连接数据库成功");
}catch(Exception e) {
System.out.println("连接数据库失败");
e.printStackTrace();
}
return conn;
}
public static void close(Connection conn) {
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Statement state,Connection conn) {
if(state!=null) {
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(ResultSet rs, Statement state, Connection conn) {
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(state!=null) {
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}