我想使用filter 过滤未登陆的用户,代码如下:
/**
 * 功能:过滤器
 */
public class SessionFilter implements Filter { public void init(FilterConfig filterconfig) throws ServletException {
} public void destroy() {
}
/** 过滤方法 */
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {

// 获取uri地址   
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response=(HttpServletResponse)resp;
HttpSession session = request.getSession(false);
if(session == null || session.getAttribute("User") == null){
     System.out.println("上下文目录:"+request.getContextPath());
 response.sendRedirect(request.getContextPath()+"/actions/loginJsp.action");
 return ;
}

}
但结果 变成了一个死循环了。理论上 没有问题啊。为什么 会这样。

解决方案 »

  1.   

    大概,你访问的路径都是XXXX.action吧
    你所有的页面都是被拦截器拦截的吧
    包括你的登录页面的吧
    这个就是原因
    另外你应该跳转到都某个jsp或者html中
    你又重新跳入了XXXX.action
    自然还会拦截你在大脑里稍微模拟下这个过程就能知道这个答案了
      

  2.   

    你这只对未登录的拦截,登录的你没给放行啊,
    chain.doFilter(request, response); 不知道我说的对不对
      

  3.   

    对,就像2楼说的,你返回到response.sendRedirect(request.getContextPath()+"/actions/loginJsp.action"); 
    登录的action ,这不还是执行登录, 于是又进到拦截,如此反复,你返回到login.jsp 它不就回去了
      

  4.   

    <!-- 系统的FILTER -->
    <filter>  
            <filter-name>SESSION FILTER</filter-name>  
            <filter-class>com.wlzx.web.common.SessionFilter</filter-class>  
        </filter>   
        <filter-mapping>  
            <filter-name>SESSION FILTER</filter-name>  
    <url-pattern>*.action</url-pattern>
        </filter-mapping>
        <filter-mapping>  
            <filter-name>SESSION FILTER</filter-name>  
    <url-pattern>/actions/*</url-pattern>  
        </filter-mapping>  如果 不过滤 xx.jsp .那么 就会 进入到 某个后台页面 。
    具体的 某个动用 是exposition/actions/loginAction 或 exposition/actions/loginAction!index
    过滤器 没有启作用。
      

  5.   

    楼主要实现登陆拦截的话就要把登陆页面和登陆以后的页面放在不同的文件夹下面,这样一来,楼主就只需要拦截存放登陆以后页面的那个文件夹,就行了,比如你的login.jsp放在WEB-INF下面,而你的登陆以后的jsp放在front包下面,那么楼主的url-pattern就可以这么写了/front/* 这样就不会拦截到login.jsp了。也就不会有死循环了。
      

  6.   

    <filter-mapping>  
            <filter-name>SESSION FILTER</filter-name>  
            <url-pattern>/actions/*</url-pattern>  
        </filter-mapping>  
    不要这个 或者把登录页面换个文件夹
      

  7.   

    回复你们,前后台页面 是分包来放的,访问前端 页面 /fornt/ 不需要登陆。
    后端在/manage/ 包下。这个下边的需要登陆。现在换一种写法。主要代码如下。
    public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse, FilterChain chain) {
    this.chain = chain;
    this.request = (HttpServletRequest) servletRequest;
    // 如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中无法得到的方法,
    // 就要把此request对象构造成HttpServletRequest
    this.response = ((HttpServletResponse) servletResponse);
    // 获取当前页面文件名此处url为:/Gzlkh/login.jsp
    String url = request.getRequestURI();//   /exposition/main.jsp
    // 此处截取的url为:login.jsp
    url = url.substring(url.lastIndexOf("/") + 1, url.length());//main.jsp
    try {
    HttpSession session = request.getSession();
    // 获取网站访问根目录/exposition
    String accessPath = request.getContextPath();
    // 获取用户登录验证信息
    User st = (User) session.getAttribute("user");
    if (noFileUrl(url, request)) {
    // 不需要判断权限的请求如登录页面,则跳过
    chain.doFilter(request, response);// 继续执行请求
    } else if (st == null) {
    response.sendRedirect(accessPath + "/login.jsp");
    // 未登录或超时,返回登陆页面

    } else {
    verifyUrl(url, st);// 判断当前user是否拥有访问此url的权限
    }
    } catch (Exception sx) {
    sx.printStackTrace();
    }

    }
    web.xml
     
        <filter>
         <filter-name>permission</filter-name>
         <filter-class>com.wlzx.web.common.PermissionFilter</filter-class>
        </filter>
        <filter-mapping>
         <filter-name>permission</filter-name>
         <!-- 只过滤 .jsp 结尾的url, 其余的如 .do, .html, .jpg, .css 等不作过滤-->
         <url-pattern>*.jsp</url-pattern>
        </filter-mapping>还会 进入死循环。这个要可以理解。每次 都要 过滤xx.jsp 页面。所以 就死循环了。
    但是 怎么 能让他 跳出。
      

  8.   

    明确知道哪几个页面不需要过滤的,直接在前面放行不就完了...public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse, FilterChain chain) {    
    this.chain = chain;
        this.request = (HttpServletRequest) servletRequest;
    // 如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中无法得到的方法,    // 就要把此request对象构造成HttpServletRequest    this.response = ((HttpServletResponse) servletResponse);    // 获取当前页面文件名此处url为:/Gzlkh/login.jsp    String url = request.getRequestURI();//   /exposition/main.jspif("/index.jsp".equals(url)) {
     chain.doFilter(request,response);
     return;
    }// 你的过滤逻辑
    ...
      

  9.   

    /**
     * 功能:过滤器
     */
    public class SessionFilter implements Filter { public void init(FilterConfig filterconfig) throws ServletException {
    } public void destroy() {
    }
    /** 过滤方法 */
    public void doFilter(ServletRequest req, ServletResponse resp,
    FilterChain chain) throws IOException, ServletException {

    // 获取uri地址   
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response=(HttpServletResponse)resp;
    //添加这段代码,排除loginJsp.action
    if(request.getRequestURI().endsWith("loginJsp.action")){
    chain.doFilter(request, response);
    return;
    }
    HttpSession session = request.getSession(false);
    if(session == null || session.getAttribute("User") == null){
         System.out.println("上下文目录:"+request.getContextPath());
     response.sendRedirect(request.getContextPath()+"/actions/loginJsp.action");
     return ;
    }

    }
      

  10.   

    问题的关键是:
       不要用重定向,因为使用重定向中有url地址栏重写,而此又符合过滤器条件而再次调用doFilter,致使死循环;所以要用请求转发;
      

  11.   

    先这样。把不需要过滤的页面 放到一起。
    //不需要权限验证的页面动作等
    protected boolean noFileUrl(String url, HttpServletRequest request) {
    String excludeAll = "login.jsp,first.jsp,down.jsp,top.jsp,center.jsp,left.jsp,right.jsp";
    //判断请求页面是否是特殊页面
    if (excludeAll.indexOf(url) >= 0) {
    return true;
    }
    return false; }
    然后,到了login.jsp 然后,添写 用户 和密码,并不经过 action 的操作,就进来了。这是什么原因。