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>&nbsp;<% 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>&nbsp;&nbsp;
               <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>&nbsp;</p>
        
      </td>
    </tr>
  </table>
  <p><center>测试用户:admin&nbsp;&nbsp;密码:123456</center>
</div></body></html>
求助:为什么在Jsp页面显示rand的Session为NULL????怎么样才能显示其在Servlet中设置的Session

解决方案 »

  1.   

    <jsp:useBean id="code" scope="session" class="util.Image" />servlet不是javabean,不能这样用
    <img alt="" src="http://127.0.0.1:8080/equipment/Image" width="40" height="16"/>这个servlet在web.xml中部署没有?
      

  2.   

    //输出图象到页面
    //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>
      

  3.   

    首先非常感觉大家的帮忙!jsp:useBean id="code" scope="session" class="util.Image" />是我在调试无路的情况下加上去的,刚才贴上去时忘记删除了.另外我在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>
    在Jsp页面已经能正常显示图片,就是在打印Session时:String c=(String)session.getAttribute("rand");
    out.println(c);显示出来的NULL.
    刚才根据AreamArgentateOfWing(梦幻银翼) 的说法改了,还是一样不行.
    再次感谢二位的帮忙.
      

  4.   

    问题就出在Servlet定义的Session怎么在Jsp页面就变成空的,请大家帮帮忙.谢谢
      

  5.   

    试试servlet中使用session = request.getSession() ;
      

  6.   

    response.reset(); 把这句注释再试试
      

  7.   

    还是不行,不过倒是让我考虑到另外一个问题,就是在Servlet开始处有:response.setHeader("Pragma","No-cache");    
    response.setHeader("Cache-Control","no-cache");
    response.setDateHeader("Expires", 0); 这三句用于防止IE读缓存,当我通过表单提交的时候,这个Session会不会因此而被清空了呢?会的话我那我应该怎样避免这种情况.谢谢
      

  8.   

    response.reset();
    response.setContentType("image/jpeg");
    response.setHeader("Pragma","No-cache"); //这三句用于防止IE读缓存
    response.setHeader("Cache-Control","no-cache");
    response.setDateHeader("Expires", 0);
    只留response.setContentType("image/jpeg"); 一句试试
      

  9.   

    1)削除JSP中的這两句↓
    <%@ page session="true" %>
    <jsp:useBean id="code" scope="session" class="util.Image" />2)修正Servlet的這句↓
    HttpSession session = request.getSession();
      

  10.   

    刚刚又改了一下表单的提交方式,因为Servlet中的函数为doGet,故将Jsp页面表单的提交方式改为get.不过,同样不行,郁闷啊
      

  11.   

    public void init(ServletConfig config) throws ServletException{
    super.init(config);}初始化方法做了什么?暂时调用默认的不传参的方法测试一下
      

  12.   

    在Image.java中加上
    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"))打印看看是否有值.
      

  13.   

    这是因为图片的生成时间在 html 页面生成时间之后所以页面里的session值比servlet的要晚一拍你可以刷新这个页面几次 是不是每次页面值都是上一次的servlet的值所以这种情况是正常的
      

  14.   

    问题解决.各位,实在不好意思,是小弟的大意,我在这里<img alt="" src="http://127.0.0.1:8080/equipment/Image" width="40" height="16"/>写的IP是127.0.0.1,而我在地址栏输入的却是我的IP:10.5.116.138.故而会产生空的Session.真是不好意思,浪费大家这么多时间.同时感谢各位的帮忙,谢谢.真的太谢谢了.另外,interpb(曾曾胡,深怕情多累美人!!!) ,说的很有道理.