我想在过滤器里面的url-patten里面的所有的请求都满足,除了某些之外,我应该怎样配置呢
我是想通过一个Filter来验证当前用户是否已登录,如果没有登录的话就转到登录页面;但是这样的话那个登录页面是不需要进行验证的,所以在url-patten里面我要把登录的那个页面除去,但我不知道应该怎样配置,请有经验的朋友们帮一下忙,谢谢了!

解决方案 »

  1.   

    直接在filter中写逻辑代码排除登陆页面
      

  2.   

    不需要额外配置,在filter中通过request对象可以取得请求的url,如果是请求登录页面,就不用验证
      

  3.   

    public class LoginFilter implements Filter { private String filterPattern;

    public void destroy() {
    } public void doFilter(ServletRequest req, ServletResponse resp,
    FilterChain chain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest)req;
    HttpServletResponse response = (HttpServletResponse)resp;

    //requestURI = ?
    String requestURI = request.getRequestURI();

    String page = requestURI.substring(request.getContextPath().length());

    //判断HTTP SESSION中是否有LOGIN_ADMIN
    String loginAdmin = (String)request.getSession().getAttribute("LOGIN_ADMIN"); if(page.matches(filterPattern)){

    if(loginAdmin == null && !page.equals("/backend/login.jsp") && !page.equals("/backend/LoginServlet")
    ){
    //redirect到login.jsp
    response.sendRedirect(request.getContextPath()+"/backend/login.jsp");
    return;
    }
    }
    //继续向下执行
    chain.doFilter(req, resp);

    } public void init(FilterConfig config) throws ServletException {
    filterPattern = config.getInitParameter("filterPattern");
    }}
    web.xml配置:
     <filter>
       <filter-name>loginFilter</filter-name>
       <filter-class>cn.com.leadfar.cms.backend.view.LoginFilter</filter-class>
       <init-param>
       <param-name>filterPattern</param-name>
       <param-value>.*Servlet|.*\.jsp</param-value>
       </init-param>
      </filter>
      <filter-mapping>
       <filter-name>loginFilter</filter-name>
       <url-pattern>/*</url-pattern>
      </filter-mapping>
      

  4.   

    把需要验证过滤的页面全部放一个目录下,不需要过滤的放目录外,就好配了。
    还有,
    如果你过滤器中转登录页面用的是forward而不是redirect方式,则默认并不会再次被过滤,不存在什么无穷循环的问题。也就是说:对/*过滤好了,没什么大问题。