Java 阻止用户对页面发出GET请求

Java 阻止用户对页面发出GET请求,java,web-applications,jsf,web.xml,Java,Web Applications,Jsf,Web.xml,如果我的问题没有任何意义,我很抱歉。这就是我拥有的:2页,A.jsf和B.jsf。当我按下a.jsf中的按钮时,代码设置对象的值,并重定向到B.jsf。B.jsf的包含取决于我在A.jsf中设置的对象(取决于我单击的按钮)。因此,我不想允许用户在web浏览器上键入此内容 直接访问B.jsf。因此,没有对B.jsf的GET请求,只有POST。如果我看到GET请求到B.jsf,我将重定向到A.jsf。我觉得解决方案就在web.xml中 顺便说一句,我使用的是NetBean6.8和JavaEE6 编

如果我的问题没有任何意义,我很抱歉。这就是我拥有的:2页,
A.jsf
B.jsf
。当我按下
a.jsf
中的按钮时,代码设置
对象的值,并重定向到
B.jsf
B.jsf
的包含取决于我在
A.jsf
中设置的对象(取决于我单击的按钮)。因此,我不想允许用户在web浏览器上键入此内容

直接访问
B.jsf
。因此,没有对
B.jsf
的GET请求,只有POST。如果我看到GET请求到
B.jsf
,我将重定向到
A.jsf
。我觉得解决方案就在
web.xml

顺便说一句,我使用的是NetBean6.8和JavaEE6

编辑 这是解决办法。感谢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>

我的过滤器
org.xdrawings.filter.MyFilter
我的过滤器
*.jsf

所有学分都归BalusC

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

是的,正如您猜测的,这可以从
web.xml
中控制。您需要使用
GET
http方法
/b.jsf的
url模式上声明
安全约束
,同时声明空的
身份验证约束

<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>
如果您已经使用了JSF2.0,那么也可以使用便利方法,这样可以减少键入

  • 或者,作为一种更高级的方法,创建一个完全执行任务的。请求的页面和HTTP方法可以分别通过和获得,重定向可以使用

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


  • 你对Web开发的了解之多让我感到惊讶。你的第一个方法很有效。然而,我也有点想学习第二种方法,因为我总是听说人们创建过滤器,但不确定它是关于什么的。看起来您正在这里创建一个自定义的
    过滤器
    ,并通过
    web.xml
    告诉项目使用该过滤器,对吗?让我试试看,然后再打给你。非常感谢各位。我实现了第二种方法,但我有几个问题,请看我更新的帖子,看看我的实现。过滤器可以映射到
    /*
    ,或者更具体的
    *.jsf
    ,或者更具体的
    /b.jsf
    (然后删除
    if
    块中不必要的检查)。
    是可选的。如果您定义了,它将通过内部
    init()
    方法可用,然后您可以将其指定为实例变量,并在
    doFilter()中进一步使用它
    逻辑。例如,一个逗号分隔的页面名字符串等等。谢谢。我成功地得到了它。但我认为
    res.sendRedirect(“/a.jsf”);
    实际上是
    res.sendRedirect(“a.jsf”);
    FacesContext context = FacesContext.getCurrentInstance();
    if (!context.getRenderKit().getResponseStateManager().isPostback(context)) {
        context.getExternalContext().redirect("a.jsf");
    }
    
    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);
    }