面试的时候被问到的几个问题,求解

ztianlong 2010-11-01 03:07:26
1.除了服务器关闭和重启,什么时候还会调用servlet的destroy方法?



2. 网上购物系统里边,当用户退出的时候,购物车里的信息该怎么弄?

我回答的是:可以放在数据库里持久化,下次再登录的时候读出来.



然后面试官问:还有其他方法没?

我:可以放在cookie里,但是不是很安全,但是cookie里的东西是可以被用户修改的.



面试官:这个一般没人去修改吧?

我:我觉得cookie的方法不太安全,放服务器上还是最好的



面试官:那有什么方法可以防止用户修改cookie?

我:加密吧...



面试官:怎么弄?

我:我说 把信息变成字符串,然后加密下,到服务器上再解密



面试官:那不是还没解决这个问题?

我想了想 ,最后说不知道

这个该怎么回答?

...全文
302 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ztianlong 2010-11-08
  • 打赏
  • 举报
回复
没怎么解决 不过收获了不少 呵呵
leehuat 2010-11-03
  • 打赏
  • 举报
回复
如果可以的话还是保存到本地C盘一个目录下,用到时候在读取,这样减少压力
muheye 2010-11-03
  • 打赏
  • 举报
回复
这个还这不太懂,坐等更多解释!
sxww321 2010-11-03
  • 打赏
  • 举报
回复
购物车的cookie一般不需要防篡改,对cookie有安全考虑的一般是登陆模块,那样的话只能考虑cookie加密了,可以将cookie在服务器端处理下.

假如假设我有一个值要写入Cookie,key="userName" value="cool",写入客户端就是userName=cool,这种情况没做过处理的,想在客户端防止修改不太可能。所以,在往客户端写cookie的时候,加将userName=cool加密附在原始值后(加密的算法随便选择了,DES不错),变成userName=cool|ab95ef23cc6daecc475de,服务器在读这个cookie的时候再解密,同时验证cookie值。
ztianlong 2010-11-03
  • 打赏
  • 举报
回复
嗯 楼上说的有道理 但是怎么防止修改cookie呢?
sxww321 2010-11-02
  • 打赏
  • 举报
回复
保存在Session里,服务器压力比较大,保存在数据库里,容易造成脏数据,还是保存在cookie里比较好,安全性应该不用担心吧,只是购物车而已,又不是订单~
sunboyzsm 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zhuchao_ko 的回复:]

引用 11 楼 ztianlong 的回复:
找到了没?

引用 6 楼 zhuchao_ko 的回复:
購物車這個問題 我記得 老紫竹 專門寫過一篇文章的 我去找找。


HttpSession session = request.getSession();
List<Product> list = session.getAttribute("productCart");
……
[/Quote]
学习了
ztianlong 2010-11-01
  • 打赏
  • 举报
回复
嗯 谢谢楼上的分享 之前我也没有想到这个地方

但是和我的问题关系不是很大啊 呵呵
宁波朱超 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ztianlong 的回复:]
找到了没?

引用 6 楼 zhuchao_ko 的回复:
購物車這個問題 我記得 老紫竹 專門寫過一篇文章的 我去找找。
[/Quote]

HttpSession session = request.getSession();
List<Product> list = session.getAttribute("productCart");
myService.save(list); // 保存购物车数据到数据库这个对象会被多次使用,也会被同一个用户的多个页面使用,所以他对于系统来说是线程不安全的。
比如用户在从产品列表里面选择产品,这面选择3种,他点了查看购物车
该用户还开了另一个页面,继续选择产品。

此时,在显示购物车的页面,有可能运行在一半时,其已经选择的产品列表,并另一个页面的操作修改了。所以显示的产品数量有可能并不是3种。

因为session需要维持当前用户的信息,所以其在多个线程里是共享的。所以是线程不安全的。

不过,这个是表面现象,我们只要正确使用事务,保证数据的准确性,表面的问题可以不用管它。

