Controlar acesso ao sistema

Olá Pessoal!

Tenho um sistema e nele fiz controle de acesso por sessão, quando usuário loga no sistema é mostrado para o mesmo uma tela de menu com as permissões que foram concedidas para este usuário.
Agora caso um usuário descubra o endereço de uma pagina do sistema em que ele não tenha acesso, e este usuário digita o endereço no browser o mesmo consegue acessar a pagina onde ele não tem permissão.
Como faço para corrigir isto?

Abaixo esta o código de acesso ao sistema:

public class Logar extends HttpServlet {

/** 
 * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, SQLException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();

    String usuario = request.getParameter("usuario");
    String senha = request.getParameter("senha");
    RequestDispatcher rd = null;
    HttpSession sessao = request.getSession();

    UsuarioDAO usuarioDAO = new UsuarioDAO();
    Usuarios usuarios = usuarioDAO.getUsuario(usuario, senha);

    if(usuarios != null && usuarios.getNivel() == 1){
        sessao.setAttribute("sessaoUsuario", usuario);
        sessao.setAttribute("nomeCompleto", usuarios.getNomeCompleto());
        sessao.setAttribute("nome", usuarios.getUsuario());
        rd = request.getRequestDispatcher("/index.jsp");
        rd.forward(request, response);
    }else if (usuarios != null && usuarios.getNivel() == 2){
        sessao.setAttribute("sessaoUsuario", usuario);
        sessao.setAttribute("nomeCompleto", usuarios.getNomeCompleto());
        sessao.setAttribute("nome", usuarios.getUsuario());
        rd = request.getRequestDispatcher("/index1.jsp");
        rd.forward(request, response);
    }else if (usuarios != null && usuarios.getNivel() == 3){
        sessao.setAttribute("sessaoUsuario", usuario);
        sessao.setAttribute("nomeCompleto", usuarios.getNomeCompleto());
        sessao.setAttribute("nome", usuarios.getUsuario());
        rd = request.getRequestDispatcher("/index2.jsp");
        rd.forward(request, response);
    }else{
        request.setAttribute("mensagem", "Usuario ou Senha Invalido!");
        rd = request.getRequestDispatcher("/login.jsp");
        rd.forward(request, response);
    }
} 

Abaixo está o código de um servlet onde um determinado usuário não tem acesso. (LEMBRANDO QUE É NESTE CÓDIGO QUE DESEJO COLOCAR O BLOQUEIO PARA O USUÁRIO SEM PERMISSÃO):

public class PedidosPendentes extends HttpServlet {

/** 
 * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();

    int numPagina = 1;
    if(request.getParameter("numpagina") != null)
        numPagina = Integer.parseInt(request.getParameter("numpagina"));

    VendaDAO vendaDAO = new VendaDAO();
    try {

        String ordenacao = request.getParameter("ordenacao");
        if(ordenacao == null)
            ordenacao = "vencodigo";

        List listaPedidosPendentes = vendaDAO.getListaVendaPendentePaginada(numPagina, ordenacao);
        String qtdTotalPendente = vendaDAO.totalRegistrosPendentes();
        request.setAttribute("sessaoPedidosPedentes", listaPedidosPendentes);
        request.setAttribute("sessaoTotalPedidosPedentes", qtdTotalPendente);
        RequestDispatcher rd = request.getRequestDispatcher("/pedidospendentes.jsp");
        rd.forward(request, response);
    } catch (SQLException ex) {
        Logger.getLogger(PedidosPendentes.class.getName()).log(Level.SEVERE, null, ex);
    }
} 

Eu havia feito isto, mas não funcionou:

public class PedidosPendentes extends HttpServlet {

/** 
 * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();

    Usuarios usuarios = new Usuarios();

   if(usuarios.getNivel() == 1){//este usuario pode acessar este servlet

    int numPagina = 1;
    if(request.getParameter("numpagina") != null)
        numPagina = Integer.parseInt(request.getParameter("numpagina"));

    VendaDAO vendaDAO = new VendaDAO();
    try {

        String ordenacao = request.getParameter("ordenacao");
        if(ordenacao == null)
            ordenacao = "vencodigo";

        List listaPedidosPendentes = vendaDAO.getListaVendaPendentePaginada(numPagina, ordenacao);
        String qtdTotalPendente = vendaDAO.totalRegistrosPendentes();
        request.setAttribute("sessaoPedidosPedentes", listaPedidosPendentes);
        request.setAttribute("sessaoTotalPedidosPedentes", qtdTotalPendente);
        RequestDispatcher rd = request.getRequestDispatcher("/pedidospendentes.jsp");
        rd.forward(request, response);
    } catch (SQLException ex) {
        Logger.getLogger(PedidosPendentes.class.getName()).log(Level.SEVERE, null, ex);
    }
} 

}

Alguém pode me ajudar?

na faculdade pro tcc eu implementei a interface filter:

public class Filtro implements Filter{

/**
 * Método que inicializa o filtro
 * @param filterConfig configuração do filterConfig
 * @throws ServletException caso gere alguma excessão
 */
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}

