如何在 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一个简单的方法是使用对象映射而不是单独的字符串映射。
因此,您可以创建一个名为 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 中重新加载自定义文件更改的应用程序