[ ŽIKI @ 31.10.2013. 12:25 ] @
Pozdrav, relativno sam nov u javi pa me interesuje da li je ovo ok.

Pravim neku web aplikaciju, imam jedno 8-10 .jsp strana, i sad sam napravio login formu.
Spojio sam sa bazom i to radi, interesuje me sad oko sesija(bez cookie) da li postoji neki drugi/bolji način.
Kada npr. posle uspešnog logina u LoginServlet-u definišem sesiju i redirekciju:
Code:

    HttpSession session = request.getSession(true);
                session.setMaxInactiveInterval(30*60);
                session.setAttribute("username", rs.getString("username"));
                            response.sendRedirect("prvaStrana.jsp");

sad ne želim da mogu direktno da ukucam NekaAdresa/prvaStrana.jsp i da mi izbaci nju, već login stranu. Znači da ne mogu direktno da pristupim url-u, već ako nisam ulogovan da me baci na login stranu.
To sam postigao tako što sam ubacio ove 2 linije koda na prvaStrana.jsp.
Code:

if(session.getAttribute("username") == null){
    response.sendRedirect("login.jsp");}

Da li se to tako radi, sad na svaku novu stranu ubacujem ove 2 linije koda?
[ nemnesic @ 31.10.2013. 12:37 ] @
Pitanje: gde ti se nalaze jsp strane kada mozes da im direkto pristupis iz browser-a?

Common practice je da unutar servlet-a presetnes taj request i proveris login session, i onda redirectujes login stranu ili prvustranu.

Tako ako mozes postavi ovde project file structure ili slobodno upload-uj ceo project pa da pogledam.
[ ŽIKI @ 31.10.2013. 17:53 ] @
Sve radim na localhostu, pišem u Java EE Eclipse, vrti se Apache Tomcat 7.0, + PostgreSQL baza.
Evo primera koda, sve je osnovno, verifikacije i sigurnost ću kasnije, ovo mi je samo da bi razumeo kako radi, pošto prvi put koristim servlet.

login.jsp
Code:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
</head>
<body>
    <center>
        <form action=LoginServlet>
            <table>
                <tr>
                    <th colspan="2">Login Form</th>
                </tr>
                <tr>
                    <td>Enter your UserId:</td>
                    <td><input type=text name=userId></td>
                </tr>
                <tr>
                    <td>Enter your Password:</td>
                    <td><input type=password name=pwd></td>
                </tr>
                <tr>
                    <td colspan="2" align="right"><input type=submit value=submit></td>
                </tr>
            </table>
        </form>
    </center>
</body>
</html>


LoginServlet.java
Code:
package servlet.proba;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.*;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        String userId = request.getParameter("userId");
        String password = request.getParameter("pwd");
        String searchQuery = "select * from users where username='" + userId + "' AND password='" + password + "'";
        try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException e) {
            System.out.println("Gde ti je PostgreSQL JDBC Driver?");
            e.printStackTrace();
            return;
        }
        
        try {
            Connection con = DriverManager.getConnection("jdbc:postgresql://localhost:5432/myDb", "postgres", "");
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery(searchQuery);
            boolean isEmpty = rs.next();
            if (!isEmpty) {
                // redirect to error page
                response.sendRedirect("LoginFail.jsp");
            } else if (isEmpty) {
                // fetch the session from request, create new session if session
                // is not present in the request
                HttpSession session = request.getSession(true);
                session.setMaxInactiveInterval(30*60);
                session.setAttribute("username", rs.getString("username"));
                // redirect to success page
                 response.sendRedirect("izbor.jsp");  //LoginSuccess
            }
        } catch (SQLException e) {
            System.out.println("SQLException occured: " + e.getMessage());
            e.printStackTrace();
        }
        
}
}


izbor.jsp
Code:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Izbor klijenta</title>
</head>
<body>
<% if(session.getAttribute("username") == null){
    response.sendRedirect("login.jsp");}%>
   
