我做了一个过滤器(结合struts和hibernate),我的意图是:如果用户直接访问需要登录才能访问到的管理页面,则先跳转到提示页面之后五秒自动跳转到登录页面。可是结果因为把整个web应用都过滤了,所以当请求跳转到登录页面时又因为没有登录而又跳转到提示页面,之后一直循环。
    我开始本想把登录页面另建立在一个目录下,之后在配置文件中设置过滤其他文件,而登录页面所在的目录资源不予以过滤,这样一来,还要重新去配置怎么过滤action。而且我也不知道怎么去过滤action。比如说com.zhang.action包下有actioncollected类delete方法,对应的action是delete,怎么在过滤器中配置?
    附带web.xml部分代码:    <filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.zhang.util.FilterAll</filter-class>
  <init-param>
    <param-name>loginPage</param-name>
    <param-value>/Login.jsp</param-value>
  </init-param>
</filter> <filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>    有没有更好的办法 ?

解决方案 »

  1.   

    1.你本身的思路就有问题
    你用过滤器拦截,是因为session中没有USER,你跳转以后还是没有USER,然后不就死循环了吗那是必然的啊
    你可以用权限,但是似乎更麻烦,
    为什么你要等5秒后去登录呢??如果我是用户等5秒在那响应,我就会关掉你的网站
      

  2.   

    在过滤器中处理 判断
    比如判断请求的url的后缀名包括主页就不过滤
      

  3.   

    能不能详细点?没看懂。过滤器类贴上,烦劳修改下。public class FilterAll implements javax.servlet.Filter {
        
    private FilterConfig filterConfig;
    private String loginPage = "Login.jsp";

    public void destroy() {
    filterConfig = null;
            System.gc();
    } public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws IOException, ServletException {
            HttpServletRequest req = (HttpServletRequest)request;
            HttpServletResponse res = (HttpServletResponse)response;
            HttpSession session = req.getSession(true);
            if(session.getAttribute("user") != null ){
             chain.doFilter(request, response);
             return;
            }
            else{
             ServletContext ctx = filterConfig.getServletContext();
             setForwordURI(req);
             ctx.getRequestDispatcher(loginPage).forward(req, res);
       
            }
    } public void init(FilterConfig config) throws ServletException {
     filterConfig = config;
     if(filterConfig.getInitParameter("loginPage") != null)
                    loginPage = filterConfig.getInitParameter("loginPage");
    }


    private void setForwordURI(HttpServletRequest request){
    StringBuffer requestURI = new StringBuffer(request.getRequestURI());
    String queryString = request.getQueryString();
    if(queryString != null){
    requestURI.append("?").append(queryString);
    }
    request.setAttribute("orignURL", requestURI.toString());
    }}
      

  4.   

    这个要做起来,还是得用权限管理,看看spring的权限框架acegi,按你说的做,越做越复杂,思路没理顺
      

  5.   

    <filter>
            <filter-name>MyFilter</filter-name>
            <filter-class>com.zhang.util.FilterAll</filter-class>
              <init-param>
                <param-name>loginPage</param-name>
                <param-value>/Login.jsp</param-value>
              </init-param>
        </filter>    <filter-mapping>
            <filter-name>MyFilter</filter-name>
            <url-pattern>*.do</url-pattern>
        </filter-mapping>