session知识点

session的作用,生命周期
session的原理
session使用细节,多浏览器共享session
重启浏览,关闭cookie的话无解
禁用cookie了--->解决方案 重写URL --->response.encodeURL("day07/servlet/SessionDemo1");
response.encodeRedirectURL("day07/servlet/SessionDemo1");
javascript:void(0) //去掉超链接默认行为
//手工以cooie形式发sessionid,以解决关闭浏览器后,上次买的东西还在(cooike未禁用)
客户端防表单重复提交和服务器端session防表单重复提交(服务器有延迟)
El表达式用于获取数据(${data})
6  总结
Session将信息保存在服务器上,而Cookie保存在客户端上
Session比Cookie更安全,Session比Cookie更占资源
开发原则:Session要尽量少用--尽量少向Session中保存信息
session使用了Cookie的机制,如果Cookie被禁用,则Session也无法使用,因为客户端的session ID以cookie形式,保存在了客户端的内存当中,这个时候我们可以通过url重写,来保证session的有效性.
重写url的方法如下
resp.encodeURL(request.getRequestURL().toString()); 
解决:
1.javascript阻止表单重复提交
   <script type="text/javascript">
               var iscommitted =false;//记录表单是否提交,2.设置按钮不可用
       function dosubmit(){
          if(!iscommitted){
       iscommitted =true;
       return true;
  }else{
    return false;
  }
       }

   </script>


2。服务器端防止表单重复提交


public class FormServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//产生随机数(表单号)
TokenProccessor tp =TokenProccessor.getInstance();
String token =tp.generateToken();
        boolean b =isTokenValid(request);
        if(!b){
        System.out.println("不要重复提交");
        return;
        }
    request.getSession().removeAttribute("token");
    System.out.println("想数据库中提交注册。。。。");
}
    //判斷表單是否提交
public boolean isTokenValid(HttpServletRequest request) {
String client_token = request.getParameter("token");
if (client_token == null) {
return false;
}
String server_token = (String) request.getSession().getAttribute(
"token");
if (server_token == null) {
return false;
}
if (!server_token.equals(client_token)) {
return false;
}
return true;
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

}

static class TokenProccessor { // 令牌
/**
* 1.把构造方法私有 2.自己创建一个 3.对外暴露一个方法,允许获取上面创建的对象
*/
private TokenProccessor() {
}

private static final TokenProccessor instance = new TokenProccessor();

public static TokenProccessor getInstance() {
return instance;

}
       //任意的二进制数据是三个字节 ,指纹128位字节
public String generateToken() {
String token = System.currentTimeMillis() + new Random().nextInt()
+ "";
try {
MessageDigest md = MessageDigest.getInstance("md5");
byte[] md5 = md.digest();
//上传下载用到base64
// base64編程:把三个字节变成四个字节 ,编之后最大不会超过64
BASE64Encoder encoder = new BASE64Encoder();
encoder.encode(md5);

} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
return null;
       
}
}

猜你喜欢

转载自lvwenwen.iteye.com/blog/1504368