我们可以把session里面的数据另外保存到一个新的数据对象里,这个对象不再因为session的改变而出现变动。这个对象传递给业务层进行事务处理,保证数据级别的准确。

千万不要把session,或者 session里面的对象直接传递给业务层,因为你的业务处理一半时,同样可能出现session对象被改变的情况。有可能造成重要数据出现偏差。
举例:

session 对应三个产品,
事务里面循环了产品,并计算了总价格,
计算完毕,准备保存时,session变了,产品变成了4个。
此时开始保存。产品保存了4个,可总价格却还是3个的。

出现了数据不一致。

修改后的例子
session 对应三个产品
重新生成一个产品对象数组,把session数据复制过来,然后传递给业务层
事务里面循环计算总价格
计算完毕,此时session变了,但并不影响我们这个新的产品数组对象
保存,三个产品,价格也正确。

HttpSession session = request.getSession();
List<Product> list = session.getAttribute("productCart");
List<Product> listNew = new ArrayList<Product>();
Product pNew;
for(Product p : list){
pNew = new Product();
pNew.setProductId(p.getProductId());
// 其它的复制参数的语句
listNew.add(pNew); // 保存到新的列表里面
}
myService.save(listNew); // 保存购物车数据到数据库,这个是安全的
HttpSession session = request.getSession();
List<Product> list = session.getAttribute("productCart");
List<Product> listNew = new ArrayList<Product>();
Product pNew;
for(Product p : list){
pNew = new Product();
pNew.setProductId(p.getProductId());
// 其它的复制参数的语句
listNew.add(pNew); // 保存到新的列表里面
}
myService.save(listNew); // 保存购物车数据到数据库,这个是安全的

总结:
有些线程安全问题是很隐蔽的,等你出了问题,很可能根本不认为会是那里出的问题。记住一点,Java里面的对象传递的是对象的引用,只要2个地方用了相同的引用,则其它地方的变动,这一面也会变动。
ztianlong 2010-11-01
  • 打赏
  • 举报
回复
找到了没?[Quote=引用 6 楼 zhuchao_ko 的回复:]
購物車這個問題 我記得 老紫竹 專門寫過一篇文章的 我去找找。
[/Quote]
w791918 2010-11-01
  • 打赏
  • 举报
回复
我们以前做的购物车是放在sessio中的。呵呵,destroy方法是在容器移除servlet 时执行
龙心 2010-11-01
  • 打赏
  • 举报
回复
1.除了服务器关闭和重启,什么时候还会调用servlet的destroy方法?
在长时间不用,超时的情况下也会调用destroy方法。
你手动调用的时候也会执行+0+
API定义如下
destroy方法在容器移除servlet 时执行,同样只执行一次。这个方法会在所有的线程的service()方法执行完成或者超时后执行,调用这个方法后,容器不会再调用这个servlet的方法,也就是说容器不再把请求发送给这个servlet。这个方法给servlet释放占用的资源的机会,通常用来执行一些清理任务。



goodmrning 2010-11-01
  • 打赏
  • 举报
回复
不要被面试官牵着鼻子走!
宁波朱超 2010-11-01
  • 打赏
  • 举报
回复
購物車這個問題 我記得 老紫竹 專門寫過一篇文章的 我去找找。
_LiuHui 2010-11-01
  • 打赏
  • 举报
回复
呵呵回复内容太短了!
ztianlong 2010-11-01
  • 打赏
  • 举报
回复
这个...

不说别的了 有好的方法没?
majy 2010-11-01
  • 打赏
  • 举报
回复
呵呵,一问一答,越扯越远
ztianlong 2010-11-01
  • 打赏
  • 举报
回复
关键是他那样问了 我不知道他想考察什么问题
好吃的松子 2010-11-01
  • 打赏
  • 举报
回复
不用加密的,购物车信息中又没用重要东西的,用户爱改不改。

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