/**
 * Método que verifica todas requisições e respostas
 * @param request request do navegador
 * @param response resposta do navegador
 * @param chain deixa ir
 * @throws IOException caso gere alguma excessão
 * @throws ServletException caso gere alguma excessão
 */
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse resp = (HttpServletResponse) response;
    
    HttpSession session = req.getSession();
    
    if(session.getAttribute("user") != null){
        chain.doFilter(request, response);
    }else{
        session.invalidate();
        resp.sendRedirect(req.getContextPath() + "/login.jsp");
    }
}

/**
 * Destroi
 */
@Override
public void destroy() {
}

}

vê se te ajuda…só que vc vai ter q mapear o filtro no web.xml tbm

Olá blayd2015!

Neste caso vou ter de implementar isto no servlet?

ññ, isso é um filtro, é uma outra classe só que vc vai ter q mapear ele no web.xml

no web.xml:

<filter>
    <filter-name>NomeFiltro</filter-name>
    <filter-class>br.com.projeto.filtro.NomeClasse</filter-class>
</filter>
<filter-mapping>
    <filter-name>NomeFiltro</filter-name>
    <url-pattern>/admin/content/*</url-pattern><!-- pastas onde vc deseja q o filtro atue -->
</filter-mapping>

Na apostila fj21 tem um capítulo somente sobre filtros, dá uma olhadinha, vale a pena…

Basicamente você define ás urls que o filtro vai ser executado ANTES da requisição chegar na Servlet principal e após sair dela, perfeito para controle de acessos…

Olá blayd2015!

Era isto mesmo que eu estava precisando, mas ao invés de criar uma classe java normal implementando Filter, fiz logo um Arquivo Filter e com isto o netbeans mapeou o arquivo xml automaticamente!

poderia postar o codigo estou implementando um controle de acesso por sessão também

Olá Felipe100!

Na verdade deu tela branca, vou corrigir isto e depois envio o codigo!

ok obrigado

Olá Felipe!

Agora está funcionando de forma correta. Segue abaixo o servlet utilizado para logar no sistema:

public class Logar extends HttpServlet {

/** 
 * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, SQLException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();

    String usuario = request.getParameter("usuario");
    String senha = request.getParameter("senha");
    RequestDispatcher rd = null;
    HttpSession sessao = request.getSession();

    UsuarioDAO usuarioDAO = new UsuarioDAO();
    Usuarios usuarios = usuarioDAO.getUsuario(usuario, senha);

    if(usuarios != null && usuarios.getNivel() == 1){
        sessao.setAttribute("sessaoUsuario", usuario);
        sessao.setAttribute("nomeCompleto", usuarios.getNomeCompleto());
        sessao.setAttribute("nome", usuarios.getUsuario());
        sessao.setAttribute("nivel", usuarios.getNivel());
        rd = request.getRequestDispatcher("/index.jsp");
        //System.out.println(usuarios.getNivel());
        rd.forward(request, response);
    }else if (usuarios != null && usuarios.getNivel() == 2){
        sessao.setAttribute("sessaoUsuario", usuario);
        sessao.setAttribute("nomeCompleto", usuarios.getNomeCompleto());
        sessao.setAttribute("nome", usuarios.getUsuario());
        sessao.setAttribute("nivel", usuarios.getNivel());
        rd = request.getRequestDispatcher("/index1.jsp");
        rd.forward(request, response);
    }else if (usuarios != null && usuarios.getNivel() == 3){
        sessao.setAttribute("sessaoUsuario", usuario);
        sessao.setAttribute("nomeCompleto", usuarios.getNomeCompleto());
        sessao.setAttribute("nome", usuarios.getUsuario());
        rd = request.getRequestDispatcher("/index2.jsp");
        rd.forward(request, response);
    }else{
        request.setAttribute("mensagem", "Usuario ou Senha Invalido!");
        rd = request.getRequestDispatcher("/login.jsp");
        rd.forward(request, response);
    }
} 

OBS.; AQUI É O TRECHO DO CÓDIGO ACIMA ONDE PEGO O NÍVEL DE ACESSO DO USUÁRIO:
sessao.setAttribute(“nivel”, usuarios.getNivel());

Abaixo está o servlet que utilizo para exibir uma pagina, onde quem pode acessar é somente o usuario com nível de acesso=1:

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, SQLException {
response.setContentType(“text/html;charset=UTF-8”);
PrintWriter out = response.getWriter();

    int numPagina = 1;
    if (request.getParameter("numpagina") != null) {
            numPagina = Integer.parseInt(request.getParameter("numpagina"));
        }

    VendaDAO vendaDAO = new VendaDAO();
    try{
        String ordenacao = request.getParameter("ordenacao");
        if(ordenacao == null)
            ordenacao = "vencodigo";

        String pesquisa = request.getParameter("pesquisa");
        if(pesquisa == null)
            pesquisa = "";

        String campoapesquisar = request.getParameter("campoapesquisar");
        if(campoapesquisar == null)
            campoapesquisar = "vencli";

        List listaVenda = vendaDAO.getListaVendaPaginada(numPagina, ordenacao, pesquisa, campoapesquisar);
        String totalRegistros = vendaDAO.totalRegistros();
        request.setAttribute("sessaoListaVenda", listaVenda);
        request.setAttribute("sessaoQtdTotalPedidos", totalRegistros);
        RequestDispatcher rd = request.getRequestDispatcher("/listapedidos.jsp");
        rd.forward(request, response);
    }catch(SQLException er){
        Logger.getLogger(PedidosCRUD.class.getName()).log(Level.SEVERE, null, er);
    }
} 

Abaixo está o filtro que utilizei para controlar o acesso ao servlet acima:

public class Filtro implements Filter {

private static final boolean debug = true;
// The filter configuration object we are associated with.  If
// this value is null, this filter instance is not currently
// configured. 
private FilterConfig filterConfig = null;

public Filtro() {
}

private void doBeforeProcessing(ServletRequest request, ServletResponse response)
        throws IOException, ServletException {
    if (debug) {
        log("Filtro:DoBeforeProcessing");
    }

    // Write code here to process the request and/or response before
    // the rest of the filter chain is invoked.

    // For example, a logging filter might log items on the request object,
    // such as the parameters.
/*
    for (Enumeration en = request.getParameterNames(); en.hasMoreElements(); ) {
    String name = (String)en.nextElement();
    String values[] = request.getParameterValues(name);
    int n = values.length;
    StringBuffer buf = new StringBuffer();
    buf.append(name);
    buf.append("=");
    for(int i=0; i < n; i++) {
    buf.append(values[i]);
    if (i < n-1)
    buf.append(",");
    }
    log(buf.toString());
    }
     */
}

