我因为拯救Httpsession而得到了声纳缺陷。
请帮助我解决问题。
public static HttpSession setSessionAttribute(final HttpSession session,
final String attributeName,
final Object attributeValue) {
session.setAttribute(attributeName, attributeValue);
return session;
}
答案 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.5,hazelcast.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.");
}
}
}