2014-09-11 3 views
2

hi am создаю одно веб-приложение, в этом приложении я хочу ограничить число пользователей. Например, только 4 пользователя могут получить доступ к приложению, если оно превышает 4 пользователя, оно показывает сообщение об ошибке, такое как ограничение, до тех пор, пока ни один из 4 пользователей не выйдет из системы. если кто-либо из 4 пользователей выходит из системы, означает, что счет будет равен 3, чтобы некоторые другие пользователи могли получить доступ к приложению. Другой лучший пример: репутация на странице stackoverflow, если кто-то дает один минус, он будет отображаться на каждой странице.Мне нужно ограничить доступ пользователей к моему веб-приложению

индексная страница:

<%@page import="java.util.List"%> 
<%@page import="java.util.ArrayList"%> 
<html> 
<body> 

    <form method="get" action="PageHitCounter"> 
     <input type="submit" value="Add User" /> 
    </form> 

</body> 

<% 

if(session.getAttribute("ht")!=null) 
    { 

    String Aht= session.getAttribute("ht").toString(); 
    int hitCount=Integer.parseInt(Aht); 
    System.out.println("hit count in login"+hitCount); 

    session.setAttribute("hitCount",hitCount); 

    } 

else { 
    int hitCount = 0; 

    session.setAttribute("hitCount",hitCount); 
    System.out.println("new session count"+hitCount); 
} 



%> 


</html> 

сервлет страницы:

import java.io.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 
//import java.sql.Date; 
//import java.sql.SQLException; 
//import java.util.*; 
//import java.sql.*; 

public class PageHitCounter extends HttpServlet{ 

    private int hitCount; 

    public void init() 
    { 
    // Reset hit counter. 
    hitCount = 0; 
    } 

    public void doGet(HttpServletRequest request, 
        HttpServletResponse response) 
      throws ServletException, IOException 
    { 

     HttpSession session = request.getSession(); 
     // Set response content type 

     response.setContentType("text/html"); 
     // This method executes whenever the servlet is hit 
     // increment hitCount 


     if(session.getAttribute("hitCount")!= null){ 

      String Aht= session.getAttribute("hitCount").toString(); 
      int hitCount=Integer.parseInt(Aht); 

      System.out.println(hitCount); 
      hitCount++; 
      System.out.println("after increment"+hitCount++); 


      if(hitCount <= 5) 
      { 
      System.out.println("if"); 
      PrintWriter out = response.getWriter(); 
      String title = "Total Number of Hits"; 
      String docType = 
      "<!doctype html public \"-//w3c//dtd html 4.0 " + 
      "transitional//en\">\n"; 
      out.println(docType + 
      "<html>\n" + 
      "<head><title>" + title + "</title></head>\n" + 
      "<body bgcolor=\"#f0f0f0\">\n" + 
      "<form action='Logout.jsp'>"+ 
      "<h1 align=\"center\">" + title + "</h1>\n" + 
      "<h2 align=\"center\">" + hitCount + "</h2>\n" + 
      "<input type='submit' value='logout'/>"+ 
      "</body></html>"); 
      } 

     } 

     else 
      { 

     System.out.println("else"); 
     hitCount++; 
     session.setAttribute("ht", hitCount); 


     if(hitCount <= 4) 
     { 
     System.out.println("aa"); 
     PrintWriter out = response.getWriter(); 
     String title = "Total Number of Hits"; 
     String docType = 
     "<!doctype html public \"-//w3c//dtd html 4.0 " + 
     "transitional//en\">\n"; 
     out.println(docType + 
     "<html>\n" + 
     "<head><title>" + title + "</title></head>\n" + 
     "<body bgcolor=\"#f0f0f0\">\n" + 
     "<form action='Logout.jsp'>"+ 
     "<h1 align=\"center\">" + title + "</h1>\n" + 
     "<h2 align=\"center\">" + hitCount + "</h2>\n" + 
     "<input type='submit' value='logout'/>"+ 
     "</body></html>"); 


     } 

     } 

/*  else 
     { 
      destroy(); 
      response.sendRedirect("Logout.jsp"); 

     }*/ 

    } 



