我有一个检索功能的页面,上面只有
1.一个输入检索内容的,文本框[srhInfo]
2.一个检索按钮,post form给search.do这个页面!
操作流程1
当我点检索按钮会提交给,类里面的Search方法
该方法会先trim检索内容.然后在去DB里面查询!操作流程2
可是我发现我,可以通过POST的页面名(search.do)+检索内容的文本框名(srhInfo)+条件(检索内容)
类似http://...search.do?srhInfo=相关检索条件
就跟 操作流程1达到同样的效果!一 由于很多页面,都用的ajax提交的,通过response.getOutputStream().print(rePage)返回的情况,
再迁移去相关的页面,如果用户按照操作流程2去操作的话,因为没有点检索按钮,所以根本没有调用Ajax 的 Js!所以
页面会出现rePage的内容,并且不会迁移到相关页面,不知道这个问题怎么解决啊?二 用户如果用,操作流程2的话,那所有输入项,都需要在类里面做CHECK!以避免执行SQL的时候报错误!,不知道这个问题怎么解决啊?
三 用户如果用,操作流程2的话,那输入http://...search.do?srhInfo=问题1 link以后,用户虽然没有在检索框里输入过 [问题1]三个字,
但这三个字却出现在检索框里,那不是很奇怪吗?
1.一个输入检索内容的,文本框[srhInfo]
2.一个检索按钮,post form给search.do这个页面!
操作流程1
当我点检索按钮会提交给,类里面的Search方法
该方法会先trim检索内容.然后在去DB里面查询!操作流程2
可是我发现我,可以通过POST的页面名(search.do)+检索内容的文本框名(srhInfo)+条件(检索内容)
类似http://...search.do?srhInfo=相关检索条件
就跟 操作流程1达到同样的效果!一 由于很多页面,都用的ajax提交的,通过response.getOutputStream().print(rePage)返回的情况,
再迁移去相关的页面,如果用户按照操作流程2去操作的话,因为没有点检索按钮,所以根本没有调用Ajax 的 Js!所以
页面会出现rePage的内容,并且不会迁移到相关页面,不知道这个问题怎么解决啊?二 用户如果用,操作流程2的话,那所有输入项,都需要在类里面做CHECK!以避免执行SQL的时候报错误!,不知道这个问题怎么解决啊?
三 用户如果用,操作流程2的话,那输入http://...search.do?srhInfo=问题1 link以后,用户虽然没有在检索框里输入过 [问题1]三个字,
但这三个字却出现在检索框里,那不是很奇怪吗?
这种搜索方式本身就是比较奇怪的 其它的已经见怪不怪了
if("POST".equals(request.getMethod())){
// 如果是POST过来的,就继续
}else{
// error
}如果是servlet,可以把doGet方法不实现,只实现doPost方法
另外,即使客户端进行了检查,服务器端也必须再次检查各种数据的合法性。切记!
操作流程2 在浏览器地址栏敲入url回车,这个是doGet方式提交两种方式提交,后台要想得到提交的数据都是通过request这个载体实现的,
方法都是request.getParameter("srhInfo");
第一种提交得到的是表单中名字为srhInfo的文本框内的值,
第一种提交得到的是url问号后名字为srhInfo的值。因为这两种方式都提交了,你在后台又都能取到参数,所以看起来效果就是一样的了,
不过这两种提交方式有着本质上的区别,大多都提倡用第一种提交,doPost方式你想屏蔽掉doGet方式我觉得可以有两种方法:
1。提交后判断是否为点击按钮的提交,按钮点击后在后台能够取得按钮的值,否则为空
2。像6楼那样将doGet方式的提交进行处理,比如覆盖掉HttpServlet基类中的doGet方法,
让它什么也不处理,或者返回一个错误信息
ps:财神爷,我又看见您啦!不过加分好像只能加一次
第二种提交得到的是url问号后名字为srhInfo的值。
---------------------------------------
一.
Java codeif("POST".equals(request.getMethod())){
// 如果是POST过来的,就继续
}else{
// error
}如果用这种方法判断的话,那不是每个被提交的方法里面都要判断了!?
并且如果不是POST提交的话,我的页面将迁移到什么地方?如果
迁移到用request.getHeader("Referer");得到的来的地址的话,
那如何保持该地址上的数值,又是一个麻烦的操作!如果不是POST提交
就直接迁移到错误页面的话,用户体验就很差,而且也不人性话..
如果用filter统一处理,也存在同样的问题!2.另外,即使客户端进行了检查,服务器端也必须再次检查各种数据的合法性。切记! 我现在的做法是 ,客户端用ajax 提交!提交前用js check.并没有在服务端check.
因为如果用户禁止了js的话.他根本就无法提交,所以他必须开启js功能,那自然我在客户端就check了.
但是不知道有没有什么问题
2 action标志,表示此POST是insert还是update
3 hashSign,每个表单每次显示时自动生成,类似于登陆的验证码。方式一个表单被重复提交,可以防止灌水
4 必要时,当然图形的验证码也需要了,可以最大限度的限制灌水机!
什么意思没看明白?2 js可以用工具轻易干掉的!firefox+firebug 就行
JS用工具干掉也没用啊,因为提交就是JS做的.用户如果干掉JS的话根本无法提交了.我的问题是 一.
Java codeif("POST".equals(request.getMethod())){
// 如果是POST过来的,就继续
}else{
// error
} 如果用这种方法判断的话,那不是每个被提交的方法里面都要判断了!?
并且如果不是POST提交的话,我的页面将迁移到什么地方?如果
迁移到用request.getHeader("Referer");得到的来的地址的话,
那如何保持该地址上的数值,又是一个麻烦的操作!如果不是POST提交
就直接迁移到错误页面的话,用户体验就很差,而且也不人性话..
如果用filter统一处理,也存在同样的问题!
2.另外,即使客户端进行了检查,服务器端也必须再次检查各种数据的合法性。切记! 我现在的做法是 ,客户端用ajax 提交!提交前用js check.并没有在服务端check.
因为如果用户禁止了js的话.他根本就无法提交,所以他必须开启js功能,那自然我在客户端就check了.
但是不知道有没有什么问题
Cracker完全有能力做到屏蔽掉Ajax提交和检查的,变为直接提交,像老紫竹
说到的firebug就可以直接在页面上做这些事情的。所以说服务器端的检查是非常有必要的,可以保证数据的正确性和安全性。或者
这么说吧,宁愿不要JavaScript数据验证,但不能不要服务器端数据验证。
这个是什么意思啊?什么叫post是insert还是update?是说对db是update操作还是insert操作吗?二 我的程序在处理提交数据的时候,不仅要判断是否为POST提交,还要判断如下几个东西 referer, 防止异常提交,不如他另存为网页到桌面,修改内容,然后提交
关于您说的这些操作!我特别想知道,
1.您是在filter里面做这种共性的处理吗?
2.您如果判断用户并不是POST提交或者referer提交有问题的话.您会将用户迁移到什么页面.
因为我总觉的迁移到错误画面太不人性化,并且用户体验不好。但是迁移到用户来的画面的话,保持该画面上用户提交时的数据,我不知道怎么保持场景在现:
比如用户登陆成功,在页面 http://www.java2000_net.com/userInfo.do 打算修改自己的个人信息!
但他并没有点[提交]按纽修改.而是模拟[提交]按纽后POST的各项,直接在浏览器上输入http://www.java2000_net.com/userInfo.do?userid=xxx&userName=xxx&old=xxx
然后点回车.这时候您的服务器判断出这个请求并不是POST请求,这时候您会怎么做.对用户的这个请求,如果迁移到错误页面我觉得不合适.
但是如果仍旧迁移到http://www.java2000_net.com/userInfo.do这个页面.这个页面上以前显示的数据.比如用户年龄等数据
,我不知道怎么能保存下来.
Cracker完全有能力做到屏蔽掉Ajax提交和检查的,变为直接提交,像老紫竹
说到的firebug就可以直接在页面上做这些事情的。 所以说服务器端的检查是非常有必要的,可以保证数据的正确性和安全性。或者
这么说吧,宁愿不要JavaScript数据验证,但不能不要服务器端数据验证。-----------------------
Cracker就算把页面下载下来,但是由于我服务端通过获得referer判断了来源.所以
这种提交已经规避了....
一 action标志,表示此POST是insert还是update
这个是什么意思啊?什么叫post是insert还是update?是说对db是update操作还是insert操作吗? 二 我的程序在处理提交数据的时候,不仅要判断是否为POST提交,还要判断如下几个东西 referer, 防止异常提交,不如他另存为网页到桌面,修改内容,然后提交
关于您说的这些操作!我特别想知道,
1.您是在filter里面做这种共性的处理吗?
2.您如果判断用户并不是POST提交或者referer提交有问题的话.您会将用户迁移到什么页面.
因为我总觉的迁移到错误画面太不人性化,并且用户体验不好。但是迁移到用户来的画面的话,保持该画面上用户提交时的数据,我不知道怎么保持 场景在现:
比如用户登陆成功,在页面 http://www.java2000_net.com/userInfo.do 打算修改自己的个人信息!
但他并没有点[提交]按纽修改.而是模拟[提交]按纽后POST的各项,直接在浏览器上输入http://www.java2000_net.com/userInfo.do?userid=xxx&userName=xxx&old=xxx
然后点回车.这时候您的服务器判断出这个请求并不是POST请求,这时候您会怎么做.对用户的这个请求,如果迁移到错误页面我觉得不合适.
但是如果仍旧迁移到http://www.java2000_net.com/userInfo.do这个页面.这个页面上以前显示的数据.比如用户年龄等数据
,我不知道怎么能保存下来.
JavaScript进行操作的,可以添加新的JavaScript代码,而且可以把你原来写好的事
件全部改掉,这个是我对JavaScript一些粗浅的认识。
http://www.java2000_net.com/userInfo.do?userid=xxx&userName=xxx&old=xxx
然后点回车.这时候您的服务器判断出这个请求并不是POST请求,这时候您会怎么做.对用户的这个请求,如果迁移到错误页面我觉得不合适.
高手说一下啊 我也想知道 这个怎么处理。
不过我用 firefox 浏览我的网站 做提交什么的操作根本做不了,我们的网站对firefox基本不支持.
在这种情况下用firefox +firebug是否还能,通过热修改页面上的js,对网站做到威胁?
我用的是prototype架构的ajaxps:高手说话都很cool
这个是我对JavaScript一些粗浅的认识至于其它的内容,我不想再说了。
OVER 不再回复!让我们这些菜鸟好流汗啊....
另外如果老紫竹实在觉得我们的问题 幼稚的话.
能麻烦您帮忙回答一下吗?
万分感谢啊....
Ajax提交,当前页面内容是保持的。 那我如果不用ajax提交呢?
一 action标志,表示此POST是insert还是update
这个是什么意思啊?什么叫post是insert还是update?是说对db是update操作还是insert操作吗? 二 我的程序在处理提交数据的时候,不仅要判断是否为POST提交,还要判断如下几个东西 referer, 防止异常提交,不如他另存为网页到桌面,修改内容,然后提交
关于您说的这些操作!我特别想知道,
1.您是在filter里面做这种共性的处理吗?
2.您如果判断用户并不是POST提交或者referer提交有问题的话.您会将用户迁移到什么页面.
因为我总觉的迁移到错误画面太不人性化,并且用户体验不好。但是迁移到用户来的画面的话,保持该画面上用户提交时的数据,我不知道怎么保持 场景在现:
比如用户登陆成功,在页面 http://www.java2000_net.com/userInfo.do 打算修改自己的个人信息!
但他并没有点[提交]按纽修改.而是模拟[提交]按纽后POST的各项,直接在浏览器上输入http://www.java2000_net.com/userInfo.do?userid=xxx&userName=xxx&old=xxx
然后点回车.这时候您的服务器判断出这个请求并不是POST请求,这时候您会怎么做.对用户的这个请求,如果迁移到错误页面我觉得不合适.
但是如果仍旧迁移到http://www.java2000_net.com/userInfo.do这个页面.这个页面上以前显示的数据.比如用户年龄等数据
,我不知道怎么能保存下来.
这种问题你问的太多了,我不想解释。 你一面想提高体验,还想保持页面的数据,另一面又不用ajax,或者iframe之类的技术,我不知道你想做什么。自相矛盾的想法。.net里面自己有ViewState,我想你用那个也行。2 至于不是POST怎么办?
你爱怎么办都行,因为那是一个非法的提交,你管他干吗!!!正常使用的用户不会出现GET提交表单3 当前页面的数据保存,请看14 至于服务器端的验证,我的观点很明确,你非得自己找很多的理由不做校验,我不做评论了。
我是肯定校验的。每个人的编程体验不同,受刺激的程度不同。我是比较小心的。 客户数据一旦乱掉,哭都没地方。
以上只是我的个人看法,无法保证正确,仅供参考。
在当前的页面上显示一条错误信息不知道这样可以吗?如果用户直接在地址栏上输入地址进行提交的话,重面已经重定向了,那当前页面上的数据
肯定不存在了。PS:prototype对现有的浏览器都有很好的支持,如果你自行写的JS符合W3C标准规范的话
在Firefox上运行是没有问题的,如果你的站点在Firefox上不能正常运行的话,那这个站
点就是失败的。
这种问题你问的太多了,我不想解释。 你一面想提高体验,还想保持页面的数据,另一面又不用ajax,或者iframe之类的技术,我不知道你想做什么。自相矛盾的想法。.net里面自己有ViewState,我想你用那个也行。 55:也许您觉得很幼稚,可是我用AJAX的原因就是我,没办法人性化的解决重复提交的问题!我可以用session时间戳,判断用户是重复提交.可是我没办法
在用户重复提交后,原封不动的(就是保持该页面重复提交前的数据)返回用户提交的那个页面.只能做到发生重复提交就直接迁移到错误画面!但是我一直觉得这样做太不人性话了,因为我自己在浏览页面的过程中经常点右键刷新! 所以用Ajax只是无耐之举!2 至于不是POST怎么办?
你爱怎么办都行,因为那是一个非法的提交,你管他干吗!!!正常使用的用户不会出现GET提交表单
55:您这个说法我同意啊!只是我想作为您这种高手可能对这种问题有更好的解决办法!所以想知道一下而已3 至于检查POST问题,你可以只实现doPost方法,就OK了! 我的程序在处理提交数据的时候,不仅要判断是否为POST提交,还要判断如下几个东西 1 referer, 防止异常提交,不如他另存为网页到桌面,修改内容,然后提交
2 action标志,表示此POST是insert还是update
3 hashSign,每个表单每次显示时自动生成,类似于登陆的验证码。方式一个表单被重复提交,可以防止灌水
4 必要时,当然图形的验证码也需要了,可以最大限度的限制灌水机!
55:最后在问下!关于上面的操作您是在filter里面做这种共性的处理吗?关于这个帖子最后一个问题!拜托了....
同时很感谢您的回复555!让我明白了很多啊
-------------------------*重复提交定义*---------------------------------------
A.JSP提交给A.do <执行insertDB()方法> ,然后迁移到B.JSP,由于采用的是forward,所以IE上的URL还是A.do,这时点右键刷新(已经显示的是B.JSP了),就会再次,执行insertDB()方法.
刷新多少次,执行多少次!
我现在希望
1.怎么能让重复提交后,能原封不动的返回提交的哪个页面啊?(如上例,虽然IE上的地址是A.do,但是显示的却是B.JSP,怎么能点右键刷新,依旧显示B.JSP的内容,只是不重复提交[执行insertDB()方法])
而不是返回一个错误画面. //基类继承MultiActionController
public class BaseController extends MultiActionController{....}
//所有业务逻辑Controller,都继承BaseController
public class xxxController extends BaseController {
public ModelAndView xxxxMethod(HttpServletRequest request,
HttpServletResponse response) throws Exception { //先判断是否是重复提交
boolean r =
xxx.isValidate(request.getParameter("t"),request.getSession());
//按照您写的,如果不是重复提交,执行相关业务逻辑
if(r)
//.......执行相关的业务逻辑
//如果是重复提交,返回提交页面
else
//.......这里我应该怎么写?怎么写能原封不动的返回提交的页面啊?
}
开始我也觉得prototype应该兼容Firefox可是在实际过程中我发现
很多prototype的$方式,Firefox 都不能支持
您可以看下面的link
http://hi.baidu.com/hibydu/blog/item/19be9d12ba621ccfc2fd782a.htmlPS:prototype对现有的浏览器都有很好的支持,如果你自行写的JS符合W3C标准规范的话
在Firefox上运行是没有问题的,如果你的站点在Firefox上不能正常运行的话,那这个站
点就是失败的。
1 页面第一次生成时,附带一个hash编码,这个编码怎么来,你随意,比如一个顺序号也行,最好MD5加密一下。比如
String hashCode = MD5.encode("fdsjflksdjf"+System.currentTimeMillis());
// 然后把它保存到session 里面
Set<String> set =(Set<String>)session.getAttribute("FORM_HASH_CODE");
if(set==null){
set = new HashSet<String>();
session.setAttribute("FORM_HASH_CODE",set);
}
// 添加到里面
set.add(hashCode);
页面生成如下
<form id="MyForm" >
<input type="hidden" id="hashCode" name="hashCode" value="....."/> //这里是那个hashCode2 提交表单的时候,从session里面判断是不是存在需要提交的表单
String hashCode = request.getParameter("hashCode");
Set<String> set = (Set<String>)session.getAttribute("FORM_HASH_CODE");
if(set.contain(hashCode)){
// 继续了,可以进行
// 记得把它删掉,这样下次提交就没戏了!!!
set.remove(hashCode);
}else{
// 非法提交
}3 上面的处理程序可以返回一个新的hashCode,页面通过ajax赋值$("MyForm").reset();
$("hashCode").value=newHashCode();这样,页面的内容就被清空了,而且可以再次填写内容并提交!
首先感谢您把很多宝贵的经验跟我们这些菜鸟分享啊!相信受益的不止我一个啊....另外有个不情之请您能把您说的我的程序在处理提交数据的时候,不仅要判断是否为POST提交,还要判断如下几个东西 1 referer, 防止异常提交,不如他另存为网页到桌面,修改内容,然后提交
2 action标志,表示此POST是insert还是update
3 hashSign,每个表单每次显示时自动生成,类似于登陆的验证码。方式一个表单被重复提交,可以防止灌水
4 必要时,当然图形的验证码也需要了,可以最大限度的限制灌水机!
有这一系列操作的完整代码贴出吗?就是用户点提交按纽,提交给的那个JAVA方法,的内容全部帖下吗? 代码说明问题最清楚啊!
当然您如果不愿意的话!依然很尊敬您啊....