论坛首页 Java企业应用论坛

如何防止用户恶意的F5刷新操作的问题?

浏览 20070 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-02-26  
目前的代码如下:

public class UserVisiteRecord {
	private int _interval = 3000;

	private String url = "-1";

	private long time = 0;

	public UserVisiteRecord(String url) {
		init(url);
	}

	private void init(String url) {
		//synchorized(user) 如何?
		this.url = url;
		time = new Date().getTime();
	}

	public boolean isValidateVisite(String currentUrl) {
		long currenttime = new Date().getTime();
		if (currentUrl.equals(url) && currenttime - time < _interval) {
			return false;
		}
		init(currentUrl);
		return true;
	}

	public void release() {
		this.url = "-1";
	}
}


public class SecurityInterceptor extends HandlerInterceptorAdapter {
	protected final Log log = LogFactory.getLog(SecurityInterceptor.class);

	private final Map _cache = new HashMap();

	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler, ModelAndView mv)
			throws Exception {
		User user = (User) WebUtils.getSessionAttribute(request, "user");
		if (null != user) {
			Integer userid = user.getLinkmanid();
			UserVisiteRecord uvr = (UserVisiteRecord) _cache.get(userid);
			if (null != uvr) {
				uvr.release();
			}
		}
	}

	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		User user = (User) WebUtils.getSessionAttribute(request, "user");
		if (user == null) {
			ModelAndView modelAndView = new ModelAndView(new RedirectView(
					"/cm/login.do"));

			throw new ModelAndViewDefiningException(modelAndView);
		} else {
			Integer userid = user.getLinkmanid();
			UserVisiteRecord uvr = (UserVisiteRecord) _cache.get(userid);
			String url = request.getRequestURL().toString();
			if (null == uvr) {
				_cache.put(userid, new UserVisiteRecord(url));
			} else {
				if (!uvr.isValidateVisite(url)) {
					ModelAndView error = new ModelAndView("error");
					throw new ModelAndViewDefiningException(error);
				}
			}
			return true;
		}
	}
0 请登录后投票
   发表时间:2007-02-26  
你的测试如何写啊?(现在比较关心这种特例的测试写法)
0 请登录后投票
   发表时间:2007-02-26  
抛出异常的爱 写道
你的测试如何写啊?(现在比较关心这种特例的测试写法)
这个没有考虑过,哪位给点经验?
0 请登录后投票
   发表时间:2007-02-26  
jamesby 写道
抛出异常的爱 写道
你的测试如何写啊?(现在比较关心这种特例的测试写法)
这个没有考虑过,哪位给点经验?
大约是要开多个线程来测试的吧?如何来作我也没作过正在想怎么作呢
0 请登录后投票
   发表时间:2007-02-26  
还应先在浏览器中做第一次保护 屏蔽F5 Crl+R
0 请登录后投票
   发表时间:2007-02-26  
chpn 写道
还应先在浏览器中做第一次保护 屏蔽F5 Crl+R

我遇到的是用鼠标点了N回
但是由于报表天生就慢
他就怎么也出不来
点了5分钟把机器玩的差点当了

所以要加缓存
是让他们点了N次之后不用再去数据库里查寻
也能得出结果否则他一看出了结果之后一激动点了其它的的连接回不来了...
当时的查询如果不加条件大约要用2分钟左右.
0 请登录后投票
   发表时间:2007-02-27  
屏蔽f5,加什么控制,这些都是“标”,程序员这么处理问题是够失败的,应该把查询的实现机制重新做个考虑,让其不成为问题,而不是有了问题去“补”。一孔之见,不要见怪。
0 请登录后投票
   发表时间:2007-02-27  
newman 写道
屏蔽f5,加什么控制,这些都是“标”,程序员这么处理问题是够失败的,应该把查询的实现机制重新做个考虑,让其不成为问题,而不是有了问题去“补”。一孔之见,不要见怪。

有个东西叫报表软件
是公司花了N大元买来的
如果想要治本让他们把源码拿来我把lessonees关了明年就可以不用付钱了
0 请登录后投票
   发表时间:2007-02-27  

看了这么多回复好像还没有人讲到F5刷屏造成出现异常的本质原因,我这里就说一下吧,虽然也不一定就对。

Http的请求处理和数据库的处理都是有能力限制的,当用户不断的f5刷屏后,系统就接受了多次Http请求,因为每个请求的处理时间都比较长,所有占用的大量的资源,尤其是数据库的资源,当用户刷屏达到一定次数后达到了数据库的处理能力极限,这样后面的请求就会超时报错。

解决这样的问题可以从两个方面来考虑,增加系统处理能力(比如缓存)或者降低资源占用(不要重复执行业务),实现的具体形式是可以有多种多样的,不过需要注意的是用户刷屏后浏览器的前一次请求在浏览器端可能被放弃了,即就算服务器程序返回了结果浏览器可能也不会处理,这时浏览器可能只会处理最后一次访问的结果,所以如果想要用户放弃刷屏最好以最快的速度返回给他一个页面,告诉他不要刷屏了。

但在客户是上帝的今天,告诉他不要刷屏估计也有点不合适,所以在客户端直接屏蔽F5也不妨是一个好办法。

0 请登录后投票
   发表时间:2007-02-27  

magic_seek 写道:

看了这么多回复好像还没有人讲到F5刷屏造成出现异常的本质原因,我这里就说一下吧,虽然也不一定就对。

Http的请求处理和数据库的处理都是有能力限制的,当用户不断的f5刷屏后,系统就接受了多次Http请求,因为每个请求的处理时间都比较长,所有占用的大量的资源,尤其是数据库的资源,当用户刷屏达到一定次数后达到了数据库的处理能力极限,这样后面的请求就会超时报错。

解决这样的问题可以从两个方面来考虑,增加系统处理能力(比如缓存)或者降低资源占用(不要重复执行业务),实现的具体形式是可以有多种多样的,不过需要注意的是用户刷屏后浏览器的前一次请求在浏览器端可能被放弃了,即就算服务器程序返回了结果浏览器可能也不会处理,这时浏览器可能只会处理最后一次访问的结果,所以如果想要用户放弃刷屏最好以最快的速度返回给他一个页面,告诉他不要刷屏了。

但在客户是上帝的今天,告诉他不要刷屏估计也有点不合适,所以在客户端直接屏蔽F5也不妨是一个好办法。


你是我那个项目的客户吧
这些要求都给你实现了

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics