我想用prettyfaces验证我的url,如果对象不存在,则获取HTTP 404。我的网址应该像/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的其他部分,因此无法验证对象是否存在。
我的漂亮面版版本是2.0.12.Final。
答案 0 :(得分:1)
我认为执行此类验证的最简单方法是在action方法中执行此操作。在那里,您拥有所需的所有信息,并且在验证错误的情况下发送404是直接的。我总是使用一个小助手类:
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
}