当前位置: 首页 > 知识库问答 >
问题:

#request的变通方法。Thymelaaf中的getParameters()

步博厚
2023-03-14

我们使用的是CAS 5.2.3,它使用了Thymeleaf的升级版本。Thymeleaf对某些请求功能的访问受到限制——“#request.getParameters()”就是其中之一。有什么解决办法吗?我在尝试访问它时收到以下错误——“在这种情况下禁止访问请求参数。请注意,一些限制适用于变量访问。例如,在预处理和未转义表达式、TEXT模板模式、片段插入规范和一些特定属性处理器中禁止直接访问请求参数。”

共有2个答案

洪俊能
2023-03-14

显然,人们可以花几个小时,甚至几天在这个简单的要求上,Thymeleaf在后来的版本中将其作为一个糟糕的烦恼引入。我花了几个小时从5年前的旧Thymeleaf版本升级,并陷入了同样的问题。缺乏文档也没有。当我终于试一试时,我意识到这个问题的解决方案就像使用

只需在允许访问请求参数的更高级别的html标签中使用th: with标签,如下所示:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" 
  xmlns="http://www.w3.org/1999/xhtml" 
  th:with="action=${param.action != null ? 
                    param.action[0] : 'none'}">
<head>
...

在此示例中,请求参数action存储在名为action的页面上下文局部变量中(名称可以是您选择的任何唯一名称)。这个变量现在可以在定义它的高级html标记下面的任何位置访问。它甚至可以用于声明后同一html标记中的以下th:xx标记。基本上,现在你可以这样做了:

<th:block th:switch="${action}">
    <title th:case="'edit'" th:text="#{page.contacts.edit}"></title>
    <title th:case="'delete'" th:text="#{page.contacts.delete}"></title>
    <title th:case="*" th:text="#{page.contacts.add}"></title>
</th:block>

甚至通过简单地将变量称为${action}来调用参数化片段。在此示例中,我有一个导航栏模板片段,它接受三个参数。最后一个是请求参数,否则由于较新的Thymeleaf请求对象访问限制而无法访问。

<div id="wrapper">
    <div class="nav" th:replace="html/fragments/navbar ::
         navbar('html/contact','contact-html', ${action})">
    </div>
<div class="content">
...

如果需要更多的请求参数和更多的本地页面上下文变量,只需使用逗号分隔th:和标记中的声明,如下所示:

th:with="action=${param.action == null ? 'none': param.action[0]}, 
         self=${param.self == null ? 'none': param.self[0]}"  

我希望这能为你们节省一些宝贵的时间,并消除重构旧的Thymeleaf html页面的挫折感。它绝对击败了页面中那些难以管理的CDATAscriptlet。

陈翰林
2023-03-14

问得好。几个月前我面对这个问题,它是可以解决的。

在浏览了他们的源代码后,我发现他们只限制了#request.getParameters()在特定标签上的使用,他们并没有禁止在某些情况下使用#request.getParameters()

在我的用例中,我能够使用CData来绕过这种检查。不确定它是否适用于您的用例,因为您没有提供任何代码示例....

无论如何,下面的示例希望根据参数url将用户重定向到另一个页面

下面是在 CAS 5.2.x 中已损坏但在 CAS 5.1.x 中起作用的示例代码:

<html>
<head>
<title> Deforestation </title>
</head>
<body th:attr="onload='window.location.href=\''+${#request.getParameter('url')}+'\''">
</body>
</html>

这是围绕代码的工作:

<html>
<head>
<title> Deforestation </title>
</head>
<body>

Logging out. Please wait...

<script th:inline="javascript">
/*<![CDATA[*/
    location.href = /*[[( ${#request.getParameter('url')} )]]*/ ;
/*]]>*/
</script>
</body>
</html>

如果这没有解决您的问题,请提供您的源代码,以便我们可以更好地了解问题。

注意:这种东西现在被禁止是有安全原因的,使用这种变通方法可能会损害安全标准,如果有必要的话,一定要记得清理用户输入

根据评论,虽然不优雅,但也许像下面这样的东西会有用?

<html>
<head>
<title> Data attribute </title>
</head>
<body>

<span id="foobarid"> </span>

<script th:inline="javascript">
/*<![CDATA[*/
    $('#foobarid').data('foo-bar',/*[[( ${#request.getParameter('foo') == 'bar'} )]]*/); 
/*]]>*/
</script>
</body>
</html>
 类似资料:
  • 我正在Angular 4中开发一个服务,它必须提供一个通用的http请求方法(而不是分开的get、put、post...)。我试图在HttpClient中使用request方法,但无法传递所需的选项参数。我的代码大致如下所示: 现在,我有两个问题: null 错误TS2305:模块“/users/pchacin/documents/workspace/seam-sdk-core-ts/node_m

  • DoitPHP核心类Request,主要用于获取请求参数信息。其所有的类方法均支持静态调用,大部分常用的类方法(get()、post())已被Controller基类所调用。其余类方法在开发中,一般不常用到。下面将这些不常用的类方法说明一下,以备程序开发中使用到。 类方法说明: 1、getServerName() 获取当前运行程序的网址域名。 如:http://www.doitphp.com。 注

  • 本文向大家介绍nodejs中request库使用HTTPS代理的方法,包括了nodejs中request库使用HTTPS代理的方法的使用技巧和注意事项,需要的朋友参考一下 正在尝试改用NodeJS编写爬虫,http请求库选择了 request ,用起来还是挺简单的。 现在有个需求,需要用Fiddler抓包我发出去的请求,以便和浏览器发出去的包进行对比。 因为需要解密HTTPS报文,需要让node要

  • 我已经创建了一个视图来创建新的课程' create.blade.php '。我试图将这些数据存储在数据库中,但是我得到了以下错误: BadMethodCallException Method Illuminate\Http\Request::request 不存在。 我不确定是什么导致了这个错误,因为我已经在我的控制器中引用了请求名称空间。见下文; CoursesController.php; 创

  • 我一直在读java中的同步,我有一个问题。我看到的例子是,一个类在一个本地对象上创建一个同步块。或者一个同步的方法。这两个都不适合我的情况。所以我有一个类的静态实例,它保存了整个应用程序的所有数据。该类上的变量被创建为“private”,我创建了getter来检索这些值。其中一些值一次只需要一个线程从应用程序中的不同类访问。由于它们被创建为private,所以我使用同步块,如下所示。。。 我可以通

  • 目标C代码: 此代码用于计算方法参数的数目。