我有一个检索功能的页面,上面只有
 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.   

    我觉得你遇到的问题其实并不复杂,只是你自己没有理解业务之间的关系,对业务的目的不明确。建议可以看看MVC方面的知识,考虑分层来设计譬如,你的search.do提供查询的功能,那么search.do是不应该受业务的变化而变化或者是尽可能的不变化,统一的为业务提供标准的查询结果数据,至于页面怎样展示这些数据都和search.do没有关系可以通过ajax局部刷新页面,也可以把整个页面重新产生另外,对http请求来说,不管是POST还是GET方式,都是request,到达server的parameter都是一样的
      

  2.   

    http://...search.do?srhInfo=相关检索条件 浏览器直接输入这个,,应该是GET而不是POST吧?
      

  3.   

    http://...search.do?srhInfo=相关检索条件
    这种搜索方式本身就是比较奇怪的 其它的已经见怪不怪了
      

  4.   

    很简单,你再服务器端判断
    if("POST".equals(request.getMethod())){
      // 如果是POST过来的,就继续
    }else{
      // error
    }如果是servlet,可以把doGet方法不实现,只实现doPost方法
    另外,即使客户端进行了检查,服务器端也必须再次检查各种数据的合法性。切记!
      

  5.   

    操作流程1 是doPost方式提交
    操作流程2 在浏览器地址栏敲入url回车,这个是doGet方式提交两种方式提交,后台要想得到提交的数据都是通过request这个载体实现的,
    方法都是request.getParameter("srhInfo");
    第一种提交得到的是表单中名字为srhInfo的文本框内的值,
    第一种提交得到的是url问号后名字为srhInfo的值。因为这两种方式都提交了,你在后台又都能取到参数,所以看起来效果就是一样的了,
    不过这两种提交方式有着本质上的区别,大多都提倡用第一种提交,doPost方式你想屏蔽掉doGet方式我觉得可以有两种方法:
    1。提交后判断是否为点击按钮的提交,按钮点击后在后台能够取得按钮的值,否则为空
    2。像6楼那样将doGet方式的提交进行处理,比如覆盖掉HttpServlet基类中的doGet方法,
    让它什么也不处理,或者返回一个错误信息
    ps:财神爷,我又看见您啦!不过加分好像只能加一次
      

  6.   

    上面有点小笔误,改正一下
    第二种提交得到的是url问号后名字为srhInfo的值。
      

  7.   

    to 老紫竹
    ---------------------------------------
    一.
    Java codeif("POST".equals(request.getMethod())){
      // 如果是POST过来的,就继续
    }else{
      // error
    }如果用这种方法判断的话,那不是每个被提交的方法里面都要判断了!?
    并且如果不是POST提交的话,我的页面将迁移到什么地方?如果
    迁移到用request.getHeader("Referer");得到的来的地址的话,
    那如何保持该地址上的数值,又是一个麻烦的操作!如果不是POST提交
    就直接迁移到错误页面的话,用户体验就很差,而且也不人性话..
    如果用filter统一处理,也存在同样的问题!2.另外,即使客户端进行了检查,服务器端也必须再次检查各种数据的合法性。切记! 我现在的做法是 ,客户端用ajax 提交!提交前用js check.并没有在服务端check.
    因为如果用户禁止了js的话.他根本就无法提交,所以他必须开启js功能,那自然我在客户端就check了.
    但是不知道有没有什么问题
      

  8.   

    1 你用Ajax提交,不涉及页面数值保存问题。2 js可以用工具轻易干掉的!firefox+firebug 就行,3 提交都可以模拟出来,Ajax就可以了,哈哈!可以模拟GET/POSt提交哦!呵呵!这个没什么可讨论的,服务器端你必须检查。OK!除非你认为安全和有效性不重要,比如年龄1000岁!
      

  9.   

    至于检查POST问题,你可以只实现doPost方法,就OK了!我的程序在处理提交数据的时候,不仅要判断是否为POST提交,还要判断如下几个东西1 referer, 防止异常提交,不如他另存为网页到桌面,修改内容,然后提交
    2 action标志,表示此POST是insert还是update
    3 hashSign,每个表单每次显示时自动生成,类似于登陆的验证码。方式一个表单被重复提交,可以防止灌水
    4 必要时,当然图形的验证码也需要了,可以最大限度的限制灌水机!
      

  10.   

    1   你用Ajax提交,不涉及页面数值保存问题。 
         什么意思没看明白?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了. 
    但是不知道有没有什么问题 
      

  11.   

    第二个问题,有意思,要知道客户端的HTML代码可以被用户复制下来后更改的,
    Cracker完全有能力做到屏蔽掉Ajax提交和检查的,变为直接提交,像老紫竹
    说到的firebug就可以直接在页面上做这些事情的。所以说服务器端的检查是非常有必要的,可以保证数据的正确性和安全性。或者
    这么说吧,宁愿不要JavaScript数据验证,但不能不要服务器端数据验证。
      

  12.   

    Ajax提交,当前页面内容是保持的。至于其它的内容,我不想再说了。OVER 不再回复!
      

  13.   

    一   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这个页面.这个页面上以前显示的数据.比如用户年龄等数据
    ,我不知道怎么能保存下来.
      

  14.   

    to 第二个问题,有意思,要知道客户端的HTML代码可以被用户复制下来后更改的, 
    Cracker完全有能力做到屏蔽掉Ajax提交和检查的,变为直接提交,像老紫竹 
    说到的firebug就可以直接在页面上做这些事情的。 所以说服务器端的检查是非常有必要的,可以保证数据的正确性和安全性。或者 
    这么说吧,宁愿不要JavaScript数据验证,但不能不要服务器端数据验证。-----------------------
    Cracker就算把页面下载下来,但是由于我服务端通过获得referer判断了来源.所以
    这种提交已经规避了....
      

  15.   

    to 老紫竹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这个页面.这个页面上以前显示的数据.比如用户年龄等数据 
    ,我不知道怎么能保存下来.
      

  16.   

    哦,对于第二个问题,firebug用不着把页面拿下来,直接在请求页面上就可以直接对
    JavaScript进行操作的,可以添加新的JavaScript代码,而且可以把你原来写好的事
    件全部改掉,这个是我对JavaScript一些粗浅的认识。
      

  17.   

    :-->
    http://www.java2000_net.com/userInfo.do?userid=xxx&userName=xxx&old=xxx   
    然后点回车.这时候您的服务器判断出这个请求并不是POST请求,这时候您会怎么做.对用户的这个请求,如果迁移到错误页面我觉得不合适.   
    高手说一下啊 我也想知道 这个怎么处理。
      

  18.   

    to bao110908  感谢您了...明白了..原来这个这么厉害..我还只停留在用ie的自带去掉js功能来模拟Cracker.
    不过我用 firefox 浏览我的网站 做提交什么的操作根本做不了,我们的网站对firefox基本不支持.
    在这种情况下用firefox +firebug是否还能,通过热修改页面上的js,对网站做到威胁?
    我用的是prototype架构的ajaxps:高手说话都很cool 
    这个是我对JavaScript一些粗浅的认识至于其它的内容,我不想再说了。 
    OVER   不再回复!让我们这些菜鸟好流汗啊....
      

  19.   

    to   bao110908 
    另外如果老紫竹实在觉得我们的问题 幼稚的话.
    能麻烦您帮忙回答一下吗?
    万分感谢啊....
    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这个页面.这个页面上以前显示的数据.比如用户年龄等数据   
    ,我不知道怎么能保存下来.
      

  20.   

    1 客户体验,Ajax就是提高客户体验,不要问我[那我如果不用ajax提交呢?]
      这种问题你问的太多了,我不想解释。 你一面想提高体验,还想保持页面的数据,另一面又不用ajax,或者iframe之类的技术,我不知道你想做什么。自相矛盾的想法。.net里面自己有ViewState,我想你用那个也行。2 至于不是POST怎么办?
      你爱怎么办都行,因为那是一个非法的提交,你管他干吗!!!正常使用的用户不会出现GET提交表单3 当前页面的数据保存,请看14 至于服务器端的验证,我的观点很明确,你非得自己找很多的理由不做校验,我不做评论了。
    我是肯定校验的。每个人的编程体验不同,受刺激的程度不同。我是比较小心的。 客户数据一旦乱掉,哭都没地方。
    以上只是我的个人看法,无法保证正确,仅供参考。
      

  21.   

    是否是只允许POST方式的提交,不允许GET的提交呢?如果在服务器端检查到是GET方式提交的话,你也可以通过Ajax在页面上弹出个对话框或者
    在当前的页面上显示一条错误信息不知道这样可以吗?如果用户直接在地址栏上输入地址进行提交的话,重面已经重定向了,那当前页面上的数据
    肯定不存在了。PS:prototype对现有的浏览器都有很好的支持,如果你自行写的JS符合W3C标准规范的话
    在Firefox上运行是没有问题的,如果你的站点在Firefox上不能正常运行的话,那这个站
    点就是失败的。
      

  22.   

    lz,最好是做服务器端的验证,这个是很重要的,客户端不做就是可以的(有时我就懒做客户端验证,当然我知道这是不好的,不过有点黑客和编程安全基础的都可以把你的js验证绕过去),但一定要做服务器端验证,不然要是数据乱了,那个时候就不是什么欲哭无泪了,而就像老紫竹说的一样,真的是连哭得地方都没有.
      

  23.   

    1   客户体验,Ajax就是提高客户体验,不要问我[那我如果不用ajax提交呢?] 
        这种问题你问的太多了,我不想解释。   你一面想提高体验,还想保持页面的数据,另一面又不用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   
    //.......这里我应该怎么写?怎么写能原封不动的返回提交的页面啊?   
    }   
      

  24.   

    to bao110908 !非常感谢您啊
    开始我也觉得prototype应该兼容Firefox可是在实际过程中我发现
    很多prototype的$方式,Firefox 都不能支持
    您可以看下面的link
    http://hi.baidu.com/hibydu/blog/item/19be9d12ba621ccfc2fd782a.htmlPS:prototype对现有的浏览器都有很好的支持,如果你自行写的JS符合W3C标准规范的话 
    在Firefox上运行是没有问题的,如果你的站点在Firefox上不能正常运行的话,那这个站 
    点就是失败的。
      

  25.   

    我很少用filter, 一般除了日志,判断登陆用一下,其他的都是各自用个各自的。配合一些辅助类足以(较少重复代码的编写量,呵呵)。重复提交的hashCode我给你些思路
    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();这样,页面的内容就被清空了,而且可以再次填写内容并提交!
      

  26.   

    to 老紫竹   
    首先感谢您把很多宝贵的经验跟我们这些菜鸟分享啊!相信受益的不止我一个啊....另外有个不情之请您能把您说的我的程序在处理提交数据的时候,不仅要判断是否为POST提交,还要判断如下几个东西   1       referer,       防止异常提交,不如他另存为网页到桌面,修改内容,然后提交   
    2       action标志,表示此POST是insert还是update   
    3       hashSign,每个表单每次显示时自动生成,类似于登陆的验证码。方式一个表单被重复提交,可以防止灌水   
    4       必要时,当然图形的验证码也需要了,可以最大限度的限制灌水机!   

    有这一系列操作的完整代码贴出吗?就是用户点提交按纽,提交给的那个JAVA方法,的内容全部帖下吗? 代码说明问题最清楚啊!
    当然您如果不愿意的话!依然很尊敬您啊....