java会话过滤器

Posted

技术标签:

【中文标题】java会话过滤器【英文标题】:java session filters 【发布时间】:2012-04-10 15:36:05 【问题描述】:

在我的网络应用程序中,我有 3 个主要部分 1. 客户 2. 供应商 3. 管理员

我正在使用 java 会话过滤器来检查用户会话并允许访问网站的特定部分。 因此客户只能访问客户部分,供应商可以访问供应商部分,管理员可以访问管理部分。

客户的会话过滤器已经实现并且工作正常。它检查客户身份验证并提供对客户子文件夹的访问权限,我有几个 jsp。

如果我希望过滤器检查供应商和管理部分的身份验证,并根据他们的用户级别允许他们访问。

我是否需要再创建 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>

【问题讨论】:

【参考方案1】:

为什么不使用 Servlet 身份验证。您只需定义角色并使用&lt;security-constraint&gt; 标签映射到网址。

这里是展示如何定义的示例:

客户的安全约束

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

【讨论】:

您能否详细说明我如何实现 servlet 身份验证或任何有用的链接。和检查每个页面上的用户会话一样吗? 我猜你的意思是这样的:informit.com/articles/article.aspx?p=24253 我尝试使用基于表单 - 使用 jdbc.. 领域。无法配置它,这就是我使用会话过滤器的原因 是的,您可以在容器中配置基于数据库的领域(这是特定于容器的)并按照我上面定义的方式配置安全约束。【参考方案2】:

我相信您可以找到在同一个过滤器中实现所有内容的方法,但是如果您想遵循“单一职责原则”,最好每个角色有一个类。也许将来你必须为每个用户做特定的处理,所以最好有专门的过滤器。

如果你真的只需要一个过滤器,你可以关注这个帖子:

Writing an authorization filter for my web app(JSF 2.0)

【讨论】:

以上是关于java会话过滤器的主要内容,如果未能解决你的问题,请参考以下文章

Java Web 应用程序中的会话过期时如何重定向到登录页面?

会话验证过滤器在会话过期时注销用户

用 Java 解决“加密会话 (ssl) cookie 中缺少安全属性”

在同一会话中打开 Java Web 应用程序时避免点击劫持

[Java] JSP笔记 - Filter 过滤器

如何从过滤器中读取 JSF 会话 bean?