<form action=upload.jsp >
    <input type="submit" value="KLIJENT1" style="height:150px; width:250px">
</form>
</body>
</html>


Znači ukoliko stavim ove 2 linije koda, uvek me u browser-u vraća na login stranu ako nisam ulogovan. U suprotnom mogu da pristupim bilo kom fajlu samo kucajući putanju.
[ iglig @ 01.11.2013. 02:42 ] @
Nema potrebe da stalno kopiraš kod iz jedne JSP u drugu, u ovom primeru su to samo dve linije, šta ćeš kada ih bude 100-200-300?
U svaki JSP koji odgovara SK-u prijavljenog korisnika možeš dinamički dodati neku drugu JSP stranu, koja može a i ne mora sadržati HTML kod. U praksi prijavljeni korisnik uvek ima pristup kontroli za odjavu sa sistema ili vidi prikazano korisničko ime pod kojim je prijavljen, te je stoga praktično smestiti te komponente u zaglavlje stranice ili poseban DIV panel sa strane a koji će zgodno biti sadržan u "header_korisnik.jsp", što svakoj opisanoj stranici govorimo sledećim kodom:
Code:
<div id="header">
              <jsp:include page="header_korisnik.jsp"/>
        </div>

header_korisnik.jsp
Code:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8" errorPage="greska.jsp" 
    import="moj.sistem.beans.BeanKorisnik"%>
<div id="header">
            <p id="prijavljen">
                Prijavljen korisnik:
                <%BeanKorisnik trenutniKorisnik = ((BeanKorisnik)(session.getAttribute("trenutniKorisnik")));%>
                <%=trenutniKorisnik.getIme() + " "+ trenutniKorisnik.getPrezime()%>
            </p>
            <div id="odjava">
                <form action="odjava">
                    <input type="hidden" id="sk" name="sk" value="Odjavi se">
                    <input type="submit" value="Odjavi se">
                </form>
            </div>
        </div>

Svaka stranica sadrži posrednu proveru prijavljenog korisnika, tjst izbaciće grešku za korisnike koji nemaju dozvolu pristupa, koji su se odjavili (request.getSession().invalidate(); ) ili kojima je istekla sesija. Ovu situaciju obrađujemo sa "errorPage="greska.jsp"" i time preusmeravamo takve zahteve na greska.jsp:
Code:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Došlo je do greške!</title>
</head>
<body>
<% response.setHeader("Refresh", "10;url=kontrolerLogin"); %>
    <center>
        <h1>Niste prijavljeni na sistem ili je došlo do greške. </h1>
        <h3>Kontaktirajte tehničku podršku ukoliko se greška ponovi.</h3> 
    </center>
</body>
</html>

Posle 10s klijent automatski pravi nov zahtev servletu koji obrađuje putanju "kontrolerLogin" i potom preusmerava korisnika na odgovarajuću stranicu.

Obrati pažnju na to da prijavu korisnika obavezno radiš u doPost a ne u doGet, prvenstveno zbog toga što se sa doGet lozinka ispisuje u adresnom baru.
U sesiji čuvaj objekat tipa (klase) Korisnik jer je bezveze da stalno prosleđuješ brdo korisničkih atributa.
select * from... u kombinaciji sa Statement objektom i nekoliko navodnika vraća celokupnu tabelu. <eeek!> Umesto ovoga koristi PreparedStatement i izričito navedi koje kolone biraš, dakle SELECT username, password...

Kasno je pa sam stoga napisao nepovezane odgovore ali snaćićeš se već.
[ nemnesic @ 01.11.2013. 10:03 ] @
Zasto ne prebacis jsp u WEB-INF npr WEB-INF/jsp
Onda one nisu public accessible.
I naravno moras da kzes servletima gde su jsp

Ovako izbegavas da ubaciujes logic unutra JSP.


Drugo resenje bi bilo da se igras sa filterima. Ali mislim da je prvo bolje.