【问题标题】:How to Fix Non-serializable objects should not be stored in "HttpSession" objects (squid:S2441)如何修复不可序列化对象不应存储在“HttpSession”对象中(squid:S2441)
【发布时间】:2017-12-30 01:29:51
【问题描述】:

我遇到了 Sonarqube 缺陷

Non-serializable objects should not be stored in "HttpSession" objects (squid:S2441)

用于保存在Httpsession,代码:

public static HttpSession setSessionAttribute(final HttpSession session, 
final String attributeName,
        final Object attributeValue) {
    session.setAttribute(attributeName, attributeValue);
    return session;
  }

【问题讨论】:

  • implements Serializable
  • 使其可序列化有什么问题吗?你问怎么做?
  • 嗨 Pshemo,我正在传递不同的对象以将其保存在会话中。我是否必须为所有对象实现可序列化
  • 你的声纳是什么版本的?

标签: java sonarqube serializable httpsession


【解决方案1】:

不可序列化的对象不应存储在“HttpSession”对象中(squid:S2441

合规解决方案:为了使会话复制工作,应用程序作为属性存储在会话中的值必须实现 Serializable 接口。

public class Address implements Serializable {
  //...
}

//...
HttpSession session = request.getSession();
session.setAttribute("address", new Address());  // Compliant; Address is serializable

CWE-579:J2EE 不良做法:存储在 Session 中的不可序列化对象导致跨多个 JVM 的复制问题

一个 J2EE 应用程序可以利用多个 JVM 来提高应用程序的可靠性和性能。为了使多个 JVM 对最终用户显示为单个应用程序,J2EE 容器可以跨多个 JVM 复制一个 HttpSession 对象,这样如果一个 JVM 不可用,另一个 JVM 可以介入并取代它不会中断应用程序的流程。这只有在所有会话数据都是可序列化的情况下才有可能,从而允许在 JVM 之间复制会话。

集群复制传输器示例tomcat-5.5hazelcast.org


表格Sonar-JavaSerializableObjectInSessionCheck的来源

@Rule(key = "S2441")
public class SerializableObjectInSessionCheck extends AbstractMethodDetection {

  @Override
  protected void onMethodInvocationFound(MethodInvocationTree mit) {
    ExpressionTree argument = mit.arguments().get(1);
    Type type = argument.symbolType();
    if (!isSerializable(type)) {
      String andParameters = isParametrized(type) ? " and its parameters" : "";
      reportIssue(argument, "Make \"" + type + "\"" + andParameters + " serializable or don't store it in the session.");
    }
  }
}

【讨论】:

    【解决方案2】:

    您作为属性添加到 HttpSession 的所有对象都必须是可序列化的(以便会话可序列化),

    SonarQube 搜索 HttpSession 上的每个 setAttribute 对象是原始的或实现 Serializable,Code

    if (!type.isPrimitive() && !type.isSubtypeOf("java.io.Serializable")) { 
          addIssue(argument, "Make \"" + type + "\" serializable or don't store it in the session."); 
        } 
    

    还有一个issue 报告,应该在版本中修复 4.2 处理数组。

    如果您可以修复您的代码,请将 attributeValue 更改为 Serializable

    public static HttpSession setSessionAttribute(final HttpSession session, 
    final String attributeName,
            final Serializable attributeValue) {
        session.setAttribute(attributeName, attributeValue);
        return session;
      }
    

    【讨论】:

      猜你喜欢
      • 2011-07-06
      • 2017-06-02
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-17
      • 1970-01-01
      相关资源
      最近更新 更多