3

如果我的问题没有任何意义,我很抱歉。所以这就是我所拥有的:2 页A.jsfB.jsf. 当我按下 中的按钮时A.jsf,代码会设置 an 的值object并重定向到B.jsf. 包含B.jsf将取决于我设置的对象A.jsf(取决于我单击的按钮)。因此,我不想让用户在网络浏览器上输入这个

http://myhost:myport/myproject/B.jsf

并直接进入B.jsf. 所以,没有 GET 请求B.jsf,只有 POST。如果我看到 GET 请求B.jsf,我会重定向到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

4

2 回答 2

7

是的,正如您所猜测的,这可以web.xml. 您需要security-constrainturl-patternof/b.jsf上声明 ahttp-method以及GET一个 empty 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 错误。这不会(也不能)重定向到a.jsf(至少,在没有提供带有必要检查的自定义 403 错误页面的情况下,这很丑陋)。如果重定向是强制性的,则可以使用其他解决方案:

  1. b.jsf在与检查回发相关联的请求范围 bean 的构造函数中ResponseStateManager#isPostback(),然后使用ExternalContext#redirect().

    FacesContext context = FacesContext.getCurrentInstance();
    if (!context.getRenderKit().getResponseStateManager().isPostback(context)) {
        context.getExternalContext().redirect("a.jsf");
    }
    

    如果您已经在 J​​SF 2.0 上,您也可以使用方便的方法FacesContext#isPostback()来代替,这样可以减少输入。

  2. 或者作为一种更高级的方法,创建一个Filter完全完成任务的方法。请求的页面和 HTTP 方法可以通过HttpServletRequest#getServletPath()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);
    }
    

    这可以更容易地扩展为将来的方法和页面,您可以在每个ininit-param下配置这些方法和页面。Filterweb.xml

于 2010-08-19T00:39:24.683 回答
1

B.jsf检查中设置的值是否有A.jsf问题,如果不存在则发出重定向?

于 2010-08-19T00:04:08.910 回答