Web编程的过程就是通过请求分析客户需要什么信息或者进行了哪些操作,然后进行一系列的处理,最后通过响应结果显示给客户。
获取request的变量
客户端浏览器发出的请求被封装成为了一个HttpServletRequest对象。所有的信息包括请求的地址,请求的参数,提交的数据,上传的文件,客户端的IP地址甚至客户端操作系统都包含在HttpServletRequest对象中。
核心是了解下tomcat的servlet有哪些功能,从而才能了解各种框架封装的相似性功能。
package com.wht.demo.servlet;
import sun.net.util.IPAddressUtil;
import javax.ejb.Local;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.security.Principal;
import java.util.Locale;
/**
* @author JDIT
*/
@WebServlet(name = "RequestServlet")
public class RequestServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html");
String authType = request.getAuthType();
String localAddr = request.getLocalAddr(); //本地IP,即服务器IP
String localName = request.getLocalName(); //本地名称,即服务器名称
int localPort = request.getLocalPort(); //本地端口号,即tomcat端口号
Locale locale = request.getLocale();
String contextPath = request.getContextPath();
String method = request.getMethod();
String pathInfo = request.getPathInfo();
String pathTranslated = request.getPathTranslated();
String protocol = request.getProtocol();
String queryString = request.getQueryString();
String remoteAddr = request.getRemoteAddr(); // 客户端IP
int port = request.getRemotePort(); // 客户端端口
String remoteUser = request.getRemoteUser();
String requestSessionId = request.getRequestedSessionId(); //客户端SessionId
String requestURI = request.getRequestURI();
StringBuffer requestURL = request.getRequestURL();
String scheme = request.getScheme(); //协议头
String serverName = request.getServerName();
int serverPort = request.getServerPort();//服务器端口
String servletPath = request.getServletPath();
Principal userPrincipal = request.getUserPrincipal();
String accept = request.getHeader("accept");
String referer = request.getHeader("referer"); //从那个页面单击连接到本页
String userAgent = request.getHeader("User-Agent");
String serverInfo = this.getServletContext().getServerInfo();
PrintWriter printWriter = response.getWriter();
printWriter.println("<!doctype html>");
printWriter.println("<html>");
printWriter.println("<head><title>Request Servlet</title></head>");
printWriter.println("<style>body{font-size:12px;line-hight:18px;}</style>");
printWriter.println("<body>");
// 有空可以一个一个加
printWriter.println("<div>您的IP为:"+remoteAddr+"</div>");
printWriter.println("<div>您的操作系统为"+this.getOS(userAgent)+"</div>");
printWriter.println("<div>您的浏览器支持的文件为:"+this.getAccept(accept)+"</div>");
printWriter.println("</body>");
printWriter.println("</html>");
printWriter.flush();
printWriter.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
private String getOS(String userAgent){
if(userAgent.contains("Windows NT 5.1")){
return "Windows XP";
}
if(userAgent.contains("Windows 98")){
return "Windows 98";
}
if(userAgent.contains("Windows NT 6.1")){
return "Windows7";
}
return "未知";
}
/**
* 返回客户端浏览器接收的文件类型
*
* @param accept
* @return
*/
private String getAccept(String accept) {
StringBuffer buffer = new StringBuffer();
if (accept.contains("image/gif")) {
buffer.append("GIF 文件, ");
}
if (accept.contains("image/x-xbitmap")) {
buffer.append("BPM 文件, ");
}
if (accept.contains("image/jpeg")) {
buffer.append("JPG 文件, ");
}
if (accept.contains("application/vnd.ms-excel")) {
buffer.append("Excel 文件, ");
}
if (accept.contains("application/vnd.ms-powerpoint")) {
buffer.append("PPT 文件, ");
}
if (accept.contains("application/vnd.msword")) {
buffer.append("Word 文件, ");
}
return buffer.toString().replaceAll(", $", "");
}
/**
* 返回用户客户端环境名称
*
* @param locale
* @return
*/
private String getLocal(Locale locale) {
if (Locale.SIMPLIFIED_CHINESE.equals(locale)) {
return "简体中文";
}
if (Locale.TRADITIONAL_CHINESE.equals(locale)) {
return "繁体中文";
}
if (Locale.ENGLISH.equals(locale)) {
return "英文";
}
if (Locale.JAPANESE.equals(locale)) {
return "日文";
}
return "其它语言";
}
/**
* 返回用户的浏览器信息
* @param userAgent
* @return
*/
private String getNavigator(String userAgent){
if(userAgent.contains("TencentTraveler")){
return "腾讯浏览器";
}
if(userAgent.contains("Firefox")){
return "火狐浏览器";
}
if(userAgent.contains("Chrome")){
return "谷歌浏览器";
}
return "未知浏览器";
}
}
配置和访问不再赘述
response生成图片验证码
上面是认识了HttpServletRequest对象种有哪些核心功能,现在在认识下HttpServletResponse有哪些功能。
服务器对客户端浏览器做出的响应被封装成一个HttpServletResponse对象。要浏览器进行操作,只需要操作HttpServletResponse对象就可以了。
通过HTTPServletResponse.getWriter()获得一个PrintWriter对象,该对象为OutputStream的子类。然后使用该对象输出信息就可以了。
通过HttpServletResponse获取的PrintWriter对象只能写字符型的数据。如果需要再客户端写二进制数据,可以使用HTTPServletResponse.getOutputStream()。方法getWriter()可以看做是方法getOutputStream()方法的一个封装。
package com.wht.demo.servlet;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
/**
* 图片认证
*
* @author JDIT
*/
@WebServlet(name = "IdentityServlet")
public class IdentityServlet extends HttpServlet {
public static final char[] CHARS = {'2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
public static Random random = new Random();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("image/jpeg");
String randomString = getRandomString();
request.getSession(true).setAttribute("randomString", randomString); //放到session中
int with = 100;
int height = 30;
Color color = getRandomColor();
Color reverse = getReverseColor(color);
BufferedImage bi = new BufferedImage(with, height, BufferedImage.TYPE_INT_BGR);
Graphics2D graphics2D = bi.createGraphics();
graphics2D.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 16));
graphics2D.setColor(color);
graphics2D.fillRect(0, 0, with, height);
graphics2D.setColor(reverse);
graphics2D.drawString(randomString, 18, 20);
//画噪音点
for (int i = 0, n = random.nextInt(100); i < n; i++) {
graphics2D.drawRect(random.nextInt(with), random.nextInt(height), 1, 1);
}
ServletOutputStream out = response.getOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(bi);
out.flush();
}
/**
* 生成6位随机字符组合
*
* @return
*/
public static String getRandomString() {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < 6; i++) {
buffer.append(CHARS[random.nextInt(CHARS.length)]);
}
return buffer.toString();
}
public static Color getRandomColor() {
return new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255));
}
public static Color getReverseColor(Color color) {
return new Color(255 - color.getRed(), 255 - color.getGreen(), 255 - color.getBlue());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
Servlet的配置不再赘述,index.jsp我们改造下
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>My First Page</title>
</head>
<body>
<script>
function reloadImage() {
document.getElementById("btn").disabled = true;
document.getElementById("identity").src = "/FirstWeb/IdentityServlet?ts=" + new Date().getTime();
}
</script>
<img src="/FirstWeb/IdentityServlet" id="identity" onload="btn.disabled = false;"/>
<input type="button" value="看不清 换一个" onclick="reloadImage()" id="btn"/>
</body>
</html>
运行看下效果:
session中我们缓存了验证码,提交的时候就可以拿来做比对了
小结
- 真正掌握请求核心对象HttpServletRequest
- 真正掌握响应核心对象HttpServletResponse
- awt虽然不是核心,但是生成图片验证码的这些对象要熟悉
- response.setContentType(“image/jpeg”) 要熟悉常规ContentType