第3.49课 上课 Servlet常用对象及方法, HttpServletRes…

3_49

Servlet常用对象及方法

 HttpServletResponse

  getWriter:获取PrinterWriter对象用于文本输出

  getOutputStream:获取ServletOutputStream用于二进制数据的输出

  setCharsetEncoding:设置响应的编码格式

  getCharsetEncoding:获取响应的编码格式

  sendRedirect:重定向到另外一个资源

  encodeURL:对URL进行编码,包含session ID

Java Servlet API 中引用 Session 机制来追踪客户的状态。

 

Servlet API 中定义了 javax.servlet.http.HttpSession 接口,Servlet 容器必须实现这个接口。

 

当一个 Session 开始时,Servlet 容器将创建一个 HttpSession 对象,Servlet 容器为 HttpSession 分配一个唯一标识符,称为 Session ID。

Servlet 容器将 Session ID 作为 Cookie 保存在客户的浏览器中。

每次客户发出 HTTP 请求时,Servlet 容器可以从 HttpRequest 对象中读取 Session ID,然后根据 Session ID 找到相应的 HttpSession 对象,从而获取客户的状态信息。

 

当客户端浏览器中禁止Cookie,Servlet 容器无法从客户端浏览器中取得作为 Cookie 的 Session ID,也就无法跟踪客户状态。

 

Java Servlet API 中提出了跟踪 Session 的另一种机制,如果客户端浏览器不支持 Cookie,Servlet 容器可以重写客户请求的 URL,把 Session ID 添加到 URL 信息中。

 

 

encodeURL()方法是先判断当前的 Web 组件是否启用 Session,如果没有启用 Session,直接返回参数 url。

 

再判断客户端浏览器是否支持 Cookie,如果支持 Cookie,直接返回参数 url;

如果不支持 Cookie,就在参数 url 中加入 SessionID 信息,然后返回修改后的 url。

  addCookie:添加一个Cookie到响应

  addHeader:添加响应头

  setHeader:设置响应头

  getHeader:根据名称获取响应头

  setStatus:设置相应状态

  getStatus:获取响应状态

 E购通电子商务平台:图形验证码

  验证码及其作用

验证码:

就是将一串随机产生的数字或符号,生成一幅图片, 图片里加上一些干扰象素,由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。

 

作用:

验证码一般是防止有人利用机器人自动批量注册、对特定的注册用户用特定程序暴力破解方式进行不断的登陆、灌水。因为验证码是一个混合了数字或符号的图片,人眼看起来都费劲,机器识别起来就更困难。

 

 

如果没有不使用验证码会给系统带来那些危害:

①、如果对用户不断登录的话,可以破解用户密码

②、对对某个网站创建账户

③、对某个网站提交垃圾数据

④、对某个网站刷票等一系列危害

  添加验证码

   代码

    验证码生产类

package com.yayadou.ebuy.common;

 

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.util.Random;

 

/**

* 验证码生产类

* @author Administrator

*

*/

public class AuthCode {

//随机数对象

static Random random = new Random();

/**

* 获取验证码值

* @return 验证码字符串

*/

public static String getAuthCode(){

StringBuilder code = new StringBuilder();

//循环4次随机获取4个数字,并将数字追加到StringBuilder中

for(int i=0;i < 4;i++){

code.append(random.nextInt(10));

}

return code.toString();

}

/**

* 获取验证码图片

* @param code 需要绘制的验证码

* @return 验证码图片

*/

public static BufferedImage getCodeImg(String code){

//创建一个图片对象,并指定图片的宽高和类型

BufferedImage img = new BufferedImage(88,28,BufferedImage.TYPE_INT_RGB);

//通过图片获取一个绘图对象(理解为画笔)

Graphics grap = img.getGraphics();

//设置颜色(矩形区域颜色)

grap.setColor(Color.YELLOW);

//绘制一个矩形

grap.fillRect(0, 0, 88,28);

//设置颜色(验证码颜色)

grap.setColor(Color.BLACK);

//设置字体

grap.setFont(new Font("宋体",Font.PLAIN,24));

//不断的进行验证码状态绘制

for(int i=0;i<code.length();i++){

//从code对象中根据下标一个一个的获取需要绘制的字符

char c = code.charAt(i);

//绘制字符

grap.drawString(c+"", i*20, 20);

}

//绘制干扰线

for(int i=0;i<20; i++){

//线条有开始和结束位置

//获取干扰线x轴开始位置

int x = random.nextInt(88);

//获取干扰线x轴结束位置

int x2 = random.nextInt(88);

//获取干扰线y轴开始位置

int y = random.nextInt(28);

//获取干扰线y轴结束位置

int y2 = random.nextInt(28);

//绘制线条

grap.drawLine(x, y, x+x2, y+y2);

}

//返回绘制好的图片对象

return img;

}

}

 

    验证码处理Servlet类

package com.yayadou.ebuy.action;

 

import java.awt.image.BufferedImage;

import java.io.IOException;

 

import javax.imageio.ImageIO;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

import com.yayadou.ebuy.common.AuthCode;

 

/**

* 验证码处理Servlet类

* @author Administrator

*

*/

public class AuthCodeServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//获取验证码

String code = AuthCode.getAuthCode();

//将验证码存储到session中,方便后面的判断

HttpSession session = request.getSession();

session.setAttribute("authCode",code);

//获取验证码图片

BufferedImage img = AuthCode.getCodeImg(code);

//输出验证码图片到客户端

ImageIO.write(img, "JPEG", response.getOutputStream());

}

 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.doPost(request, response);

}

}

 

    web.xml中配置

    页面调用

 

    登录处理Servlet类

package com.yayadou.ebuy.action;

 

import java.io.IOException;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

/**

* 登录Servlet处理类

*/

public class LoginServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

request.setCharacterEncoding("UTF-8");

//获取Session对象

HttpSession session = request.getSession();

//从Session对象中获取验证码

String code = (String)session.getAttribute("authCode");

//判断提交的验证码和Session中的验证码是否相同

if(!code.equals(request.getParameter("code"))){

//不相同,重定向到登录页面,重新登录

response.sendRedirect("login.jsp");

}else{

//相同,获取登录名和密码,并跳转到首页

String userId = request.getParameter("userId");

String password = request.getParameter("pwd");

response.sendRedirect("index.html");

}

}

 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.doPost(request, response);

}

}

 

  验证码看不清楚

posted on 2018-01-31 23:05  東風★破  阅读(212)  评论(0)    收藏  举报

导航