    public void destroy() 
    { 

    // hitCount -= 1; 
     // This is optional step but if you like you 
     // can write hitCount value in your database. 
    } 
} 

Выход страницы:

<% 
session.removeAttribute("hitCount"); 
//session.invalidate(); 

    String ht1=session.getAttribute("ht").toString(); 
int ht2=Integer.parseInt(ht1); 
System.out.println("hit count before"+ht1); 
if(ht2 != 0) 
{ 
    ht2 -= 1; 
    System.out.println("hit count after"+ht2); 
} 

session.setAttribute("ht", ht2); 


%> 
<h2>Session Destroyed successfully.. </h2> 


<a href="index1.jsp">Click here to go Back</a> 

что теперь проблема утра облицовочный является счетчиком не уменьшат, так как счетчик будет в сеансе, но на странице выхода из системы мне нужно сделать недействительным сеанс, поэтому я не получу этот счет правильно. Поэтому, пожалуйста, помогите мне.

+0

Не используйте сеанс это новое для каждого пользователя, сохранить 'hitCount' в области приложения, используя' ServletContext' общего числа всех пользователей – Arvind

+0

@Arvind да я тоже думаю, что только один пользовательский выход из системы означает, что count хочет быть 3 пользователями, а для другого пользователя будет отображаться счетчик 3 пользователя. – 2014-09-11 07:36:34

+0

реализовать фильтр, который обрабатывает входящий запрос, имеет счетчик для увеличения при входе и декрете при выходе из системы, если счет меньше затем 10 перенаправить на страницу входа или перенаправить на страницу с ошибкой – SparkOn

ответ

0

Таким образом, вы хотите ограничить свое приложение максимум четырьмя сеансами. Вы должны сохранить количество активных сеансов в атрибуте ServletContext. Вы получаете доступ к его легко из сервлета (getServletContext()) или из JSP (${application.attrName})

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

Сеанс слушатель может выглядеть следующим образом:

@WebListener 
public class SessionCountListener implements HttpSessionListener, ServletContextListener { 
    private ServletContext ctx; 
    private int sessionCount = 0; 
    private static final String DEFAULT_ATTR = "sessionCount"; 
    private String attr; 
    private static final String PARAM_NAME = "session_count.attr_name"; 

    @Override 
    public void contextInitialized(ServletContextEvent sce) { 
     // store servletContext 
     ctx = sce.getServletContext(); 
     // try to get attribute name in config 
     attr = ctx.getInitParameter(PARAM_NAME); 
     if ((attr == null) || attr.isEmpty()) { 
      attr = DEFAULT_ATTR; 
     } 
     sessionCount = 0; 
     ctx.setAttribute(attr, sessionCount); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent sce) { 
     ctx.removeAttribute(attr); 
    } 

    @Override 
    public void sessionCreated(HttpSessionEvent se) { 
     countUpdate(1); 
    } 

    @Override 
    public void sessionDestroyed(HttpSessionEvent se) { 
     countUpdate(-1); 
    } 

    synchronized private void countUpdate(int delta) { 
     sessionCount += delta; 
     ctx.setAttribute(attr, sessionCount); 
    } 
} 

С этим слушателем, то число сеансов по умолчанию хранится под именем атрибута sessionCount, но он может быть настроен с параметром контекста имени session_count.attr_name. И все обращения к переменной sessionCount правильно синхронизированы, так как несколько запросов могут одновременно создавать или закрывать сеансы.

Вы найдете все ссылки на Java EE 6 Javadoc

+0

Я понял, но у меня нет никакого представления о Контексте и слушателе можно отправить любую ссылку для четкой ссылки. Спасибо. – 2014-09-11 10:59:17

+0

© Anand Контекст сервлета - одно (java) веб-приложение на одном сервере или более точно контейнер). Я добавлю больше деталей перед завтра. –

+0

спасибо @Serge Ballesta – 2014-09-11 12:53:17