Моя ситуация:
У меня есть сервлет, который не должен быть доступен неавторизованным пользователям. Этот сервлет выполняет некоторую бизнес-логику и передает некоторые промежуточные данные в jsp
secret.jsp
черезRequestDispatcher::forward()
. (secret.jsp
это просто пример, будет много сервлетов и/или jsps).Также есть логин jsp
login.jsp
.Перед сервлетом находится фильтр, который должен перенаправлять
login.jsp
все запросы от неавторизованных пользователей. В основномdoFilter()
выглядит так:HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; if(-1 == req.getRequestURI().indexOf("login.jsp")) {//if page which is not whitelisted HttpSession session = req.getSession(false); if(null == session) { RequestDispatcher rd = req.getServletContext().getRequestDispatcher("/login.jsp"); rd.forward(request, response); } else { //not whitelisted but already logged in... log("we are logged in"); } } chain.doFilter(request, response);
Проблемы
Форвард в сервлете заставляет фильтр срабатывать 2 * 2 = 4 раза (дважды, потому что он движется вперед и назад, когда приходит запрос и когда доставляется ответ). Я хотел бы, чтобы он срабатывал только один раз (когда приходит первоначальный запрос) или, по крайней мере, только два раза.
Сеанс запущен. Я не хочу, чтобы сеанс запускался до тех пор, пока пользователь не будет успешно аутентифицирован (т.е. отправит клиенту файл cookie JSESSIONID).
Каков самый элегантный способ исправить эти проблемы?
Я хотел бы не перенаправлять, отправляя браузеру заголовок Location
, а вместо этого делать это внутри.
Дополнение
secret.jsp
:
<%@page contentType="text/html" pageEncoding="UTF-8" import="java.util.*"%>
<%@taglib prefix="tags" uri="/WEB-INF/tlds/tag_library.tld" %>
<tags:wrapper title="hello world">
hello ${requestScope.msg}
</tags:wrapper>
который использует тег в wrapper.tagf
:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@tag pageEncoding="UTF-8"%>
<%@attribute name="title" required="true" type="java.lang.String" %>
<%@attribute name="menu" type="java.util.HashMap<String, Object>" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link rel="stylesheet" type="text/css" href="css/reset.css"/>
<link rel="stylesheet/less" type="text/css" href="css/default.less"/>
<script src="js/less-1.1.5.min.js" type="text/javascript"></script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>${pageScope.title}</title>
</head>
<body>
<div id="leftMenu">menu</div>
<div id="body">
<jsp:doBody/>
</div>
</body>
</html>