如果我的问题没有任何意义,我很抱歉。所以这就是我所拥有的: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>
所有学分归于 BalusC
最佳答案
是的,如您所料,这可以在 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>
然而,这显示了一个 HTTP 403 error .这不会(也不能)重定向到 a.jsf
(至少,不是没有提供带有必要检查的自定义 403 错误页面,但这很丑陋)。如果重定向是强制性的,则可以使用其他解决方案:
在与
b.jsf
关联的请求作用域 bean 的构造函数中通过ResponseStateManager#isPostback()
检查回发然后使用ExternalContext#redirect()
相应地重定向.FacesContext context = FacesContext.getCurrentInstance(); if (!context.getRenderKit().getResponseStateManager().isPostback(context)) { context.getExternalContext().redirect("a.jsf"); }
如果您已经在使用 JSF 2.0,您还可以使用便捷方法
FacesContext#isPostback()
相反,这减少了输入。或者作为更高级的方法,创建一个
Filter
这正是任务。通过HttpServletRequest#getServletPath()
可以获取请求的页面和HTTP方法和getMethod()
分别和重定向可以使用HttpServletResponse#sendRedirect()
完成.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); }
这可以更容易地扩展到 future 的方法和页面,您可以在每个
init-param
下配置这些方法和页面的Filter
在web.xml
.
关于java - 阻止用户向页面发出 GET 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3517652/