在线等,求大神帮帮忙!
业务:这个是效果图,JSP图片请求到action之后,action生成图片,并且把验证码的值储存到request中,返回一个图片流。
问题:jsp能正常的看到图片,而且点击图片也可以刷新,但是JSP无法获取action储存的验证码的值,用${rand}和<%=(String)request.getAttribute("rand")%>都无法取到值。但是能保证action已经把验证码的值后台已经存储到了request中了,获取不到验证码的值就无法判断用户输入的是不是正确的了。
问题详情:JSP点击确定按钮弹出来的是null,可action是把值存到了request中了啊?我使用的是SSH框架,不想用DWZ,直接用ajax,
这个是后台action的代码。
/**
* 得到验证码图片
* LL2015-08-18 23:49:25
* @return
*/
public void getValidateImg(){
//生成随机字串
String verifyCode = VerifyCodeUtils.generateVerifyCode(4);
//得到request和response
HttpServletRequest request=ServletActionContext.getRequest();
HttpServletResponse response=ServletActionContext.getResponse();
//把验证码的值存入request中
request.setAttribute("rand", verifyCode.toLowerCase());
System.out.println("验证码是:"+verifyCode.toLowerCase());
//生成图片
int w = 200, h = 80;
try {
//返回ImageIO图片流
VerifyCodeUtils.outputImage(w, h, response.getOutputStream(), verifyCode);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
这个是jsp的代码
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
String path = request.getContextPath();
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>验证码</title>
<script type="text/javascript">
//验证码图片刷新重新获取验证码
function refurbishValidateImg(){
document.getElementById("validateImg").src = "getValidateImgMIN?t="+ new Date();
}
//点击确定,把正确的验证码弹出来
function onOk(){
var str2=<%=(String)request.getAttribute("rand")%>;
alert(str2); //这里弹出来的是null
}
</script>
</head>
<body>
<img id="validateImg" name="validateImg" src="getValidateImgMIN" width="60" height="20" border="1" align="absmiddle" onclick="refurbishValidateImg()">
<input type="button" onclick="onOk()" value="确定">
</body>
</html>
这个是SHH的配置文件
<!--总包,用来配置全局的实例 -->
<package name="MINI" extends="jfreechart-default">
<interceptors>
<interceptor name="isLoginInterceptor" class="com.util.IsLoginInterceptor" />
<interceptor-stack name="myStack">
<interceptor-ref name="isLoginInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack" />
<global-results>
<result name="loginPage">login.jsp</result>
<result name="input">error.jsp</result>
</global-results>
</package>
3 个解决方案
#1
别用request存,用session存
HttpSession session= request.getSession();
session.setAttribute("rand", verifyCode.toLowerCase());
HttpSession session= request.getSession();
session.setAttribute("rand", verifyCode.toLowerCase());
#2
你跳转到该jsp时还没有生成验证码,你的request中就没有验证码,你在这个jsp中肯定取不到;你用js调用后台生成的验证码在另一个请求中,不在跳转到jsp页面的请求中,所有你在这个jsp中取不到。对不?
#3
这涉及到生命周期的问题,HTTP是基于请求响应的模式(request - response),而你设置的request对象只在当前请求下有效,请求一旦结束,该对象的生命周期也就结束了。因此当你获取验证码时将结果保存到request中,下次准备验证验证码的时候,上次的request对象已经被销毁,此时的request又是一个新的对象。因此解决方案如2#所述,采用session对象保存。
#1
别用request存,用session存
HttpSession session= request.getSession();
session.setAttribute("rand", verifyCode.toLowerCase());
HttpSession session= request.getSession();
session.setAttribute("rand", verifyCode.toLowerCase());
#2
你跳转到该jsp时还没有生成验证码,你的request中就没有验证码,你在这个jsp中肯定取不到;你用js调用后台生成的验证码在另一个请求中,不在跳转到jsp页面的请求中,所有你在这个jsp中取不到。对不?
#3
这涉及到生命周期的问题,HTTP是基于请求响应的模式(request - response),而你设置的request对象只在当前请求下有效,请求一旦结束,该对象的生命周期也就结束了。因此当你获取验证码时将结果保存到request中,下次准备验证验证码的时候,上次的request对象已经被销毁,此时的request又是一个新的对象。因此解决方案如2#所述,采用session对象保存。