Я пытаюсь написать фильтр, который проверяет, вошел ли пользователь в систему, и в случае не перенаправляет его на страницу входа. Ранее у меня был фильтр, который на самом деле ничего не делал -_- здесь это, и с этим фильтром everythig работает нормально, и сессией аннулирует:сеанс не отменяет
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpSession session = request.getSession();
if (session == null || session.getAttribute("UserName") == null) {
String command = request.getParameter("command");
request.setAttribute("command", "login");
// String page = ConfigurationManager.getInstance().getProperty(
// ConfigurationManager.LOGIN_PAGE_PATH);
} else {
String username = (String) session.getAttribute("UserName");
UserRole role;
try {
role = UserDAOImpl.getUserRole(username);
session.setAttribute("role", role);
} catch (DAOTechnicException e) {
logger.error(e);
} catch (DAOLogicException e) {
logger.error(e);
}
}
chain.doFilter(req, res);
}
и когда я аннулирование сессии, то он идет (если сессия == NULL) блок, и все в порядке.
, но теперь у меня есть еще один фильтр, вот это:
public class UserCheckFilter implements Filter {
static class FilteredRequest extends HttpServletRequestWrapper {
public FilteredRequest(ServletRequest request) {
super((HttpServletRequest) request);
}
public String getParameter(String paramName) {
String value = super.getParameter(paramName);
if(value!=null){
if (value.equals("login")) {
return value;
}
HttpSession session = super.getSession();
if (session == null || session.getAttribute("UserName") == null) {
value = "login";
}
}
return value;
}
}
/**
* Checks if user logged in and if not redirects to login page
*/
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpSession session = request.getSession(false);
if (session == null || session.getAttribute("UserName") == null) {
if(request.getParameter("command")!=null){
String command = request.getParameter("command");
if(!command.equals("login")){
FilteredRequest filtrequest = new FilteredRequest(request);
String filteredvalue = filtrequest.getParameter("command");
chain.doFilter(filtrequest, res);
}else{
chain.doFilter(req, res);
}
}else{
chain.doFilter(req, res);
}
} else {
String username = (String) session.getAttribute("UserName");
UserRole role;
chain.doFilter(req, res);
try {
role = UserDAOImpl.getUserRole(username);
session.setAttribute("role", role);
} catch (DAOTechnicException e) {
logger.error(e);
} catch (DAOLogicException e) {
logger.error(e);
}
}
}
, в котором я оберните метод getParameter и проверить, если не зарегистрированный пользователь пытается перейти на пользователя или администратора страниц. Но когда я аннулирую сессию, она не делает недействительными, то есть все параметры остаются неизменными, а затем в фильтре, где он проверяет, является ли session! = Null, это не null, а в строке session.setAttribute («role», role) ; Я получаю исключение «сессия уже недействителен»
вот метод, где я аннулированию сессия:
if(request.getSession(false)!=null){
request.getSession().invalidate();
}
String page = ConfigurationManager.getInstance().getProperty(
ConfigurationManager.LOGIN_PAGE_PATH);
return page;
и сервлет U использовать
RequestDispatcher dispatcher = getServletContext()
.getRequestDispatcher(page);
dispatcher.forward(request, response);
и кстати такие вещи недействительности сессия происходит только со вторым фильтром
ps извините, наверное, глупый вопрос, но я действительно не знаю, что не так, , поэтому любые предложения будут оценены.
http: // stackoverflow.com/a/14562188/738746 очень четко объясняет, когда и что именно вы должны сделать, чтобы достичь того, чего вы в конечном итоге пытаетесь достичь. –