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);
}
}
}