JavaWeb基础知识总结. (14)

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(重点)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwzfdw.html