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;
}
}
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;
}
}