阻止用户向页面发出GET请求

时间:2010-08-18 23:50:08

标签: java web-applications jsf web.xml

如果我的问题没有任何意义,我很抱歉。以下是我的内容:2页,A.jsfB.jsf。当我按下A.jsf中的按钮时,代码会设置object的值并重定向到B.jsfB.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

2 个答案:

答案 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错误页面,但这很简单)。如果重定向是强制性的,则可以使用其他解决方案:

  1. 在与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(),而不是打字。

  2. 或者作为更高级别的方法,创建一个完成任务的Filter。请求页面和HTTP方法可以分别通过HttpServletRequest#getServletPath()getMethod()获取,重定向可以使用HttpServletResponse#sendRedirect()完成。

    init-param

    对于您可以配置为Filter web.xml {{1}}的每个{{1}}的未来方法和网页,可以更轻松地进行扩展。

答案 1 :(得分:1)

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