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

标签 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>

所有学分归于 BalusC

最佳答案

是的,如您所料,这可以web.xml 中进行控制.您需要声明一个 security-constrainturl-pattern 上的 /b.jsfhttp-methodGET ,以及一个空的 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 这正是任务。通过 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 下配置这些方法和页面的 Filterweb.xml .

关于java - 阻止用户向页面发出 GET 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3517652/

相关文章:

Java VM 调优 - Xbatch 和 -Xcomp

javascript - 修复粒子系统处理中的错误

java - 如何在 Java OpenGL 中设置初始窗口大小

java - HashSet允许多个项目具有相同的HashCode

web-applications - 相当于 glassfish-web.xml 的 Websphere

java - 使用 HTML 开发桌面应用程序 View ,作为 Web 应用程序

validation - 获取错误验证消息上的组件 ID

java - 像 Hibernate 这样的框架带来了多少开销?

jsf - p :autoComplete - Pass More parameters

java - 请求作用域的 bean 和数据模型初始化?