2015-04-28 6 views
1

Я создал веб-приложение с использованием JavaEE, JSF и одного сервлета.JavaEE - Не удается избавиться от сеанса

Я использую систему безопасности через Glassfish и web.xml. Когда я войду в систему, я могу делать все, что мне разрешено, но как только я выхожу из системы, проблема возникает.

Точно я выхожу из системы, меня переадресовывают на главную страницу, на других (незащищенных) страницах сеанс больше не виден, но как только я попадаю на защищенную страницу - здесь он называется secure.xhtml - I верните мою сессию, и я могу видеть свою информацию и делать все, что мне было позволено делать раньше.

Имо проблема начинается в пользователя ограничений данных в web.xml и транспорт гарантии набор к КОНФИДЕНЦИАЛЬНЫХ. Если я не установлю его, то мои данные не будут видны на других страницах, но выход из системы еще не работает, если он установлен, он просто показывает его на всех страницах, как было сказано ранее.

Это мой web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app 
    id="WebApp_ID" version="3.1" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"> 
    <display-name>IssueTrack</display-name> 

    <!-- Change to "Production" when you are ready to deploy --> 
    <context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value>Development</param-value> 
    </context-param> 

    <!-- Welcome page --> 
    <welcome-file-list> 
     <welcome-file>index.xhtml</welcome-file> 
    </welcome-file-list> 

    <!-- JSF mapping --> 
    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <!-- Map these files with JSF --> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>/faces/*</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.jsf</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.faces</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.xhtml</url-pattern> 
    </servlet-mapping> 

    <login-config> 
     <auth-method>BASIC</auth-method> 
     <realm-name>issuetrack-realm</realm-name> 
    </login-config> 

    <security-role> 
     <role-name>User</role-name> 
    </security-role> 
    <security-role> 
     <role-name>Admin</role-name> 
    </security-role> 

    <error-page> 
     <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
     <location>/index.xhtml</location> 
    </error-page> 

    <session-config> 
     <tracking-mode>COOKIE</tracking-mode> 
     <cookie-config> 
      <secure>true</secure> 
      <http-only>true</http-only> 
     </cookie-config> 
     <session-timeout>5</session-timeout> 
    </session-config> 

    <security-constraint> 
     <web-resource-collection> 
      <web-resource-name>Secured pages</web-resource-name> 
      <description/> 
      <url-pattern>secured.xhtml</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <description/> 
      <role-name>*</role-name> 
     </auth-constraint> 
     <user-data-constraint> 
      <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
     </user-data-constraint> 
    </security-constraint> 
</web-app> 

LogoutServlet, которые (должны) выход из системы зарегистрированным пользователем.

public class LogoutServlet extends HttpServlet { 

    @Override 
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     // Destroys the session for this user. 
     HttpSession session = request.getSession(false); 
     if (session != null) { 
      session.invalidate(); 
      request.logout(); 
     } 

     response.sendRedirect("/"); 
    } 
} 

EDIT

context.xml выглядит следующим образом

<?xml version="1.0" encoding="UTF-8"?> 
<Context antiJARLocking="true" path="/" /> 

GlassFish-web.xml выглядит

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE glassfish-web-app PUBLIC 
    "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" 
    "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd"> 
<glassfish-web-app error-url="/"> 
    <context-root>/</context-root> 
    <security-role-mapping> 
     <role-name>Admin</role-name> 
     <principal-name>Admin</principal-name> 
     <group-name>Admin</group-name> 
    </security-role-mapping> 
    <security-role-mapping> 
     <role-name>User</role-name> 
     <principal-name>User</principal-name> 
     <group-name>User</group-name> 
    </security-role-mapping> 
</glassfish-web-app> 

Мои Beans все Лоо K, как это ..

@Named 
@RequestScoped 
public class IssueBean extends BasicBean { 

    private long id; 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    @Inject 
    private IssueService gServ; 

    private Issue issue = new Issue(); 

    public List<Issue> getIssues() { 
     try { 
      return gServ.viewAll(); 
     } catch (ValidationException ex) { 
      showException(ex); 
      return null; 
     } 
    } 

    public Issue getIssueById() { 
     if (id < 1) { 
      navigate("/issues.xhtml"); 
     } 
     try { 
      issue = gServ.view(id); 
     } catch (ValidationException ex) { 
      showException(ex); 
     } 
     if (issue == null || issue.getPriority()== null) { 
      navigate("/issues.xhtml"); 
     } 
     return issue; 
    } 

    public Issue getIssue() { 
     return issue; 
    } 

    public void setIssue(Issue issue) { 
     this.issue = issue; 
    } 

    public String saveIssue() { 
     try { 
      gServ.add(issue); 
      return "/issues.xhtml?faces-redirect=true"; 
     } catch (ValidationException ex) { 
      showException(ex); 
      return ""; 
     } 
    } 

    public String updateIssue() { 
     try { 
      gServ.edit(issue); 
      return "/issues.xhtml?faces-redirect=true"; 
     } catch (ValidationException ex) { 
      showException(ex); 
      return ""; 
     } 
    } 

    public void init() { 
     if (id < 1) { 
      navigate("/issues.xhtml"); 
     } 
     try { 
      issue = gServ.view(id); 
     } catch (ValidationException ex) { 
      showException(ex); 
     } 
     if (issue == null || issue.getPriority()== null) { 
      navigate("/issues.xhtml"); 
     } 
    } 

} 

Где Basic Bean выглядит следующим образом

public class BasicBean { 
    protected void navigate(String where) { 
     ConfigurableNavigationHandler nav 
       = (ConfigurableNavigationHandler) FacesContext.getCurrentInstance().getApplication().getNavigationHandler(); 

     nav.performNavigation(where); 
    } 

    protected void showException(Exception ex){ 
      FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Validation Error - " + ex.getMessage(), ex.toString()));  
    } 
} 

ответ

2

Я думаю, это происходит потому, что вы используете BASIC auth method в приложении, которое не требует куки, идентификатор сеанса и авторизации, а использует стандартные заголовки HTTP. Это означает, что когда пользователь аутентифицирован, каждый запрос содержит информацию для входа, поэтому пользователь автоматически регистрируется в следующий раз, когда он обращается к сайту.

Таким образом, один из способов борьбы с ним - реализовать аутентификацию на основе форм. Или если вы хотите придерживаться BASIC - используйте предложения given in this thread.

Для получения дополнительной информации об механизмах аутентификации см. Java EE tutorial.

+0

Удивительный! Я знал, что что-то упустил, но я не смог выяснить, что. Благодаря! – Polostor

+0

Рад помочь! Добро пожаловать. –

1

Я думаю, что вы можете использовать предыдущие обеспеченные страницы, поскольку сеанс в кэше вашего браузера. Включите следующее как часть выхода из системы, чтобы ответ не был кэширован. Это также должно работать на всех браузерах.

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); 
response.setHeader("Pragma", "no-cache"); 
response.setDateHeader("Expires", 0); 
+0

Нет, это не помогло. Этот случай действительно странный - когда я _logout_, и я попал в защищенную область, я все еще не зарегистрирован.Если я _logout_ и закройте браузер, а затем запустите его, я снова должен _login_, но без _logout_, я все еще _logged in_ после перезапуска браузера. – Polostor

+0

Вы используете файлы cookie? – KDK

+0

Еще одна вещь, о которой я могу думать, заключается в том, защищаете ли вы только кеш на одной из страниц или на всех страницах? См. Этот ответ для получения более подробной информации. http://stackoverflow.com/a/11337844/4433695 – KDK