private void doAfterProcessing(ServletRequest request, ServletResponse response)
        throws IOException, ServletException {
    if (debug) {
        log("Filtro:DoAfterProcessing");
    }

    // Write code here to process the request and/or response after
    // the rest of the filter chain is invoked.

    // For example, a logging filter might log the attributes on the
    // request object after the request has been processed.
/*
    for (Enumeration en = request.getAttributeNames(); en.hasMoreElements(); ) {
    String name = (String)en.nextElement();
    Object value = request.getAttribute(name);
    log("attribute: " + name + "=" + value.toString());

    }
     */

    // For example, a filter might append something to the response.
/*
    PrintWriter respOut = new PrintWriter(response.getWriter());
    respOut.println("<P><B>This has been appended by an intrusive filter.</B>");
     */
}

/**
 *
 * @param request The servlet request we are processing
 * @param response The servlet response we are creating
 * @param chain The filter chain we are processing
 *
 * @exception IOException if an input/output error occurs
 * @exception ServletException if a servlet error occurs
 */
public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain)
        throws IOException, ServletException {
   
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse resp = (HttpServletResponse) response;

    HttpSession session = req.getSession();

    Integer nivel = (Integer) session.getAttribute("nivel");

    if (nivel.intValue() == 1) {
        chain.doFilter(request, response);
    } else {
        session.invalidate();
        resp.sendRedirect(req.getContextPath() + "/login.jsp");
    }
}

