不可序列化的对象不应存储在" HttpSession"对象(鱿鱼:S2441)如何修复它

时间:2017-07-24 12:43:39

标签: java sonarqube httpsession

我因为拯救Httpsession而得到了声纳缺陷。

请帮助我解决问题。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

  

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

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

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

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

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

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

群集ReplicationTransmitter tomcat-5.5hazelcast.org 的示例。


Sonar-Java的表单SerializableObjectInSessionCheck来源

@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.");
    }
  }
}