1、例子:
form.html文件抓包分析
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Form</title>
</head>
<body>
<h1>
表单
</h1>
<form action="go" method="get">
<!--action,表示提交给谁;method表示用什么方式来提交一般使用post来提交-->
<input type="text" name="user" value="java"/>
<!--name的意义?将来这个表单提交的时候,name的值作为提交信息的名称-->
<input type="text" name="pwd" />
<input type="password" name="pwd1"/>
<!--type="password",在页面上显示时,输入的内容变成了*号-->
<input type="hidden" name="id" value="123" />
<!--type,hidden,在页面上不显示-->
<input type="submit" value="提交" />
</form>
</body>
</html>
其中meta Content-type:text/html;charset=utf-8
全英文
user=memeory&abc=123&pwd=hello
= =
memory&abc=123
user=memeory%26abc%3D123&pwd=haha
== ==
%跟一16进制的数据,表示一个字符
中文
user=%ED%BD%A0%ET%A5%BD
===================
一个中文,一个utf8的编码是3个字节,所以上面是2个字
一个中文,gbk编码是2个字节
2、form文件提交的数据 ,会以编码的形式出现在文件中,就要看浏览器用什么的编码打开页面就用什么编码来传输数据
服务器必须通过某种方法知道浏览器是用什么编码方式提交的
URLEncoder.encode
URLDecoder.decode
3、servlet如何获取表单的数据??
package org.whatisjava.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FormServlet extends HttpServlet{
public void service(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
//获取请求协议中提交的文本数据
//tomcat对于特殊字符默认用ISO 8859-1解码
//
request.setCharacterEncoding("utf-8");
//这句话必须写在第一个getParameter之前
String user=request.getParameter("user");
String pwd=request.getParameter("pwd");
System.out.println(user);
System.out.println(pwd);
}
}
4、练习
表格
添加一个新员工
添加完成后出现新的员工列表,并返回对应的
5、Statement与 PreparedStatement的区别
Statement
String user=request.getParameter("user");
String pwd=request.getParameter("pwd");
String url="";
String username="";
String password=""
Class.forName("");
Connection conn=DriverManager.getConnection(url,username,password);
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery("
select count(*) from t_user
where user='"+user+"' and pwd='"+pwd+"'
");
//返回结果是1则存在,返回0则不存在
采用以上方法是有问题的,那么是什么问题呢 ?
假设 第一个文本框 输入 hahaha,第二个 文本框 1'or'2'='2
那么我们把其放入 以上 select语句中
select count(*) from t_user where user='hahaha' and pwd='1'or'2'='2'
rs.next();
if (rs.getInt(1)!=0){
//登录成功
}
SQL Injection!!!
PreparedStatement
String user=request.getParameter("user");
String pwd=request.getParameter("pwd");
String url="";
String username="";
String password=""
Class.forName("");
Connection conn=DriverManager.getConnection(url,username,password);
PreparedStatement ps=conn.createStatement("
select count(*) from t_user
where user=? and pwd=?
");
ps.setString(1,user);
ps.setString(2,pwd);
ResultSet rs=ps.executeQuery();
PreparedStatement已经屏蔽了大多数的 sql注入攻击的
6、重定向
CLIENT SERVER
A----------->B第一次请求
<------------ response里面带有重定向的url C
------------>C第二次请求
<------------
并且地址栏会发生变化成重定向后的地址
抓包分析:
第一次请求:
GET /serlvet02/redirect
...
Connection:keep-alive;
第二次请求:
GET /servlet02/taget.html
说明:
servlet只是通过api来生成重定向的位置
http协议本身就支持重定向
response.sendRedirect("target.html"); //重定向的location位置
7、
问题:web.xml在什么时候加载
web.xml在服务器服务启动的时候就将该文件加载到了内存中
问题:一个页面会有多个请求比如文本请求\图片请求等
8、
如何让服务器发送一个图片到客户端浏览器?
html文件中,加载一个图片文件
<img src="img/tiger.jpg" width="200" height="260"/>
9、如何用程序动态生成图片?
比如验证码图片
swing画图
图片在内存中是什么样的?
是以位图来呈现的,位图以像素点个数,一个点的颜色个数
1个像素点=24位真彩图=3个字节(3红绿蓝,1色8位),每颜色颜色值为0-255.3个色都为255则为白,都为0则为黑
3个字节24位=2的 24次方,1个像素就是24位(3个字节)
颜色数和像素数
内存里面先可以生成一个点阵
//设置响应类型
response.setContentType("image/jpeg");
BufferedImage image=new BufferedImage(60,20,BufferedImage.TYPE_INT_RGB);
//可以封存图片在内存中的点阵信息。图片的内存影像
//TYPE_INT_RGB RGB,红绿蓝
Random r = new Random();
Graphics g = image.getGraphics();
g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
g.fillRect(0, 0, 600, 500);
g.setColor(new Color(0,0,0));
String number = String.valueOf(r.nextInt(99999));
g.drawString(number, 5, 15);
// 压缩成jpeg格式
OutputStream os = response.getOutputStream();
//response.getWriter();//前面已经应用过response的输出,主要是输出文本具有编码作用(字符流)
//输出普通字节流的话应该调用getOutputStream();
//在这里也可以直接将其输出,但是太大,可以通过JPEGCodec压缩后输出
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);
// 把BufferedImage对象中的图像信息编码后
// 向创建该对象(encoder)时指定的输出流输出
encoder.encode(image);
response.getWriter()--主要是输出文本
response.getOutputStream()-----主要是输出流
图片识别技术----难度系数比较大
get是协议里面不能带数据,但是可以通过地址栏来携带数据
get和post区别
IE浏览器,地址栏里面最多是2k
post提交的时候,其传输的数据受到服务器的限制
提交的不是文本的话,必须用post
练习中碰到的问题:
a、out.println("<td><a href='del?id="+rs.getString(1)+"'>delete</a>"+"</td>")
认真理解这么写的格式:''与""的互相嵌套
while(rs.next()){
out.println("<tr>");
out.println("<td>"+rs.getString(1)+"</td>");
out.println("<td>"+rs.getString(2)+"</td>");
out.println("<td>"+rs.getString(3)+"</td>");
out.println("<td><a href='del?id="+rs.getString(1)+"'>delete</a>"+"<td>");
out.println("</tr>");
}
在刷新的时候,同时将href重定向的地址动态加载
在此练习中可以延伸下批量删除如何实现(在这里可以变更成选择框批量删除);
更改信息(ID不变)
b、
10、如何用程序动态生成图片?
11、为什么要配置隐藏input呢??
隐藏表单(隐藏域)
<input type="hidden" name="" value="">
====
text
checkbox
button
password
sumbit
是为了提交form
12、Statement和PreparedStatement的参数索引是从1开始
Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test1","root","54255425");
PreparedStatement ps=conn.prepareStatement("update emp set name=?,salary=? where id='"+id+"' ");
ps.setString(1, name);//是给SQL语句中的第一个?赋予值
ps.setFloat(2, Float.parseFloat(salary));//是给SQL语句中的第二个?赋值
//ps.setString(parameterIndex, x),其中参数索引是从1开始
//java.sql.SQLException: Parameter index out of range (3 > number of parameters,
//which is 2).