Session
JavaEE中的接口为HttpSessionsession通过SessionID来区分不同的客户,session是以cookie或者URL重写来实现的。默认使用cookie来实现,
cookie名称为JSESSIONID,如果禁用了cookie则无法实现session功能。重写URL的方式需要人为特殊实现,不是浏览器默认行为。
HttpSession创建:
<%@page session="false"%>意思是在本页面,不能使用session隐含对象。但是可以通过request.getSession()来操作session内容。
JSP:当访问第一个<%@page session="true">的JSP时创建,在本网站其他页面切换时都会带着session。
Servlet:若是第一个被访问的对象,在调用request.getSession()或者request.getSession(true)时会被创建。
HttpSession销毁:
1.session.invalidate()方法被调用时,直接销毁。2.服务器卸载了当前web应用。
3.过期后会被消除。setMaxInactiveInterval(int interval) 默认为1800秒
这个时间可以在web.xml中设置。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
URL重写实现session:
当禁用cookie后,是无法通过cookie来实现session的,这时如果想用session,则必须通过URL重写实现。如下:
<form action="<%=response.encodeURL("sessiontest.jsp")%>" method="post">
生成的HTML,会自动将JSESSIONID加到网址后面:login.jsp;jesssionid=xxx"/index.jsp"中的/代表什么意思?
如果是通过Servlet容器解析的,则会处理为webApp根目录,否则只能是浏览器处理,浏览器只知道网站,所以只能是站点根目录。
(forward用的是容器,sendRedirect 用的是站点)
一般开发中,为了避免混淆,尽量使用context以下的全路径
<a href="<%=request.getContextPath()%>/abc/abc.jsp">
防止表单重复提交:
1.表单提交到一个Servlet,而servlet又通过Forward的方式发给另一个JSP页面,由于是转发,此时地址栏中显示的还是servlet的网址,如果此时刷新,则重复提交。
2.在网络卡,或者服务器没有来得及响应时,多次点击[submit]
3.提交后,点击浏览器的返回键,再次点击提交。
防止重复提交:在表单中做一个标记,提交到Servlet时,检查是否和预定义标记一直,
若一致,则受理,并销毁标记,若不一致活没有标记,则提示重复提交。
在表单页面,设置session一个token属性
<%
String tokenValue = new Date().getTime()+"";
session.setAttribute("token", tokenValue);
%>
<form method="post" action="xx">
<input type="hidden" name="tokenValue" value="<%=tokenValue%>">
</form>
在处理表单的页面判断,如果有该标记,则处理。并删除标记。
HttpSession session = request.getSession();
sessionToken = session.getAttribute("token");
paramToken = request.getParameter("tokenValue");
if( sessionToken != null && sessionToken.equals(paramToken)){
session.removeAttribute("token");
}else{
response.sendRedirect(request.getContextPath()+"/success.jsp");
}
这里只是一个粗略的防止重复提交,使用框架开发网站时,各框架基本上都提供了防止强大的防重复提交的方法。
验证码:
可以随机生成一个字符串,放在Session中,并将字符串生成图片(防止别人自动识别,会将图片搞得看不清楚),然后客户提交了数字之后,跟session中的数据进行对比。如果相同则验证通过,删除removeAttribute即可。
<完>