把所有Action及其包含的Methodr入库保存,然后用Filter检测

解决方案 »

  1.   

    我的这个应用系统已经用了Filter了,不想再用了,还有什么方便一点的办法吗?
      

  2.   

    呵呵,这跟Form的validate验证有什么关系,我是说用户从地址栏里这样访问,不是点击页面中的按钮之类的进行的提交。
      

  3.   

    地址栏访问是get方式,跟form无关哦,
      

  4.   

    你在struts-config-*.xml中<action />下面的<forward /> redirect="true" 即可
      

  5.   

    unspecified方法是在没有提供method参数(作为一个对象看待)的情况下启用的,我说的是参数值不存在的情况。
      

  6.   

    String method = request.getparameter("method");
    if(method.equals("add")){//do something}
    if(method.equals("delete")){//do something}else{SYSOUT("error");}
      

  7.   

    上面这位朋友:你的这段代码放在哪个方法里?是add()吗?我觉得这样还是不行,因为,struts根本找不到用户输入的那个随意的方法名,所以找不到执行这段代码的地方哦。
      

  8.   

    通过在struts配置<global-exceptions>,用ActionExceptionHandler相应异常的做处理,转向也好,提示个什么信息也可以。不知道这样能不能满足你的需求了。
      

  9.   

    在web.xml里面使用
    <error-page>
       <exception-type>java.lang.Throwable</exception-type>
       <location>/error.jsp</location>
    </error-page>

    <error-page>
       <error-code>500</error-code>
       <location>/error.jsp</location>
    </error-page> ps:上面的exception可以细分很多种
      

  10.   

    呵呵,谢谢两位的关注。你们要知道,即使action中的这个方法执行后返回的actionforward为null,但也不会报错。所以,以上的方案还不能满足需要。除非,扩展struts的action类等等定制,但是这样造成了移植、升级的不便,因为这是一种侵入行为。我不想搞的这么复杂。不知是否还有其它办法呢?
      

  11.   

    在继承DispatchAction的类中覆盖父类的unspecified方法,
    在方法中抛出一个异常,告诉用户
    你所访问的资源不存在
      

  12.   

    前面我已经说了,unspecified方法是在没有提供method参数(作为一个对象看待)的情况下启用的,我说的是参数值不存在的情况。
      

  13.   

    哥们。竟然你的请求会在Struts-config中跳转到一个ACTION类中。那你String method = request.getparameter("method");得到,在最后else判断不是你book.do?method=*中请求的值就返回到一个JSP面页
      

  14.   

    那就不要用dispatchAction,直接用Action,在execute()里面添加我上面说的内容
      

  15.   

    “哥们。竟然你的请求会在Struts-config中跳转到一个ACTION类中。那你String method = request.getparameter("method");得到,在最后else判断不是你book.do?method=*中请求的值就返回到一个JSP面页”,转到哪个类是知道的,但是我的是DispatchAction,如果用户在地址栏输入不存在的方法名,那么应由哪个方法执行呢?亦即,在哪个方法里面执行你说的这条判断语句呢?“那就不要用dispatchAction,直接用Action,在execute()里面添加我上面说的内容
    ”,你说的背离题干啦,哈哈
      

  16.   

    想了想还是public class SelfDispatchAction extends DispatchAction{
        public void dispatchMethod (){}
    }public class BookAction extends SelfDispatchAction{
    }
      

  17.   

    在继承DispatchAction的类中覆盖父类的unspecified方法,
    在方法中抛出一个异常,告诉用户
    你所访问的资源不存在
    这个就是答案,我都看的恼火了
      

  18.   

    你的答案是错误的,unspecified方法是在没有提供method参数(作为一个“值对”对象看待)的情况下启用的,我说的是参数值(value,不是key)不存在的情况。所以,这时根本不进入unspecified方法!那么,哪来的机会让你从这个方法里面抛出异常!?
      

  19.   

    同意这种说法:
    在web.xml里面使用
    <error-page>
       <exception-type>java.lang.Throwable</exception-type>
       <location>/error.jsp</location>
    </error-page>

    <error-page>
       <error-code>500</error-code>
       <location>/error.jsp</location>
    </error-page>
      

  20.   

    当返回的ActionForward为null时,并不是异常!所以,楼上的朋友,你的配置根本不可能调用的。
      

  21.   

    很奇怪,我的action类总是继承LookupDispatchAction(该类是DispatchAction的子类),然后重载了execute()方法,其中可以方便的获得任何参数,进行控制String method = request.getparameter("method");
    ...另外,即使是get方法,仍旧会调用到form的validate的。只不过你的问题确实和这个无关就是。最后,我想知道ActionExceptionHandler是在什么时候调用的?按道理你的问题应该会抛出异常,然后调用到ActionExceptionHandler的。
      

  22.   

    愚见: 在自己的action类中 覆盖 dispatchMethod 方法
    然后对 NoSuchMethodException 进行捕捉 然后处理
    try {
    return super.dispatchMethod(mapping, form, request, response, method);
    } catch(NoSuchMethodException e) {
    return mapping.findForward("");
    }
      

  23.   

    当然最好自己先写一个类 继承 DispatchAction,
    然后在这个类中 覆盖 dispatchMethod 方法
    然后自己其它的类再继承自己的这个类想必 这个你也知道的 :-)不过这样日志里依然会有
    org.apache.struts.actions.DispatchAction dispatchMethod 
    严重: Action[/book] does not contain method named 'addadd'
    诸如此类的 异常记录 
    但是 可以 “能够转到我事先制作的一个页面”
      

  24.   

    试过,CpRcF(尘埃)的办法是可行的。相对而言,更为彻底的办法是使用全局过滤器,禁止修改地址栏(尤其是地址栏的显式参数较多时,修改任何一个都可能导致系统出错!),我现在就是这样做的。
      

  25.   

    CpRcF(尘埃)的办法今天又试了一下,感觉还是有以下遗憾:1、侵入性比较明显,移植性降低
    2、既然已经捕捉了这个异常,那么,如何使得日志不产生这个异常信息(注意,是让它根本不产生,不是通过调整日志的错误级别来忽略这个Error信息在日志文件中写入)
    ---我的过滤器的核心代码如下:在doFilter()方法里面,加入代码:
        ...
        if (session.getAttribute("ACCOUNT_NAME") == null) {
              httpres.sendRedirect(httpreq.getContextPath() + "/login.jsp");
        } else {
          if (httpreq.getHeader("Referer") == null) {
            httpres.sendRedirect(httpreq.getContextPath() + "/ForbidModUrlBar.jsp");
            return;
          }      filterChain.doFilter(request, response);
        }
        ...
      

  26.   

    不可以在try以前对method参数进行检查吗?这样应该就不会产生异常了。try {
    return super.dispatchMethod(mapping, form, request, response, method);
    } catch(NoSuchMethodException e) {
    return mapping.findForward("");
    }