如何在 playframework 中自动修剪请求参数

Posted

技术标签:

【中文标题】如何在 playframework 中自动修剪请求参数【英文标题】:How to trim request parameters automatically in playframework 【发布时间】:2011-06-30 09:38:49 【问题描述】:

Play 会将请求中的参数分配给操作参数,例如:

public static void createArticle(String title, String content) 

但它不会修剪它们,所以我们通常将这样的代码放在actions中:

public static void createArticle(String title, String content) 
    if(title!=null) title = title.trim();
    if(content!=null) content = content.trim();

有没有办法让play自动修剪它们?

【问题讨论】:

【参考方案1】:

使用自定义活页夹可以通过多种方式实现这一目标。 一种方法是:

在修剪字符串的某处定义自定义活页夹

@As(binder=TrimmedString.class)注释您要修剪的每个参数

public class Application extends Controller 

    public static class TrimmedString implements TypeBinder<String> 
        @Override
        public Object bind(String name, Annotation[] annotations, String value, Class actualClass, Type genericType) throws Exception 
            if(value != null) 
                value = value.trim();
            
            return value;
        
    

    public static void index(
            @As(binder=TrimmedString.class) String s1,
            @As(binder=TrimmedString.class) String s2,
            @As(binder=TrimmedString.class) String s3) 
        render(s1, s2, s3);
    

如果这对您来说过于冗长,只需使用 @Global 绑定器来检查自定义 @Trim@As('trimmed') 注释。 TypeBinder 已经拥有所有可用的注解,所以这应该很容易实现。

所有这些都可以在custom binding 下的文档中找到。

【讨论】:

这很有帮助,谢谢。但是我们需要为每个字段添加注释,不方便 如果你真的想修剪所有字符串,只需在 TypeBinder 上使用 @Global 并修剪所有字符串。 我稍后会尝试,然后决定最佳答案:) TypeBinder 正是为此目的而设计的,所以我更喜欢它而不是 @Before 解决方案。此外,在@Before 中正确实现这一点对我来说似乎很复杂。您不知道参数将在操作中的类型。某些类型可能依赖于前导/尾随空格。【参考方案2】:

一个简单的方法是使用对象映射而不是单独的字符串映射。

因此,您可以创建一个名为 Article 的类,并创建一个修剪内容的 setter。通常 Play 不需要您创建 setter,它们是在幕后自动生成的,但如果您有特殊处理,您仍然可以使用它们。

public class Article 
    public String title;
    public String content;

    public void setTitle(String title) 
         this.title = title.trim();
     
    public void setContent(String content) 
         this.content = content.trim();
    

然后您需要将 Article 传递给您的操作方法,而不是单独的 String 元素,并且您的属性将作为对象映射过程的一部分进行修剪。

【讨论】:

这行得通,但不是我所期望的。我必须以这种方式为我的模型添加很多方法。希望有更简单的方法。不过还是谢谢大家 您唯一的其他选择是创建自己的活页夹。一个新的答案显示了如何做到这一点,或者看看playframework.org/documentation/1.2.1/controllers#custombinding【参考方案3】:

您可以写一个PlayPlugin 并修剪请求的所有参数。

另一种可能是使用Before-Interception。

【讨论】:

@Before 不能在这里使用,因为在“before”方法中无法获取其他动作的参数。 @Freewind:Request.params 应该可用。 谢谢,在全局 @Before 操作中修剪所有参数是最简单的方法。

以上是关于如何在 playframework 中自动修剪请求参数的主要内容,如果未能解决你的问题,请参考以下文章

如何跟踪 Playframework 调用的所有 HTTP 请求?

如何自动测试 playframework 演变

在 playframework 中重新加载自定义文件更改的应用程序

如何从 Spring MVC 中的请求参数中修剪空格

如何让 Playframework 在不发出请求的情况下开始在开发模式下运行应用程序?

如何在 playframework 中获取引荐来源网址