在我的网络应用程序中,我有3个主要部分 客户 供应商 3.管理员
我正在使用java会话过滤器来检查用户会话并允许访问网站的特定部分。 因此,客户只能访问客户部分,供应商可以访问供应商部分,管理员可以访问管理部分。
客户的会话过滤器已经实现,并且工作正常。它检查客户身份验证并提供对客户子文件夹的访问权限,我有一些jsp。
如果我希望过滤器检查供应商和管理员部分auth并允许他们根据用户级别进行访问。
我是否需要再创建2个过滤器 - 管理员和供应商?
目前这是我对客户的实施:
public class SessionFilter implements Filter {
private FilterConfig config;
/** Creates new SessionFilter */
public SessionFilter() {
}
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Instance created of " + getClass().getName());
this.config = filterConfig;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws java.io.IOException, ServletException {
HttpSession session = ((HttpServletRequest) request).getSession();
ServletContext context = config.getServletContext();
/*
* use the ServletContext.log method to log filter messages
*/
context.log("doFilter called in: " + config.getFilterName() + " on "
+ (new java.util.Date()));
// log the session ID
context.log("session ID: " + session.getId());
// Find out whether the logged-in session attribute is set
Object u= session.getAttribute("users");
if (u != null){
chain.doFilter(request, response);
}
else{
//request.getRequestDispatcher("../index.jsp").forward(request, response);
((HttpServletResponse) response).sendRedirect(((HttpServletResponse) response).encodeRedirectURL("../index.jsp?error=userpriv"));
}
}
public void destroy() {
}
}
这是我的web.xml
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>controller.SessionFilter</filter-class>
<init-param>
<param-name>avoid-urls</param-name>
<param-value>index.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>/users/*</url-pattern>
</filter-mapping>
答案 0 :(得分:3)
为什么不使用Servlet身份验证。您只需使用<security-constraint>
标记定义角色并映射到网址即可。
以下是展示如何定义的示例:
客户的安全约束
<security-constraint>
<web-resource-collection>
<web-resource-name>User Restriction</web-resource-name>
<url-pattern>/customers/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>customer</role-name>
</auth-constraint>
</security-constraint>
供应商的安全约束
<security-constraint>
<web-resource-collection>
<web-resource-name>User Restriction</web-resource-name>
<url-pattern>/suppliers/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>supplier</role-name>
</auth-constraint>
</security-constraint>
管理员安全约束
<security-constraint>
<web-resource-collection>
<web-resource-name>User Restriction</web-resource-name>
<url-pattern>/admin/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>administrator</role-name>
</auth-constraint>
</security-constraint>
答案 1 :(得分:0)
我相信你可以找到在同一个过滤器中实现所有内容的方法,但是如果你想遵循“单一责任原则”,那么每个角色最好有一个类。也许将来您必须为每个用户进行特定处理,因此最好有专门的过滤器。
如果您确实只需要一个过滤器,可以按照以下主题进行操作: