JSF Servlet 模式/奇怪的请求

Posted

技术标签:

【中文标题】JSF Servlet 模式/奇怪的请求【英文标题】:JSF Servlet Pattern / weird requests 【发布时间】:2013-05-16 02:28:45 【问题描述】:

目前我想重构我的项目并从网址中删除/faces/。原因很简单,我想避免,用户可以“删除”面部部分并查看底层 xhtml 文件的来源。

我正在使用 Shiro 进行身份验证。我将首先描述以前的情况(有效),然后描述新的情况,这会造成麻烦。

之前的情况:

web.xml:

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>

shiro.ini

[urls]
/faces/index.xhtml = authc
/faces/pages/** = authc
/faces/templates/** = authc
/faces/resources/** = authc

现状:

web.xml:

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

shiro.ini

[urls]
/index.xhtml = authc
/pages/** = authc
/templates/** = authc
/resources/** = authc

对于那些可能还有“面孔”书签的人,我添加了一个过滤器,并且这样做:

HttpServletRequest srequest = (HttpServletRequest) request;
HttpServletResponse sresponse = (HttpServletResponse) response;

String url = srequest.getRequestURI().trim();
System.out.println("Filtering url: " + url);

if (url.contains("/faces/"))
        url = url.replace("/faces/", "/");

        System.out.println("Redirecting to: " + url);
        sresponse.setStatus(HttpResponseCodes.SC_MOVED_PERMANENTLY);
        sresponse.sendRedirect(url);
    else
        //no filtering required, proceed with chain.
        chain.doFilter(request, response);
    

现在,当我清除浏览器的缓存并调用 http://localhost/project/login.xhtml 时,我收到大量尝试在各种资源文件夹中查找 xhtml 文件:

12:27:46,735 INFO [stdout] (http--0.0.0.0-8090-6) 过滤网址:/project/resources/css/login.xhtml

12:27:46,737 INFO [stdout] (http--0.0.0.0-8090-6) 过滤网址:/project/resources/css/login.xhtml

12:27:46,836 INFO [stdout] (http--0.0.0.0-8090-6) 过滤网址:/project/resources/js/login.xhtml

12:27:46,837 INFO [stdout] (http--0.0.0.0-8090-1) 过滤网址:/project/resources/js/login.xhtml

...

这显然是错误的。切换回 prior 布局,但保留重定向过滤器不会导致任何无效请求。

【问题讨论】:

【参考方案1】:

这是因为对 JSF 资源(CSS/JS/图像文件)的请求也被 Shiro 阻止并重定向到 login.xhtml。你有没有注意到登录页面上的所有 CSS/JS/图像都消失了?

您需要将/javax.faces.resource/* 请求映射到shiro.ini 最顶部的anon 用户。

/javax.faces.resource/** = anon

【讨论】:

【参考方案2】:

我找到了解决办法:

在 Shiro.ini 中,我还将 authc.loginUrl = /faces/login.xhtml 更改为 authc.loginUrl = login.xhtml

结合/resources/** = authc 规则,这会导致尝试访问资源并重定向到该资源文件夹内的login.xhtml 的无限循环。

1.) 我现在将 loginUrl 更改为 authc.loginUrl = /login.xhtml

2.) 我注意到,以这种方式保护资源不再有意义,因为我也想在不登录的情况下访问样式表和东西。 (它与之前的版本一起工作,因为没有使用 /faces/ 路径访问资源,所以 shiro 无论如何也没有保护它们。)

【讨论】:

等等,你使用&lt;script src="resource/..."&gt;等等而不是&lt;h:outputScript&gt;等等?另见***.com/questions/8367421/…

以上是关于JSF Servlet 模式/奇怪的请求的主要内容,如果未能解决你的问题,请参考以下文章

在 Servlet 2.4 容器上运行 JSF 2.0

servle学习

JavaWeb-Servle介绍

在 servlet 过滤器中使用请求参数将 JSF ajax 请求重定向到 URL

JavaWeb实现用户登录注册功能实例代码(基于Servlet+JSP+JavaBean模式)

PrimeFaces 4.0/JSF 2.2.x 中的文件上传不适用于 AJAX - javax.servlet.ServletException:请求内容类型不是多部分/表单数据