我使用的是IceFaces 1.8.2。我想创建一个Filter
,以便人们无法访问我的应用程序的未经授权的URL。
我试图像这样创建一个Filter
:
public class AuthenticationFilter implements Filter {
private FilterConfig config;
public void init(FilterConfig filterConfig) throws ServletException {
this.config=filterConfig;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse resp=(HttpServletResponse)response;
//HttpSession session=req.getSession(true);
String pageRequested=req.getRequestURL().toString();
System.out.println("Page Requested="+pageRequested);
HttpSession session = req.getSession(false);
if (!session.isNew()) {
if(ManageCustomerMbeans.AUTH_KEY!=null){
System.out.println(":::::::::::::::::::::::::Login Authenticate");
chain.doFilter(req, resp);
}
}
else {
System.out.println("::::::::::::::::::::::::::Not Authenticate");
//Session has expired - redirect to login.jsp
}
}
public void destroy() {
}
}
但结果是,如果我输入其URL,受限制的页面仍会显示。如果我像这样阻止其他页面:
if (!(pageRequested.contains("Login.jsp")&&session.getAttribute(ManageCustomerMbeans.AUTH_KEY)==null)) {
System.out.println("Filter Error!!!");
resp.sendRedirect("./error");
} else {
chain.doFilter(request, response);
}
也没有发生任何事情。
如何为基于IceFaces的Web应用程序正确创建Filter
?
的 的 ** * ** * ** * 的*** 更新的 * ** * ** * ** * ****
经过BalusC先生的修正后,我在我的Filter
课程中做了很多修正,加上一点调整,因为我使用了icefaces 1.8.2 ..这是我的修正,它有效:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse resp=(HttpServletResponse)response;
HttpSession session = req.getSession(false);
String pageRequested=req.getRequestURL().toString();
String resources="resources/";
String xmlhttp="xmlhttp/";
String kaptcha="kaptcha.jpg";
String block="block/";
if(pageRequested.contains("login")||pageRequested.contains(resources)
||pageRequested.contains(block)||pageRequested.contains(xmlhttp)
||pageRequested.contains(kaptcha)||pageRequested.contains("error")
||pageRequested.contains("logout")||pageRequested.contains("lsuccess")){
chain.doFilter(req, resp);
}else{
if (session != null && session.getAttribute(ManageUsersMBeans.AUTH_KEY) != null) {
chain.doFilter(req, resp);
} else {
resp.sendRedirect(req.getContextPath() + "/error");
}
}
}
并在web.xml中:
<filter>
<filter-name>AuthenticationFilter</filter-name>
<filter-class>com.do.tools.util.AuthenticationFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthenticationFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
由于
答案 0 :(得分:3)
如果根本没有调用过滤器,即永远不会执行doFilter()
方法,那么过滤器映射是完全错误的。您需要验证<filter-mapping>
中的web.xml
。它必须映射到<servlet-name>
的{{1}}或覆盖受限页面的FacesServlet
,例如<url-pattern>
,/app/*
等,具体取决于在您的文件夹结构。
如果确实调用了过滤器,那么您的代码逻辑流是完全错误的。让我们看看你的第一次尝试:
/secured/*
这个流程显然是错误的。首先,您正在使用HttpSession session = req.getSession(false);
if (!session.isNew()) {
if(ManageCustomerMbeans.AUTH_KEY!=null){
chain.doFilter(req, resp);
}
} else {
//Session has expired - redirect to login.jsp
}
进行会话,这意味着它可能会返回false
,但您永远不会检查它。然后,您正在检查最近是否已创建会话,如果null
返回非空会话,则永远不会为true
。因此,始终输入第一个getSession(false)
块。然后你要检查一个常量值是否为空,但是这可以从不为if
,因为它显然是一个常数。因此,您的false
总是被调用。假设常量表示属性键,则需要按如下方式重写:
chain.doFilter()
这将检查会话是否为空且包含已登录的用户。如果为true,则继续请求,否则重定向到登录页面。您只需要确保登录页面与过滤器的映射不匹配,否则您需要在请求URI的HttpSession session = req.getSession(false);
if (session != null && session.getAttribute(ManageCustomerMbeans.AUTH_KEY) != null) {
chain.doFilter(req, resp);
} else {
resp.sendRedirect(req.getContextPath() + "/login.jsp");
}
块中添加额外的检查。
你的第二次尝试也是错误的:
if
如果用户没有进入登录页面,这将始终重定向到错误页面。如果用户在未登录的情况下进入登录页面,这将仅继续请求。这种逻辑毫无意义。但如果你说“它不起作用”,那么它只能意味着过滤器映射是错误的。
答案 1 :(得分:0)
如果您想限制对网址的未经授权的访问,最好的方法是使用Servlets Security
。
一些链接:
下面是一个示例,它允许只有经理才能访问安全页面。
<security-constraint>
<web-resource-collection>
<web-resource-name>secured</web-resource-name>
<url-pattern>/secured/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>Manager</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>unsecured</web-resource-name>
<url-pattern>/unsecured/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name>
</auth-constraint>
</security-constraint>