如果我的问题没有任何意义,我很抱歉。以下是我的内容:2页,A.jsf
和B.jsf
。当我按下A.jsf
中的按钮时,代码会设置object
的值并重定向到B.jsf
。 B.jsf
的包含将取决于我在A.jsf
中设置的对象(这取决于我点击的按钮)。因此,我不想让用户在网络浏览器上输入此内容
http://myhost:myport/myproject/B.jsf
直接转到B.jsf
。因此,对B.jsf
没有GET请求,只有POST。如果我向B.jsf
看到GET请求,我会重定向到A.jsf
。我觉得解决方案在web.xml
内
顺便说一句,我使用的是Netbean 6.8和java EE 6
修改
这是解决方案。感谢BalusC
MyFilter.java
package org.xdrawings.filter;
public class MyFilter implements Filter{
private FilterConfig filterConfig = null;
public void destroy(){}
public void init(FilterConfig filterConfig){
this.filterConfig = filterConfig;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse) response;
if("GET".equals(req.getMethod()) && "/B.jsf".equals(req.getServletPath())){
res.sendRedirect("A.jsf");
}else {
chain.doFilter(request, response);
}
}
}
然后在我的web.xml
<filter>
<filter-name>My Filter</filter-name>
<filter-class>org.xdrawings.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>My Filter</filter-name>
<url-pattern>*.jsf</url-pattern>
</filter-mapping>
All credits go to BalusC
答案 0 :(得分:7)
是的,正如您所猜测的那样, 可以在web.xml
中进行控制。您需要在security-constraint
url-pattern
/b.jsf
http-method
GET
以及空auth-constraint
上声明<security-constraint>
<display-name>Prevent GET requests on the b.jsf file</display-name>
<web-resource-collection>
<web-resource-name>The b.jsf file</web-resource-name>
<url-pattern>/b.jsf</url-pattern>
<http-method>GET</http-method>
</web-resource-collection>
<auth-constraint />
</security-constraint>
。
a.jsf
然而,这显示HTTP 403 error。这不会(也不能)重定向到b.jsf
(至少,不是没有提供必要检查的自定义403错误页面,但这很简单)。如果重定向是强制性的,则可以使用其他解决方案:
在与FacesContext context = FacesContext.getCurrentInstance();
if (!context.getRenderKit().getResponseStateManager().isPostback(context)) {
context.getExternalContext().redirect("a.jsf");
}
关联的请求范围bean的构造函数中,按ResponseStateManager#isPostback()
检查回发,然后使用ExternalContext#redirect()
进行相应的重定向。
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
if ("GET".equals(req.getMethod()) && "/b.jsf".equals(req.getServletPath())) {
res.sendRedirect("a.jsf");
} else {
chain.doFilter(request, response);
}
如果您已经使用JSF 2.0,那么您也可以使用便捷方法FacesContext#isPostback()
,而不是打字。
或者作为更高级别的方法,创建一个完成任务的Filter
。请求页面和HTTP方法可以分别通过HttpServletRequest#getServletPath()
和getMethod()
获取,重定向可以使用HttpServletResponse#sendRedirect()
完成。
init-param
对于您可以配置为Filter
web.xml
{{1}}的每个{{1}}的未来方法和网页,可以更轻松地进行扩展。
答案 1 :(得分:1)
B.jsf
检查A.jsf
中设置的值是否有问题,如果不存在则会发出重定向?