我想用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。
我在模式和查询-param中都尝试了验证器,但是在这两种情况下,我都无法访问URL的另一部分,因此无法验证对象是否存在。
我的序言版本是2.0.12.Final。
发布于 2015-03-17 11:36:31
我认为执行这种验证的最简单的方法是在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
}https://stackoverflow.com/questions/29011227
复制相似问题