HttpSession笔记

Session
JavaEE中的接口为HttpSession
session通过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即可。

<完>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值