Servlet代码:
package util;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;import java.awt.*;
import java.awt.image.*;
import java.util.*;public class Image extends HttpServlet {
public void init(ServletConfig config) throws ServletException{
super.init(config);
}public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
response.reset();
response.setContentType("image/jpeg");
response.setHeader("Pragma","No-cache"); //这三句用于防止IE读缓存
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);//在内存中创建图象
int width = 58, height = 18;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//获取图形上下文
Graphics g = image.getGraphics();//生成随机类
Random random = new Random();//设定背景色
g.setColor(new Color(201 + random.nextInt(50), 201 + random.nextInt(50), 201 + random.nextInt(50)));
g.fillRect(0, 0, width, height);//设定字体
g.setFont(new Font("Times new Roman", Font.PLAIN, 18));//画边框
//g.setColor(new Color());
//g.drawRect(0,0,width-1,height-1);//随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(new Color(160 + random.nextInt(41), 160 + random.nextInt(41),160 + random.nextInt(41)));
for (int i=0;i<155;i++)
{
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x + xl, y + yl);
}//取随机产生的认证码(4位数字)
String sRand="";
for (int i = 0; i < 4; i++){
String rand = String.valueOf(random.nextInt(10));
sRand += rand;//将认证码显示到图象中
g.setColor(new Color(20 + random.nextInt(111), 20 + random.nextInt(111),20 + random.nextInt(111)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand, 13 * i + 6, 16);
}
HttpSession session = null;
session = request.getSession(true);
//将认证码存入SESSION
session.setAttribute("rand", sRand);//图象生效
g.dispose();//输出图象到页面
//ImageIO.write(image, "JPEG", resp.getOutputStream());
//response.setContentType("image/jpeg");
ServletOutputStream out = response.getOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();
}
}
Jsp代码:
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page session="true" %>
<jsp:useBean id="alogin" scope="session" class="operator.login" />
<jsp:useBean id="code" scope="session" class="util.Image" />
<%@ page import="util.*" %><%
String mesg = "";
if( request.getParameter("username")!=null && !request.getParameter("username").equals("")){
String username =request.getParameter("username");
String passwd = request.getParameter("passwd");
String c=(String)session.getAttribute("rand");
out.println(c);
//String d=request.getParameter("imagecode");
//if(c.equals(d)){
//alogin.setUsername(username);
//alogin.setPasswd(passwd);
//alogin.setIsadmin(true);
//if (alogin.exectue()){
// session.setAttribute("admin","admin");
// response.sendRedirect("adm_asset.jsp");
//}else {
// mesg = "登录出错!" ;
// }}
}
%><script language="javascript">
function checkform() {
if (document.form1.username.value=="" || document.form1.passwd.value==""){
alert("用户名或密码为空!");
return false;
}
return true; }
</script>
<html><body>
<center>
<%@ include file="/inc/adm_head.inc" %>
</center>
<div align="center" bgcolor="#E4EDFB">
<table width="778" border="0" cellspacing="0" cellpadding="0" bgcolor="#E4EDFB" align="center">
<tr>
<td align="center">
<form name="form1" method="post" action="adm_login.jsp">
<table width="360" border="0" cellspacing="2" cellpadding="2" bgcolor="#E4EDFB" bordercolor="#66CCFF" style="font-size:9pt">
<tr align="center">
<td colspan="2">
<h3><br>
<font color="#FF0000">信息技术学院办公用品管理系统</font></h3>
<p> <% if (!mesg.equals("")){
out.println(mesg);}%></p>
</td>
</tr>
<tr>
<td align="right" width="150">管理员:</td>
<td>
<input type="text" name="username" size="12" maxlength="20">
</td>
</tr>
<tr>
<td align="right" width="150">管理员密码:</td>
<td>
<input type="password" name="passwd" size="12" maxlength="20">
</td>
</tr>
<tr>
<td align="right" width="150">验证码:</td>
<td>
<input type="text" name="imagecode" size="12" maxlength="8"></input>
<img alt="" src="http://127.0.0.1:8080/equipment/Image" width="40" height="16"/> </td>
</tr>
<tr align="center">
<td colspan="2">
<input type="submit" name="Submit" value="登录" onclick="javascript:return(checkform());">
<input type="reset" name="Submit2" value="取消">
</td>
</tr>
<tr align="center">
<td colspan="2"><A HREF="../assetlist.jsp">返回首页</A></td>
</tr>
</table>
</form>
<p> </p>
</td>
</tr>
</table>
<p><center>测试用户:admin 密码:123456</center>
</div></body></html>
求助:为什么在Jsp页面显示rand的Session为NULL????怎么样才能显示其在Servlet中设置的Session
package util;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;import java.awt.*;
import java.awt.image.*;
import java.util.*;public class Image extends HttpServlet {
public void init(ServletConfig config) throws ServletException{
super.init(config);
}public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
response.reset();
response.setContentType("image/jpeg");
response.setHeader("Pragma","No-cache"); //这三句用于防止IE读缓存
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);//在内存中创建图象
int width = 58, height = 18;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//获取图形上下文
Graphics g = image.getGraphics();//生成随机类
Random random = new Random();//设定背景色
g.setColor(new Color(201 + random.nextInt(50), 201 + random.nextInt(50), 201 + random.nextInt(50)));
g.fillRect(0, 0, width, height);//设定字体
g.setFont(new Font("Times new Roman", Font.PLAIN, 18));//画边框
//g.setColor(new Color());
//g.drawRect(0,0,width-1,height-1);//随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(new Color(160 + random.nextInt(41), 160 + random.nextInt(41),160 + random.nextInt(41)));
for (int i=0;i<155;i++)
{
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x + xl, y + yl);
}//取随机产生的认证码(4位数字)
String sRand="";
for (int i = 0; i < 4; i++){
String rand = String.valueOf(random.nextInt(10));
sRand += rand;//将认证码显示到图象中
g.setColor(new Color(20 + random.nextInt(111), 20 + random.nextInt(111),20 + random.nextInt(111)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand, 13 * i + 6, 16);
}
HttpSession session = null;
session = request.getSession(true);
//将认证码存入SESSION
session.setAttribute("rand", sRand);//图象生效
g.dispose();//输出图象到页面
//ImageIO.write(image, "JPEG", resp.getOutputStream());
//response.setContentType("image/jpeg");
ServletOutputStream out = response.getOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();
}
}
Jsp代码:
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page session="true" %>
<jsp:useBean id="alogin" scope="session" class="operator.login" />
<jsp:useBean id="code" scope="session" class="util.Image" />
<%@ page import="util.*" %><%
String mesg = "";
if( request.getParameter("username")!=null && !request.getParameter("username").equals("")){
String username =request.getParameter("username");
String passwd = request.getParameter("passwd");
String c=(String)session.getAttribute("rand");
out.println(c);
//String d=request.getParameter("imagecode");
//if(c.equals(d)){
//alogin.setUsername(username);
//alogin.setPasswd(passwd);
//alogin.setIsadmin(true);
//if (alogin.exectue()){
// session.setAttribute("admin","admin");
// response.sendRedirect("adm_asset.jsp");
//}else {
// mesg = "登录出错!" ;
// }}
}
%><script language="javascript">
function checkform() {
if (document.form1.username.value=="" || document.form1.passwd.value==""){
alert("用户名或密码为空!");
return false;
}
return true; }
</script>
<html><body>
<center>
<%@ include file="/inc/adm_head.inc" %>
</center>
<div align="center" bgcolor="#E4EDFB">
<table width="778" border="0" cellspacing="0" cellpadding="0" bgcolor="#E4EDFB" align="center">
<tr>
<td align="center">
<form name="form1" method="post" action="adm_login.jsp">
<table width="360" border="0" cellspacing="2" cellpadding="2" bgcolor="#E4EDFB" bordercolor="#66CCFF" style="font-size:9pt">
<tr align="center">
<td colspan="2">
<h3><br>
<font color="#FF0000">信息技术学院办公用品管理系统</font></h3>
<p> <% if (!mesg.equals("")){
out.println(mesg);}%></p>
</td>
</tr>
<tr>
<td align="right" width="150">管理员:</td>
<td>
<input type="text" name="username" size="12" maxlength="20">
</td>
</tr>
<tr>
<td align="right" width="150">管理员密码:</td>
<td>
<input type="password" name="passwd" size="12" maxlength="20">
</td>
</tr>
<tr>
<td align="right" width="150">验证码:</td>
<td>
<input type="text" name="imagecode" size="12" maxlength="8"></input>
<img alt="" src="http://127.0.0.1:8080/equipment/Image" width="40" height="16"/> </td>
</tr>
<tr align="center">
<td colspan="2">
<input type="submit" name="Submit" value="登录" onclick="javascript:return(checkform());">
<input type="reset" name="Submit2" value="取消">
</td>
</tr>
<tr align="center">
<td colspan="2"><A HREF="../assetlist.jsp">返回首页</A></td>
</tr>
</table>
</form>
<p> </p>
</td>
</tr>
</table>
<p><center>测试用户:admin 密码:123456</center>
</div></body></html>
求助:为什么在Jsp页面显示rand的Session为NULL????怎么样才能显示其在Servlet中设置的Session
<img alt="" src="http://127.0.0.1:8080/equipment/Image" width="40" height="16"/>这个servlet在web.xml中部署没有?
//ImageIO.write(image, "JPEG", resp.getOutputStream());
//response.setContentType("image/jpeg");
ServletOutputStream out = response.getOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();改成
ImageIO.write(image, "JPEG", response.getOutputStream());
在web.xml中加上
<servlet>
<servlet-name>image</servlet-name>
<servlet-class>util.Image</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>image</servlet-name>
<url-pattern>Image</url-pattern> //这个是你访问的路径
</servlet-mapping>
<servlet>
<servlet-name>Image</servlet-name>
<servlet-class>util.Image</servlet-class> </servlet>
<!--自己加的-->
<servlet-mapping>
<servlet-name>Image</servlet-name>
<url-pattern>/Image</url-pattern>
</servlet-mapping>
在Jsp页面已经能正常显示图片,就是在打印Session时:String c=(String)session.getAttribute("rand");
out.println(c);显示出来的NULL.
刚才根据AreamArgentateOfWing(梦幻银翼) 的说法改了,还是一样不行.
再次感谢二位的帮忙.
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0); 这三句用于防止IE读缓存,当我通过表单提交的时候,这个Session会不会因此而被清空了呢?会的话我那我应该怎样避免这种情况.谢谢
response.setContentType("image/jpeg");
response.setHeader("Pragma","No-cache"); //这三句用于防止IE读缓存
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
只留response.setContentType("image/jpeg"); 一句试试
<%@ page session="true" %>
<jsp:useBean id="code" scope="session" class="util.Image" />2)修正Servlet的這句↓
HttpSession session = request.getSession();
super.init(config);}初始化方法做了什么?暂时调用默认的不传参的方法测试一下
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGet(request, response);
}jsp中<jsp:useBean id="code" scope="session" class="util.Image" />去掉<img alt="" src="http://127.0.0.1:8080/equipment/Image" width="40" height="16"/>
改成<img alt="" src="/Image" width="40" height="16"/>
在这之后用system.out.println(session.getAttribute("rand"))打印看看是否有值.