Non puoi mandare roba in output e poi fare un redirect tramite header (Che sia tag jsp o scriplet non importa, tanto sempre di servlet header si tratta)
login_expired.jsp
codice:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Documento senza titolo</title>
<meta http-equiv="Refresh" content="5;URL=/login.jsp" />
</head>
<body>
La tua sessione è scaduta, rieffettuare login
</body>
</html>
e l'altro pezzo di codice come prima
codice:
<%
String root = request.getContextPath();
if(session.getAttribute("utente")==null) {
response.sendRedirect("/login_expiredjsp");
%>
Per quanto riguarda il dove si apre la pagina quello lo devi risolvere via javascript (per controllare se il frame corrente sia o meno il top frame)... per esempio, aggiungendo questo a login_expired.jsp (chiaramente nell'<head>)
codice:
<script language="javascript">
if (window.self != window.parent) {
window.frames['top'].document.location.href=window.location.href;
}
</script>