jsf-2 – Primefaces DialogFramework – 如何显示位于WEB-INF中的对话框?

概述我正在使用Primefaces DialogFramework > Primefaces 5.0 > Mojarra 2.1.27 > Glassfish 3.1.2.2 Build 5 我的问题是,如果用户知道我的对话框的位置,他可以通过URL直接访问它.我不希望这是可能的,所以我认为它可以将对话框放在我的web-app的WEB-INF文件夹中,但是现在,如果我想打开对话框,我会得到一个File 我正在使用Primefaces DialogFramework

> Primefaces 5.0
> Mojarra 2.1.27
> Glassfish 3.1.2.2 Build 5

我的问题是,如果用户知道我的对话框的位置,他可以通过URL直接访问它.我不希望这是可能的,所以我认为它可以将对话框放在我的web-app的WEB-INF文件夹中,但是现在,如果我想打开对话框,我会得到一个fileNotFound-Exception.

如果我的对话框位于某个常规文件夹中,则可以正常工作

RequestContext.getCurrentInstance().openDialog("/myfolder/mydialog"); // this works as expected

但如果它位于WEB-INF中,则它不再起作用

RequestContext.getCurrentInstance().openDialog("/WEB-INF/mydialog",options,null);// this is causing a fileNotFoundException

我还尝试在faces-config中为此设置导航规则,但又没有成功

<navigation-case>    <from-outcome>mydialog</from-outcome>    <to-vIEw-ID>/WEB-INF/mydialog.xhtml</to-vIEw-ID>    <redirect /></navigation-case>

我如何打开位于WEB-INF文件夹中的对话框,或者根本不可能?
提前致谢

解决方法 不幸的是,使用PrimeFaces对话框架对话框 in /WEB-INF in order to prevent direct access确实不起作用.对话框完全在客户端加载.在打开对话框的POST请求中,JsF / PrimeFaces返回一个不完整的脚本,其中包含对话框的(public!)URL到JavaScript / jquery,后者又显示了一个带有< iframe>的基本对话框模板.其URL设置为对话框URL,后者又加载内容.实际上,正在发送2个请求,第一个是获取对话框的URL,第二个是根据< iframe>中的URL获取对话框的内容.

没有办法将对话框保留在/ WEB-INF中,而不会通过< p:dialog>回退到“传统”对话框方法.和通过Js / CSS的条件显示.如果请求来自< iframe>,则服务器端也无法根据某些标头进行验证,以便可以简单地阻止所有其他标头.你最接近的赌注是引用标题,但这可能是欺骗性的.

最小化滥用的一种方法是在请求对话时检查是否存在pfdlgcID请求参数(由Constants.DIALOG_FRAMEWORK.CONVERSATION_PARAM标识). PrimeFaces即将表示“会话ID”的请求参数附加到对话URL.假设所有对话框都存储在一个文件夹/对话框中,那么你可以用一个简单的servlet filter来完成这项工作.这是一个启动示例,它在没有pfdlgcID请求参数的情况下请求/ dialogs / *时发送http 400错误.

@WebFilter("/dialogs/*")public class DialogFilter implements Filter {    @OverrIDe    public voID doFilter(ServletRequest req,ServletResponse res,FilterChain chain) throws IOException,servletexception {        httpServletRequest request = (httpServletRequest) req;        httpServletResponse response = (httpServletResponse) res;        String ID = request.getParameter(Constants.DIALOG_FRAMEWORK.CONVERSATION_ParaM);        if (ID != null) {            chain.doFilter(req,res); // Okay,just continue request.        }        else {            response.sendError(httpServletResponse.SC_BAD_REQUEST); // 400 error.        }    }    // ...}

但是,滥用者可能不是那么愚蠢,并且在正常流程中发现pfdlgcID请求参数,并且仍然能够在提供该参数时单独打开对话框,即使是随机值也是如此.我想过将实际的pfdlgcID值与已知值进行比较.我检查了PrimeFaces DialogNavigationHandler源代码,但遗憾的是,PrimeFaces不会在会话中的任何位置存储此值.您需要提供一个自定义的DialogNavigationHandler实现,其中将pfdlgcID值存储在会话映射中,而后者也会在servlet过滤器中进行比较.

首先将以下方法添加到DialogFilter:

public static Set<String> getIDs(httpServletRequest request) {    httpSession session = request.getSession();    Set<String> IDs = (Set<String>) session.getAttribute(getClass().getname());    if (IDs == null) {        IDs = new HashSet<>();        session.setAttribute(getClass().getname(),IDs);    }    return IDs;}

然后将PrimeFaces DialogNavigationHandler source code复制到您自己的包中,并在第62行后添加以下行:

DialogFilter.getIDs((httpServletRequest) context.getExternalContext().getRequest()).add(pfdlgcID);

替换< navigation-handler>在faces-config.xml中使用自定义的.

最后,在DialogFilter #doFilter()方法中更改if条件,如下所示:

if (getIDs(request).contains(ID)) {    // ...}

现在,这可以防止滥用者尝试使用随机ID打开对话框.然而,这并不妨碍滥用者通过复制精确的< iframe>来阻止滥用者尝试打开对话框.打开后立即打开URL.鉴于PrimeFaces对话框架的工作方式,没有办法防止这种情况发生.当对话框即将返回到父对话框时,您最多可以从会话中删除pfdlgcID值.但是,当纯Js意味着关闭对话框时,这也被绕过了.

总而言之,如果你真的,真的,想要避免最终用户能够单独打开对话框,那么你就无法绕过“传统”< p:dialog>做法.

总结

以上是内存溢出为你收集整理的jsf-2 – Primefaces DialogFramework – 如何显示位于WEB-INF中的对话框?全部内容,希望文章能够帮你解决jsf-2 – Primefaces DialogFramework – 如何显示位于WEB-INF中的对话框?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1082680.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存