Java 阻止用户对页面发出GET请求
如果我的问题没有任何意义,我很抱歉。这就是我拥有的:2页,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 编
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);
}