Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 筛选器映射在web.xml中不起作用_Java_Xml_Jsp_Authentication_Servlets - Fatal编程技术网

Java 筛选器映射在web.xml中不起作用

Java 筛选器映射在web.xml中不起作用,java,xml,jsp,authentication,servlets,Java,Xml,Jsp,Authentication,Servlets,我已经在我的应用程序中创建了一个过滤器来处理登录/注销场景。筛选器映射不起作用。在我的web.xml中,如果我放置/LoginServlet/*,过滤器映射可以工作,但如果我放置jsp的名称,则它不工作/LoginServlet/list.jsp。我不想为所有JSP调用过滤器 这是我的过滤器 public class LoginFilter implements Filter{ public void destroy() { // TODO Auto-generated

我已经在我的应用程序中创建了一个过滤器来处理登录/注销场景。筛选器映射不起作用。在我的
web.xml
中,如果我放置
/LoginServlet/*
,过滤器映射可以工作,但如果我放置jsp的名称,则它不工作
/LoginServlet/list.jsp
。我不想为所有JSP调用过滤器

这是我的过滤器

public class LoginFilter implements Filter{

    public void destroy() {
        // TODO Auto-generated method stub

    }

    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("LoginFilter : doFilter : Start");
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);

        System.out.println("LoginFilter : doFilter : 111111");


        HttpSession session = request.getSession(false);

        if (session == null || session.getAttribute("user") == null) {
            System.out.println("LoginFilter : doFilter : 222222");
            response.sendRedirect("login.jsp");
            //response.sendRedirect(request.getContextPath() + "/login.jsp");
            //response.sendRedirect("login.jsp");
            //response.sendRedirect("http://localhost:8080/PROJECT_ELMS/login.jsp");
        }else {
            System.out.println("LoginFilter : doFilter : 33333333");
            chain.doFilter(request, response);
        }

    }

    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

}
这是我的
web.xml

<welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
</welcome-file-list>
<listener>
    <listener-class>edu.umd.enpm613.helper.StartupListner</listener-class>
</listener>
<filter>
    <filter-name>loginFilter</filter-name>
    <filter-class>edu.umd.enpm613.servlet.LoginFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>loginFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
    <description></description>
    <display-name>LoginServlet</display-name>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>edu.umd.enpm613.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/LoginServlet/*</url-pattern>
</servlet-mapping>
<servlet>
    <description></description>
    <display-name>StudentServlet</display-name>
    <servlet-name>StudentServlet</servlet-name>
    <servlet-class>edu.umd.enpm613.servlet.StudentServlet</servlet-class>
</servlet>
根据Java

在web应用程序部署描述符中,使用以下语法 用于定义映射:

•以“/”字符开头,以“/*”结尾的字符串 后缀用于路径映射

•以“*”前缀开头的字符串用作扩展名 映射

•仅包含“/”字符的字符串表示“默认值” 应用程序的servlet。在本例中,servlet路径是 请求URI减去上下文路径,路径信息为空

•所有其他字符串仅用于精确匹配

因此,您不能直接使用文件:/LoginServlet/list.jsp映射servlet或过滤器。可能的解决方案是将list.jsp文件放在单独的文件夹中,如/LoginServlet/Security/list.jsp 并绘制地图:

<url-pattern>/LoginServlet/Security/*</url-pattern>
/LoginServlet/Security/*

过滤器应绕过登录页面,因为它没有安全限制,还允许您映射所有URL,而无需无限循环

public void doFilter(ServletRequest req, ServletResponse res,
        FilterChain chain) throws IOException, ServletException {
    System.out.println("LoginFilter : doFilter : Start");
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Pragma", "no-cache");
    response.setHeader("Cache-Control", "no-cache");
    response.setDateHeader("Expires", 0);

    System.out.println("LoginFilter : doFilter : 111111");


    HttpSession session = request.getSession(false);

    //bypass the login page and login servlet

    if (request.getRequestURI().indexof("login.jsp") >= 0 ||
      request.getRequestURI().indexof("/LoginServlet") >= 0){
      System.out.println("LoginFilter : bypass the login");
      chain.doFilter(request, response);
    } else {
      if (session == null || session.getAttribute("user") == null) {
        System.out.println("LoginFilter : doFilter : 222222");
        response.sendRedirect("login.jsp");
        //response.sendRedirect(request.getContextPath() + "/login.jsp");
        //response.sendRedirect("login.jsp");
        //response.sendRedirect("http://localhost:8080/PROJECT_ELMS/login.jsp");
      } else {
        System.out.println("LoginFilter : doFilter : 33333333");
        chain.doFilter(request, response);
      }
    }
}

是否已给出正确的jsp路径/LoginServlet/list.jsp可能不是正确的路径。谢谢。我试过了。我已将所有符合条件的JSP移至/jsps/*。它仍然不起作用。如果我这样做了/*,它又能工作了。但是我不希望我的login.jsp成为其中的一部分,因为它会变成无限循环。谢谢。当服务器启动时,它负责无限循环。问题是,当我登录login.jsp时,它直接进入过滤器。我得到你放的跟踪,然后它又回到登录页面。它永远不会进入LoginServlet。我的LoginServlet将请求转发到list.jsp,该流现在不起作用。请将servlet映射为
/LoginServlet/*
。您是指筛选器吗?这就是我绘制地图的方式。这是我的地图。loginFilter/LoginServlet/*不,我指的是servlet映射?loginFilter/*和servlet映射LoginServlet/LoginServlet/*?
public void doFilter(ServletRequest req, ServletResponse res,
        FilterChain chain) throws IOException, ServletException {
    System.out.println("LoginFilter : doFilter : Start");
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Pragma", "no-cache");
    response.setHeader("Cache-Control", "no-cache");
    response.setDateHeader("Expires", 0);

    System.out.println("LoginFilter : doFilter : 111111");


    HttpSession session = request.getSession(false);

    //bypass the login page and login servlet

    if (request.getRequestURI().indexof("login.jsp") >= 0 ||
      request.getRequestURI().indexof("/LoginServlet") >= 0){
      System.out.println("LoginFilter : bypass the login");
      chain.doFilter(request, response);
    } else {
      if (session == null || session.getAttribute("user") == null) {
        System.out.println("LoginFilter : doFilter : 222222");
        response.sendRedirect("login.jsp");
        //response.sendRedirect(request.getContextPath() + "/login.jsp");
        //response.sendRedirect("login.jsp");
        //response.sendRedirect("http://localhost:8080/PROJECT_ELMS/login.jsp");
      } else {
        System.out.println("LoginFilter : doFilter : 33333333");
        chain.doFilter(request, response);
      }
    }
}