l boolean isNew():查看session是否为新。当客户端第一次请求时,服务器为客户端创建session,但这时服务器还没有响应客户端,也就是还没有把sessionId响应给客户端时,这时session的状态为新。
6 URL重写我们知道session依赖Cookie,那么session为什么依赖Cookie呢?因为服务器需要在每次请求中获取sessionId,然后找到客户端的session对象。那么如果客户端浏览器关闭了Cookie呢?那么session是不是就会不存在了呢?
其实还有一种方法让服务器收到的每个请求中都带有sessioinId,那就是URL重写!在每个页面中的每个链接和表单中都添加名为jSessionId的参数,值为当前sessionid。当用户点击链接或提交表单时也服务器可以通过获取jSessionId这个参数来得到客户端的sessionId,找到sessoin对象。
index.jsp
<body>
<h1>URL重写</h1>
<a href=http://www.likecs.com/\'/day06_5/index.jsp;jsessionid=<%=session.getId() %>\' >主页</a>
<form action=http://www.likecs.com/\'/day06_5/index.jsp;jsessionid=<%=session.getId() %>\' method=http://www.likecs.com/"post">
<input type=http://www.likecs.com/"submit" value=http://www.likecs.com/"提交"/>
</form>
</body>
也可以使用response.encodeURL()对每个请求的URL处理,这个方法会自动追加jsessionid参数,与上面我们手动添加是一样的效果。
<a href=http://www.likecs.com/\'<%=response.encodeURL("/day06_5/index.jsp") %>\' >主页</a>
<form action=http://www.likecs.com/\'<%=response.encodeURL("/day06_5/index.jsp") %>\' method=http://www.likecs.com/"post">
<input type=http://www.likecs.com/"submit" value=http://www.likecs.com/"提交"/>
</form>
使用response.encodeURL()更加“智能”,它会判断客户端浏览器是否禁用了Cookie,如果禁用了,那么这个方法在URL后面追加jsessionid,否则不会追加。
案例:一次性图片验证码 1 验证码有啥用在我们注册时,如果没有验证码的话,我们可以使用URLConnection来写一段代码发出注册请求。甚至可以使用while(true)来注册!那么服务器就废了!
验证码可以去识别发出请求的是人还是程序!当然,如果聪明的程序可以去分析验证码图片!但分析图片也不是一件容易的事,因为一般验证码图片都会带有干扰线,人都看不清,那么程序一定分析不出来。
2 VerifyCode类现在我们已经有了cn.itcast.utils.VerifyCode类,这个类可以生成验证码图片!下面来看一个小例子。
public void fun1() throws IOException {
// 创建验证码类
VerifyCode vc = new VerifyCode();
// 获取随机图片
BufferedImage image = vc.getImage();
// 获取刚刚生成的随机图片上的文本
String text = vc.getText();
System.out.println(text);
// 保存图片
FileOutputStream out = new FileOutputStream("F:/xxx.jpg");
VerifyCode.output(image, out);
}
3 在页面中显示动态图片
我们需要写一个VerifyCodeServlet,在这个Servlet中我们生成动态图片,然后它图片写入到response.getOutputStream()流中!然后让页面的<img>元素指定这个VerifyCodServlet即可。
VerifyCodeServlet
public class VerifyCodeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
VerifyCode vc = new VerifyCode();
BufferedImage image = vc.getImage();
String text = vc.getText();
System.out.println("text:" + text);
VerifyCode.output(image, response.getOutputStream());
}
}
index.jsp
<script type=http://www.likecs.com/"text/javascript">
function _change() {
var imgEle = document.getElementById("vCode");
imgEle.src = "/day06_6/VerifyCodeServlet?" + new Date().getTime();
}
</script>
...
<body>
<h1>验证码</h1>
<img id=http://www.likecs.com/"vCode" src=http://www.likecs.com/"/day06_6/VerifyCodeServlet"/>
<a href=http://www.likecs.com/"javascript:_change()">看不清,换一张</a>
</body>
4 在注册页面中使用验证码
<form action=http://www.likecs.com/"/day06_6/RegistServlet" method=http://www.likecs.com/"post">
用户名:<input type=http://www.likecs.com/"text" name=http://www.likecs.com/"username"/><br/>
验证码:<input type=http://www.likecs.com/"text" name=http://www.likecs.com/"code" size=http://www.likecs.com/"3"/>
<img id=http://www.likecs.com/"vCode" src=http://www.likecs.com/"/day06_6/VerifyCodeServlet"/>
<a href=http://www.likecs.com/"javascript:_change()">看不清,换一张</a>
<br/>
<input type=http://www.likecs.com/"submit" value=http://www.likecs.com/"Submit"/>
</form>
5 RegistServlet
修改VerifyCodeServlet
public class VerifyCodeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
VerifyCode vc = new VerifyCode();
BufferedImage image = vc.getImage();
request.getSession().setAttribute("vCode", vc.getText());
VerifyCode.output(image, response.getOutputStream());
}
}
RegistServlet
public class RegistServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String username = request.getParameter("username");
String vCode = request.getParameter("code");
String sessionVerifyCode = (String)request.getSession().getAttribute("vCode");
if(vCode.equalsIgnoreCase(sessionVerifyCode)) {
response.getWriter().print(username + ", 恭喜!注册成功!");
} else {
response.getWriter().print("验证码错误!");
}
}
}
6 总结验证码案例
l VerifyCodeServlet:
Ø 生成验证码:VerifyCode vc = new VerifyCode(); BufferedImage image = vc.getImage();
Ø 在session中保存验证码文本:request.getSession.getAttribute(“vCode”, vc.getText());
Ø 把验证码输出到页面:VerifyCode.output(image, response.getOutputStream);
l regist.jsp:
Ø 表单中包含username和code字段;
Ø 在表单中给出<img>指向VerifyCodeServlet,用来在页面中显示验证码图片;
Ø 提供“看不清,换一张”链接,指向_change()函数;
Ø 提交到RegistServlet;
l RegistServlet:
Ø 获取表单中的username和code;
Ø 获取session中的vCode;
Ø 比较code和vCode是否相同;
Ø 相同说明用户输入的验证码正确,否则输入验证码错误。
Jsp&el表达式 JSP指令 JSP指令概述JSP指令的格式:<%@指令名 attr1=”” attr2=”” %>,一般都会把JSP指令放到JSP文件的最上方,但这不是必须的。
JSP中有三大指令:page、include、taglib,最为常用,也最为复杂的就是page指令了。
2 page指令page指令是最为常用的指定,也是属性最多的属性!
page指令没有必须属性,都是可选属性。例如<%@page %>,没有给出任何属性也是可以的!
在JSP页面中,任何指令都可以重复出现!
<%@ page language=”java”%>
<%@ page import=”java.util.*”%>
<%@ page pageEncoding=”utf-8”%>
这也是可以的!
2.1 page指令的pageEncoding和contentType(重点)