我已经有两个过滤器,它们通常检查有效 session 。如果 session 有效,它将重定向到 ExpenseDetailsManagement.html
,否则 ExpenseManagementLogin.html
。 web.xml 配置看起来像
<filter>
<filter-name>ExpenseAuthentication</filter-name>
<filter-class>com.pricar.hibernate.ExpenseAuthentication</filter-class>
</filter>
<filter>
<filter-name>ExpenseAuthenticationFilter</filter-name>
<filter-class>com.pricar.hibernate.ExpenseAuthenticationFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ExpenseAuthentication</filter-name>
<url-pattern>*/ExpenseDetailsManagement.html</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>ExpenseAuthenticationFilter</filter-name>
<url-pattern>*/ExpenseManagementLogin.html</url-pattern>
</filter-mapping>
以上两个工作正常。
应用程序路径如下所示
http://localhost:8080/Hibernate/ExpenseManagementLogin.html
如果我尝试使用http://localhost:8080/Hibernate
,则ExpenseManagementLogin.html
正在加载
即使我有一个有效的 session 。
为此,我尝试了一些 url-mapping-patterns,例如 Hibernate/
、/Hibernate/
、/*
然后
它以无限循环或找不到资源错误结束。
我的网络应用程序只有两个 HTML 页面,一个用于登录,另一个用于应用程序内容。
有什么建议吗?
最佳答案
为什么使用两个过滤器?
删除ExpenseAuthentificationFilter
。在最简单的情况下,将 ExpenseManagementLogin.html 文件放置在 war 的根目录中。
添加 Servlet 或 JSP 作为登录表单目标。
将页面 ExpenseDetailsManagement.html 配置为默认页面。
那么以下情况是可能的:
- 用户调用
http://localhost:8080/Hibernate
- 服务器重定向到默认页面
http://localhost:8080/Hibernate/ExpenseDetailsManagement.html
- 当浏览器请求此页面时,将调用剩余的 servlet 过滤器。
- 如果没有有效的 session 处于 Activity 状态,则在过滤器内重定向到
http://localhost:8080/Hibernate/ExpenseManagementLogin.html
。 - 用户填写登录表单并提交表单。在 servlet 或 JSP 页面(提交目标处理程序)中,您检查登录名和密码,如果有效,则将重定向发送到
http://localhost:8080/Hibernate/ExpenseDetailsManagement.html
。 - 现在,当浏览器第二次请求这一端时,servlet 过滤器会看到有效的 session ,并且不执行任何操作,从而可以传递 protected 页面。
您还可以使用JAAS处理登录和身份验证。
关于java - servlet 过滤器中的 URL 映射问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3823054/