JSF Servlet模式/奇怪的请求

时间:2013-05-21 10:41:56

标签: jsf servlet-filters shiro

目前我想重构我的项目并从网址中删除/faces/。理由很简单,我想避免,用户可以"删除" 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

对于那些可能还有&#34;面孔&#34;书签,我添加了一个过滤器,并执行此操作:

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

...

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

2 个答案:

答案 0 :(得分:3)

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

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

/javax.faces.resource/** = anon

答案 1 :(得分:0)

我找到了解决方案:

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

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

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

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