gpt4 book ai didi

Java Servlet 登录过滤器排除列表不适用于整个文件夹

转载 作者:行者123 更新时间:2023-11-30 08:37:46 25 4
gpt4 key购买 nike

我正在开发一个使用 java 和 jsp 的网络应用程序。为了部署它,我使用的是 tomcat 7。我目前使用的是 LoginFilter,它将对任何页面(除了登录页面本身)的任何请求重定向到登录页面,除非用户输入了他们的用户名和密码。

LoginFilter 如下所示:

public class LoginFilter implements Filter {

private List<String> urlList;

@Override
public void init(FilterConfig config) throws ServletException {
String skip = config.getInitParameter("avoid-urls");
urlList = Arrays.asList(skip.split(","));
}

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String url = request.getServletPath();
boolean allowed = false;

boolean staticResources = (url.contains("css") || url.contains("images") || url.contains("js") || url.contains("login") || url.contains("reports");
if(urlList.contains(url) || staticResources) {
allowed = true;
}
if(!allowed) {
HttpSession session = request.getSession(false);
if(session == null || session.getAttribute("user") == null) {
response.sendRedirect(request.getContextPath() + "login.jsp");
return;
}
}
chain.doFilter(request, response);
}

@Override
public void destroy() { }
}

在我的 web.xml 文件中,我将其映射如下:

<web-app
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
>

<display-name>Test</display-name>

<filter>
<filter-name>Login Filter</filter-name>
<filter-class>LoginFilter</filter-class>
<init-param>
<param-name>avoid-urls</param-name>
<param-value>login.jsp, assets/*, reports/*, reports</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Login Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
</web-app>

现在,即使用户没有登录,我也希望他们能够输入:myurl/reports 并取返回告文件夹(只是一些文本文件)。目前,如果用户确实输入(没有正确的登录凭据),他们会收到此错误:

HTTP Status 404 - /myurl/reports/
type Status report
message /myurl/reports/
description The request resource is not available.

但如果他们实际在 URL 中输入报告名称(在本例中我们称之为 report1.txt):myurl/reports/report1.txt,那么report1.txt 将在没有登录凭据的情况下正常显示。

那么我应该怎么做才能允许整个文件夹没有登录凭据?

最佳答案

默认情况下,Tomcat servlet 不显示目录内容。您收到 404 未找到,因为 Tomcat 正在寻找不存在的文件 index.jsp

要查看的其他 SO 问题:How can I list all the files in folder on tomcat?

要启用目录列表,您应该配置默认 servlet 以允许使用以下 init-param 的列表:

<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>

我没有看到你在 web.xml 中创建了一个 servlet,所以我在这里为你创建一个可能的配置:

<web-app
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
>

<display-name>Test</display-name>

<servlet>
<servlet-name>default</servlet-name>
<servlet-class>
org.apache.catalina.servlets.DefaultServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

<filter>
<filter-name>Login Filter</filter-name>
<filter-class>LoginFilter</filter-class>
<init-param>
<param-name>avoid-urls</param-name>
<param-value>login.jsp, assets/*, reports/*, reports</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Login Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
</web-app>

关于Java Servlet 登录过滤器排除列表不适用于整个文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36951319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com