【问题标题】:Prevent the user from making a GET request to a page阻止用户向页面发出 GET 请求
【发布时间】:2010-08-18 23:50:08
【问题描述】:

如果我的问题没有任何意义,我很抱歉。所以这就是我所拥有的: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

【问题讨论】:

    标签: java web-applications jsf web.xml


    【解决方案1】:

    是的,正如您所猜测的那样,这个可以web.xml 中进行控制。您需要在/b.jsfurl-patternGEThttp-method 上声明security-constraint,以及一个空的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 错误页面的情况下,这很丑陋)。如果重定向是强制性的,则可以使用其他解决方案:

    1. 在与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() 代替,这样可以减少输入。

    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);
      }
      

      这可以更容易地扩展用于将来的方法和页面,您可以在web.xml 中的Filter 的每个init-param 下进行配置。

    【讨论】:

    • 令我惊讶的是,您对 Web 开发的了解如此之多。你的第一种方法效果很好。但是,我也有点想学习第二种方法,因为我总是听说有人创建过滤器,但不确定它是关于什么的。所以看起来你在这里创建了一个自定义Filter,并通过web.xml告诉项目使用该过滤器,对吗?让我试试看,我会回复你的。非常感谢你
    • 我实现了你的第二种方法,但我有几个问题,你能看看我更新的帖子看看我的实现吗。
    • 过滤器可以映射到/*&lt;url-pattern&gt;,或者更具体的*.jsf,或者更具体的/b.jsf(然后删除if中不必要的检查堵塞)。 &lt;init-param&gt; 是可选的。如果您定义了任何内容,则可以通过init() 方法中的FilterConfig#getInitParameter() 获得,然后您可以将其分配为实例变量并在doFilter() 逻辑中进一步使用它。例如。以逗号分隔的页面名称字符串等。
    • 谢谢。我成功拿到了。但我认为res.sendRedirect("/a.jsf");实际上是res.sendRedirect("a.jsf");
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 2016-09-08
      • 1970-01-01
      • 2016-01-02
      相关资源
      最近更新 更多