Prettyfaces URL 验证
Prettyfaces URL validation
我想用 prettyfaces 验证我的 url 并在对象不存在时获取 HTTP 404。我的 URL 应该看起来像 /code/788?date=13.12.2015
。
我的 prettyfaces 配置类似于:
<url-mapping id="code">
<pattern value="/code/#{/[0-9]+/ code: prettyUrlCheckBean.newCode}" />
<query-param name="date">#{navigationBean.calendarDateAsString}</query-param>
<view-id value="/content/codes.jsf"/>
<action>#{prettyUrlCheckBean.checkEntryUrlWithNewCode}</action>
</url-mapping>
目前该操作将从 bean 中获取参数,查看数据库中给定日期的代码是否存在,然后重定向到主页(使用会话中设置的参数)或 404 页面。然而,HTTP 代码将是 302
和 200
而不是直接的 404
.
我在模式和查询参数中都尝试了验证器,但在任何一种情况下我都无法访问 URL 的其他部分,因此无法验证对象是否存在。
我的 prettyfaces 版本是 2.0.12.Final.
我认为执行此类验证的最简单方法是在操作方法中执行。那里有您需要的所有信息,并且在验证错误的情况下发送 404 是很简单的。为此,我总是使用一个小帮手class:
public class FacesRequests {
public static void sendForbidden() {
sendStatusCode( 403 );
}
public static void sendNotFound() {
sendStatusCode( 404 );
}
private static void sendStatusCode( int status ) {
FacesContext context = FacesContext.getCurrentInstance();
try {
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
response.sendError( status );
context.responseComplete();
}
catch( IOException e ) {
throw new IllegalStateException( "Could not send error code", e );
}
}
}
基本上你可以这样做:
public String myActionMethod() {
boolean valid = ...;
if( !valid ) {
FacesRequests.sendNotFound();
return null;
}
// business code here
}
我想用 prettyfaces 验证我的 url 并在对象不存在时获取 HTTP 404。我的 URL 应该看起来像 /code/788?date=13.12.2015
。
我的 prettyfaces 配置类似于:
<url-mapping id="code">
<pattern value="/code/#{/[0-9]+/ code: prettyUrlCheckBean.newCode}" />
<query-param name="date">#{navigationBean.calendarDateAsString}</query-param>
<view-id value="/content/codes.jsf"/>
<action>#{prettyUrlCheckBean.checkEntryUrlWithNewCode}</action>
</url-mapping>
目前该操作将从 bean 中获取参数,查看数据库中给定日期的代码是否存在,然后重定向到主页(使用会话中设置的参数)或 404 页面。然而,HTTP 代码将是 302
和 200
而不是直接的 404
.
我在模式和查询参数中都尝试了验证器,但在任何一种情况下我都无法访问 URL 的其他部分,因此无法验证对象是否存在。
我的 prettyfaces 版本是 2.0.12.Final.
我认为执行此类验证的最简单方法是在操作方法中执行。那里有您需要的所有信息,并且在验证错误的情况下发送 404 是很简单的。为此,我总是使用一个小帮手class:
public class FacesRequests {
public static void sendForbidden() {
sendStatusCode( 403 );
}
public static void sendNotFound() {
sendStatusCode( 404 );
}
private static void sendStatusCode( int status ) {
FacesContext context = FacesContext.getCurrentInstance();
try {
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
response.sendError( status );
context.responseComplete();
}
catch( IOException e ) {
throw new IllegalStateException( "Could not send error code", e );
}
}
}
基本上你可以这样做:
public String myActionMethod() {
boolean valid = ...;
if( !valid ) {
FacesRequests.sendNotFound();
return null;
}
// business code here
}