/**
 * Return the filter configuration object for this filter.
 */
public FilterConfig getFilterConfig() {
    return (this.filterConfig);
}

/**
 * Set the filter configuration object for this filter.
 *
 * @param filterConfig The filter configuration object
 */
public void setFilterConfig(FilterConfig filterConfig) {
    this.filterConfig = filterConfig;
}

/**
 * Destroy method for this filter 
 */
public void destroy() {
}

/**
 * Init method for this filter 
 */
public void init(FilterConfig filterConfig) {
    this.filterConfig = filterConfig;
    if (filterConfig != null) {
        if (debug) {
            log("Filtro:Initializing filter");
        }
    }
}

/**
 * Return a String representation of this object.
 */
@Override
public String toString() {
    if (filterConfig == null) {
        return ("Filtro()");
    }
    StringBuffer sb = new StringBuffer("Filtro(");
    sb.append(filterConfig);
    sb.append(")");
    return (sb.toString());
}

private void sendProcessingError(Throwable t, ServletResponse response) {
    String stackTrace = getStackTrace(t);

    if (stackTrace != null && !stackTrace.equals("")) {
        try {
            response.setContentType("text/html");
            PrintStream ps = new PrintStream(response.getOutputStream());
            PrintWriter pw = new PrintWriter(ps);
            pw.print("<html>\n<head>\n<title>Error</title>\n</head>\n<body>\n"); //NOI18N

            // PENDING! Localize this for next official release
            pw.print("<h1>The resource did not process correctly</h1>\n<pre>\n");
            pw.print(stackTrace);
            pw.print("</pre></body>\n</html>"); //NOI18N
            pw.close();
            ps.close();
            response.getOutputStream().close();
        } catch (Exception ex) {
        }
    } else {
        try {
            PrintStream ps = new PrintStream(response.getOutputStream());
            t.printStackTrace(ps);
            ps.close();
            response.getOutputStream().close();
        } catch (Exception ex) {
        }
    }
}

public static String getStackTrace(Throwable t) {
    String stackTrace = null;
    try {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        t.printStackTrace(pw);
        pw.close();
        sw.close();
        stackTrace = sw.getBuffer().toString();
    } catch (Exception ex) {
    }
    return stackTrace;
}

public void log(String msg) {
    filterConfig.getServletContext().log(msg);
}

}

OBS.: O CONTROLE DE ACESSO ESTÁ DESCRITO NO METODO ACIMA doFilter:

   HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse resp = (HttpServletResponse) response;

    HttpSession session = req.getSession();

    Integer nivel = (Integer) session.getAttribute("nivel");

    if (nivel.intValue() == 1) {
        chain.doFilter(request, response);
    } else {
        session.invalidate();
        resp.sendRedirect(req.getContextPath() + "/login.jsp");
    }

OBS.; O NIVEL DE ACESSO NO MEU BD É INTEGER SE FOSSE STRING FARIA DA SEGUINTE FORMA:

String nivel = (String) session.getAttribute(“nivel”);

    if (nivel.equals("1")) {
        chain.doFilter(request, response);
    } else {
        session.invalidate();
        resp.sendRedirect(req.getContextPath() + "/login.jsp");
    }

DESTA FORMA MEU FILTRO DE CONTROLE UTILIZANDO SESSÃO FUNCIONOU PERFEITAMENTE!