一种方法你的每一个jsp都对应一个action类,访问路径在struts-config里配置好,在界面上不要让用户看到任何jsp文件的链接,都应该是.do的,你的用户验证就在action里做。
但是为了防止有些“非法用户”直接找到jsp文件的路径进行访问,我们不得不在jsp里再做一次验证,这个方法struts的例子里有,使用自定义标记。
另一种是把所有的jsp文件都移到WEB-INF目录下,这样用户是无法通过在浏览器地址栏输入url进行访问的,必须要通过struts的return mapping.findForward("success");success在配置文件里绑定一个jsp页面,进行访问,这样就可以不在jsp页面进行权限验证,只在action里验证就可以了。
这种访问方式目前只有tomcat4或5,jboss,weblogic8提供。像weblogic7就不能用struts来访问WEB-INF下的内容。

解决方案 »

  1.   

    放在WEB-INF下面这个我已经做了,我也对应了用户都是看到.do,关键是能不能有个方法凌驾于所有的Action之上,进行判断,因为我要更新在线数据库等状态,如果每个Action里面都写判断或者调用Bean,代码重复非常多,能不能依靠继承Action或者ActionServlet来做?
      

  2.   

    你是不是想在用户登陆的时候做校验啊,如果是的话,你可以用validator来校验,它提供可户端校验和服务器端校验,你可以自己写你的数据校验,这是我的愚见,说错了请不要见笑
      

  3.   

    不是,只要用户一打开我的网站任何一页,系统就会将他加入在线用户数据库,然后给她的cookie赋值等操作,确定级别等等,我有一个判断用户是否已经经过了这种处理的类,但是不能在每个action都调用一次吧,多麻烦啊,不知道直接写道action或者actionservlet里面去好不好,有什么问题等等
      

  4.   

    顶一下!顺便问问如果Action最下面写成这种findForward("success")那么没法带参数过去吧,比如想发到aaa.do?name=a这样的,就不能采用这种方法了是么
      

  5.   

    楼主可以看看Spring的AOP面向方面编程,可以构建一个强大的验证点来实现你的要求,就是强大到了难以实现~~~~
      

  6.   

    …… - -;我没有那么强 …… 就想用struts做好好了 …… 这样下去永远也好不了了 ……
      

  7.   

    以下是我个人写的简单架构,希望能有点点帮助
    public abstract class ActionBase extends Action {
      public final String WEB_INF = "/WEB-INF/";
      public ActionBase() {
      }  public ActionForward execute(ActionMapping mapping,ActionForm form,
                                   HttpServletRequest request,HttpServletResponse response)
                                   throws Exception
      {
        String strforward = CommonStants.ACTION_FORWARD_SUCCESS;
        HttpSession session = request.getSession();
        try{
          if (null == StaticStants.getProp()) {
            //查找web-inf的路径
            ServletContext context = servlet.getServletContext();
            String defaultroot = context.getRealPath("/");
            String configroot = defaultroot + WEB_INF + CommonStants.SYSTEM_CONFIG_FILE;        ParseXML xml = new ParseXML();
            //解析xml文件开始
            //parse(xml的文件路径)
            xml.parse(configroot);
            //解析完成        //设置配置信息到Properties
            prop = xml.getProps();
            //设置到全局变量
            StaticStants.setProp(prop);
            if (prop != null && !prop.isEmpty())
            {
              //如果有数据库信息,设置
              if(prop.getProperty(CommonStants.DRIVER_NAME) != null &&
                 prop.getProperty(CommonStants.HOST_URL) != null &&
                 prop.getProperty(CommonStants.USER_NAME) != null &&
                 prop.getProperty(CommonStants.USER_PWD) != null) {            //设置数据库连接信息
                DataBaseManager.setConnection(prop.getProperty(CommonStants.DRIVER_NAME),
                    prop.getProperty(CommonStants.HOST_URL),
                    prop.getProperty(CommonStants.USER_NAME),
                    prop.getProperty(CommonStants.USER_PWD));
              }
              if (prop.getProperty(CommonStants.AUTO_COMMIT) != null) {
                DataBaseManager.setAutoCommit(prop.getProperty(CommonStants.AUTO_COMMIT));
              }
              //init count
              if (prop.getProperty(CommonStants.CONNECT_INITCOUNT) != null) {
                DataBaseManager.setInitCount(prop.getProperty(CommonStants.CONNECT_INITCOUNT));
              }
              //max count
              if (prop.getProperty(CommonStants.CONNECT_MAXCOUNT) != null) {
                DataBaseManager.setMaxCount(prop.getProperty(CommonStants.CONNECT_MAXCOUNT));
              }
              //timeout
              if (prop.getProperty(CommonStants.CONNECT_TIMEOUT) != null) {
                DataBaseManager.setTimeOut(prop.getProperty(CommonStants.CONNECT_TIMEOUT));
              }
              if (prop.getProperty(CommonStants.ERR_MSG_FILEURL) != null) {
                //设置错误文件路径
                String errmsgroot = defaultroot + WEB_INF + prop.getProperty(CommonStants.ERR_MSG_FILEURL);
                StaticStants.setErrMsgUrl(errmsgroot);
              }
            }
          }
          Vector validevec_= doValidate(mapping,form,request,response);
          //clear err msg
          if (session.getAttribute(LsConstants.ACTION_ERROR) != null) {
              session.removeAttribute(LsConstants.ACTION_ERROR);
          }
          //clear end
          if ( validevec_.size() > 0 ) {
            session.setAttribute(LsConstants.ACTION_ERROR,validevec_);
            strforward = CommonStants.ACTION_FORWARD_ERROR;
          } else {
            ActionForward forward = doMainAction(mapping,form,request,response);
            strforward = forward.getName();
          }
          doPostAction(mapping,form,request,response);
        } catch(Exception e){
          strforward = CommonStants.ACTION_FORWARD_ERROR;
        }
        return (mapping.findForward(strforward));
      }
     /**
       *数据验证
       */
      public Vector doValidate(ActionMapping mapping,ActionForm form,
                                     HttpServletRequest request,HttpServletResponse response){
        return (new Vector());
      }
     /**
       *主操作
       */
      public abstract  ActionForward doMainAction(ActionMapping mapping,ActionForm form,
                                                  HttpServletRequest request,HttpServletResponse response)
          throws IOException, ServletException; /**
       *必须操作
       */
      public abstract  void doPostAction(ActionMapping mapping,ActionForm form,
                                        HttpServletRequest request,HttpServletResponse response)
          throws IOException, ServletException;
    }
    以后每个action再继承ActionBase,如果你有一个验证是所有action都要使用的,就在doValidate(..)操作,以后每个action还可以自己做验证,先super(),然后写自己的验证代码
    例如
    public class FittingsUseShowAction extends ActionBase {  public FittingsUseShowAction() {
      }
      public Vector doValidate(ActionMapping mapping,ActionForm form,
                               HttpServletRequest request,HttpServletResponse response)
      {
        ……
        super(mapping,form,request,response);
      }
    看看吧,呵呵,不知道行不行
      

  8.   

    呵呵谢谢楼上的,看来大家都是放在Action里面啊,不过我不想在Action里面做太多的操作,代码太乱了,能不能截获当前的xxx.do和参数forward到另外一个Action里面处理完了再forward回来那?
      

  9.   

    你说的是触发action(A),然后专门用一个action(B)处理你所希望处理的事务,然后再返回(A)??
      

  10.   

    supersunyi(赖赖虫) 没错!因为我觉得系统的Action里面最好不要放很多乱七八糟的代码,最好可以到专用的actionB里面去处理然后再forward回actionA,但是我不知道怎么截获当前的action名字和参数呵呵,不知道您还有更好额方法么?
      

  11.   

    <--------------高手看过来! 能不能搞定这个?
    http://community.csdn.net/Expert/topic/3472/3472337.xml?temp=.2961847
      

  12.   

    我当初的做法是写一个abstract BaseAction继承Action,在这个BaseAction的execute里面去验证用户内容,然后在execute的最后调用一个abstract doExecute(mapping,forward,request,response)函数,所有的其他需要验证的action只需要实现BaseAction的doExecute抽象函数即可。
      

  13.   

    呵呵,这个好象不太可能吧,a->b,那必须在struts-config.xml里面设置啊(这个没问题),但b->a就不行了,因为这个是“多”对“一”的关系,b->a这个是不能配置的,哎,看来只能帮你顶了,研究一下如何在程序中不走struts-confix.xml里面的配置,自己去跳转
    我也在考虑考虑
      

  14.   

    是啊呵呵,关键是跳转过去处理完了b怎么知道a的action名字和参数,能够截获这个就ok了另外li_d_s(我是小鬼) 我写一个abstract BaseAction,里面什么方法都不用写吧,只要写个execute调用我得专用bean来处理然后再super一下就可以了是么,我没有用过继承,不知道别的方法还要重新写出来然后每个里面都super么?美必要吧因为我只修改一个方法。另外,如果再execute里面,我开头就调用了我的验证方法,里面包括写入cookie,然后再处理这个Action,那么写入的cookie能够在显示出来的页面里面立刻显示出来么,以前一个jsp里面调用bean是不能写入立刻就生效的需要刷新一下,所以我都是跳转到另外一个jsp写然后跳转回来就好了:)
      

  15.   

    是啊呵呵,关键是跳转过去处理完了b怎么知道a的action名字和参数,能够截获这个就ok了另外li_d_s(我是小鬼) 我写一个abstract BaseAction,里面什么方法都不用写吧,只要写个execute调用我得专用bean来处理然后再super一下就可以了是么,我没有用过继承,不知道别的方法还要重新写出来然后每个里面都super么?美必要吧因为我只修改一个方法。另外,如果再execute里面,我开头就调用了我的验证方法,里面包括写入cookie,然后再处理这个Action,那么写入的cookie能够在显示出来的页面里面立刻显示出来么,以前一个jsp里面调用bean是不能写入立刻就生效的需要刷新一下,所以我都是跳转到另外一个jsp写然后跳转回来就好了:)
      

  16.   

    如果是每个页面都需要验证,就不要在页面上去验证,而应该将验证过程放到FILTER中去执行,由于FILTER必然在页面执行前执行,所以,还可以避免用户通过保存页面而直接进入内页。
      

  17.   

    应该可以用filter,servlet 2.4的filter已经很强大了,可以做很多配置的。
      

  18.   

    同意楼上,用 filter来做,配置每一个页面都先filter处理
    在filter里面查询 cookie 放入session
    然后进行 session 判断 是不是上线了
    基本上可以了吧!
      

  19.   

    谢谢大家,现在我倒是用了一个进行编码的filter,看来也要扩加功能了呵呵