feat/add login and logout logic with filters
This commit is contained in:
parent
14b5d9bccf
commit
b2903e087a
|
|
@ -2,10 +2,11 @@ package org.example.je.jdbc.dao;
|
||||||
|
|
||||||
import lombok.AccessLevel;
|
import lombok.AccessLevel;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import org.example.je.jdbc.entity.User;
|
import org.example.je.jdbc.entity.*;
|
||||||
import org.example.je.jdbc.exeption.DaoException;
|
import org.example.je.jdbc.exeption.DaoException;
|
||||||
import utils.ConnectionManager;
|
import utils.ConnectionManager;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -21,6 +22,12 @@ public class UserDao implements Dao<Long, User> {
|
||||||
name, birthdate, email, password, role, gender)
|
name, birthdate, email, password, role, gender)
|
||||||
VALUES (?, ?, ?, ?, ?, ?);
|
VALUES (?, ?, ?, ?, ?, ?);
|
||||||
""";
|
""";
|
||||||
|
|
||||||
|
private final static String GET_BY_EMAIL_AND_PASSWORD_SQL = """
|
||||||
|
SELECT * FROM public.users
|
||||||
|
WHERE email = ? and password = ?;
|
||||||
|
""";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public User save(User user) {
|
public User save(User user) {
|
||||||
try (var connection = ConnectionManager.get();
|
try (var connection = ConnectionManager.get();
|
||||||
|
|
@ -64,6 +71,39 @@ public class UserDao implements Dao<Long, User> {
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Optional<User> findByIdEmailAndPassword(String email, String password) {
|
||||||
|
try (var connection = ConnectionManager.get();
|
||||||
|
var statement = connection.prepareStatement(GET_BY_EMAIL_AND_PASSWORD_SQL)) {
|
||||||
|
User user = null;
|
||||||
|
statement.setString(1, email);
|
||||||
|
statement.setString(2, password);
|
||||||
|
|
||||||
|
var recordSet = statement.executeQuery();
|
||||||
|
|
||||||
|
if (recordSet.next()) {
|
||||||
|
user = buildUser(recordSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Optional.ofNullable(user);
|
||||||
|
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw new DaoException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private User buildUser(ResultSet resultSet) throws SQLException {
|
||||||
|
return new User(
|
||||||
|
resultSet.getLong("id"),
|
||||||
|
resultSet.getString("name"),
|
||||||
|
resultSet.getString("email"),
|
||||||
|
resultSet.getString("password"),
|
||||||
|
Role.valueOf(resultSet.getString("role")),
|
||||||
|
Gender.valueOf(resultSet.getString("gender")),
|
||||||
|
resultSet.getDate("birthdate").toLocalDate()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static UserDao getInstance() {
|
public static UserDao getInstance() {
|
||||||
return INSTANCE;
|
return INSTANCE;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,18 @@ package org.example.je.jdbc.dto;
|
||||||
|
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import org.example.je.jdbc.entity.Gender;
|
||||||
|
import org.example.je.jdbc.entity.Role;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@Builder
|
@Builder
|
||||||
public class UserDto {
|
public class UserDto {
|
||||||
private Long id;
|
Long id;
|
||||||
private String email;
|
String name;
|
||||||
|
String email;
|
||||||
|
LocalDate birthdate;
|
||||||
|
Role role;
|
||||||
|
Gender gender;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
package org.example.je.jdbc.filter;
|
||||||
|
|
||||||
|
import jakarta.servlet.*;
|
||||||
|
import jakarta.servlet.annotation.WebFilter;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static utils.UrlPath.LOGIN;
|
||||||
|
import static utils.UrlPath.REGISTRATION;
|
||||||
|
|
||||||
|
@WebFilter("/*")
|
||||||
|
public class AuthorizationFilter implements Filter {
|
||||||
|
private static final Set<String> PUBLIC_PATH = Set.of(LOGIN, REGISTRATION);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
|
||||||
|
var uri = ((HttpServletRequest) servletRequest).getRequestURI();
|
||||||
|
|
||||||
|
if(isPublicPath(uri) || isUserLoggedIn(servletRequest)){
|
||||||
|
filterChain.doFilter(servletRequest,servletResponse);
|
||||||
|
} else {
|
||||||
|
((HttpServletResponse) servletResponse).sendRedirect("/login");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isUserLoggedIn(ServletRequest servletRequest) {
|
||||||
|
var user = ((HttpServletRequest) servletRequest).getSession().getAttribute("user");
|
||||||
|
return user != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isPublicPath(String uri) {
|
||||||
|
return PUBLIC_PATH.stream().anyMatch(uri::startsWith);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
package org.example.je.jdbc.filter;
|
||||||
|
|
||||||
|
import jakarta.servlet.*;
|
||||||
|
import jakarta.servlet.annotation.WebFilter;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
@WebFilter("/*")
|
||||||
|
public class CharsetFilter implements Filter {
|
||||||
|
@Override
|
||||||
|
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
|
||||||
|
servletResponse.setCharacterEncoding(StandardCharsets.UTF_8.name());
|
||||||
|
servletRequest.setCharacterEncoding(StandardCharsets.UTF_8.name());
|
||||||
|
|
||||||
|
filterChain.doFilter(servletRequest,servletResponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
package org.example.je.jdbc.filter;
|
||||||
|
|
||||||
|
import jakarta.servlet.*;
|
||||||
|
import jakarta.servlet.annotation.WebFilter;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
@WebFilter("/*")
|
||||||
|
public class LoggingFilter implements Filter {
|
||||||
|
@Override
|
||||||
|
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
|
||||||
|
System.out.println(((HttpServletRequest) servletRequest).getSession().getAttribute("user"));
|
||||||
|
servletRequest.getParameterMap().forEach((k, v) -> System.out.println(k + " : " + Arrays.toString(v)));
|
||||||
|
|
||||||
|
|
||||||
|
filterChain.doFilter(servletRequest,servletResponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
package org.example.je.jdbc.filter;
|
||||||
|
|
||||||
|
import jakarta.servlet.*;
|
||||||
|
import jakarta.servlet.annotation.WebFilter;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import org.example.je.jdbc.dto.UserDto;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@WebFilter("/admin")
|
||||||
|
public class UnsaveFilter implements Filter {
|
||||||
|
@Override
|
||||||
|
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
|
||||||
|
var user = (UserDto) ((HttpServletRequest) servletRequest).getSession().getAttribute("user");
|
||||||
|
if(user != null){
|
||||||
|
filterChain.doFilter(servletRequest,servletResponse);
|
||||||
|
} else {
|
||||||
|
((HttpServletResponse) servletResponse).sendRedirect("/registration");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
package org.example.je.jdbc.mapper;
|
||||||
|
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import org.example.je.jdbc.dto.UserDto;
|
||||||
|
import org.example.je.jdbc.entity.User;
|
||||||
|
|
||||||
|
import static lombok.AccessLevel.PRIVATE;
|
||||||
|
|
||||||
|
@NoArgsConstructor(access = PRIVATE)
|
||||||
|
public class UserMapper implements Mapper<UserDto, User> {
|
||||||
|
private static final UserMapper INSTANCE = new UserMapper();
|
||||||
|
|
||||||
|
public static UserMapper getInstance(){
|
||||||
|
return INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UserDto mapFrom(User user) {
|
||||||
|
return UserDto.builder()
|
||||||
|
.id(user.getId())
|
||||||
|
.email(user.getEmail())
|
||||||
|
.name(user.getName())
|
||||||
|
.birthdate(user.getBirthdate())
|
||||||
|
.role(user.getRole())
|
||||||
|
.gender(user.getGender())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,10 +2,14 @@ package org.example.je.jdbc.service;
|
||||||
|
|
||||||
import org.example.je.jdbc.dao.UserDao;
|
import org.example.je.jdbc.dao.UserDao;
|
||||||
import org.example.je.jdbc.dto.CreateUserDto;
|
import org.example.je.jdbc.dto.CreateUserDto;
|
||||||
|
import org.example.je.jdbc.dto.UserDto;
|
||||||
import org.example.je.jdbc.exeption.ValidationExeption;
|
import org.example.je.jdbc.exeption.ValidationExeption;
|
||||||
import org.example.je.jdbc.mapper.CreateUserMapper;
|
import org.example.je.jdbc.mapper.CreateUserMapper;
|
||||||
|
import org.example.je.jdbc.mapper.UserMapper;
|
||||||
import org.example.je.jdbc.validator.CreateUserValidator;
|
import org.example.je.jdbc.validator.CreateUserValidator;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
public class UserService {
|
public class UserService {
|
||||||
private static final UserService INSTANCE = new UserService();
|
private static final UserService INSTANCE = new UserService();
|
||||||
private static final UserDao userDao = UserDao.getInstance();
|
private static final UserDao userDao = UserDao.getInstance();
|
||||||
|
|
@ -32,4 +36,8 @@ public class UserService {
|
||||||
|
|
||||||
private UserService() {
|
private UserService() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Optional<UserDto> login(String email, String password) {
|
||||||
|
return userDao.findByIdEmailAndPassword(email, password).map(user -> UserMapper.getInstance().mapFrom(user));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
package org.example.je.jdbc.servlet;
|
||||||
|
|
||||||
|
import jakarta.servlet.ServletException;
|
||||||
|
import jakarta.servlet.annotation.WebServlet;
|
||||||
|
import jakarta.servlet.http.HttpServlet;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import lombok.SneakyThrows;
|
||||||
|
import org.example.je.jdbc.dto.UserDto;
|
||||||
|
import org.example.je.jdbc.service.UserService;
|
||||||
|
import utils.JspHelper;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@WebServlet("/login")
|
||||||
|
public class LoginServlet extends HttpServlet {
|
||||||
|
private static final UserService userService = UserService.getInstance();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
||||||
|
req.getRequestDispatcher(JspHelper.getPath("login")).forward(req, resp);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
|
||||||
|
userService.login(req.getParameter("email"), req.getParameter("password"))
|
||||||
|
.ifPresentOrElse(userDto -> onLoginSuccess(userDto, req, resp), ()-> onLoginFail(req, resp));
|
||||||
|
}
|
||||||
|
|
||||||
|
@SneakyThrows
|
||||||
|
private void onLoginFail(HttpServletRequest req, HttpServletResponse resp) {
|
||||||
|
resp.sendRedirect("/login?error&email="+req.getParameter("email"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@SneakyThrows
|
||||||
|
private void onLoginSuccess(UserDto userDto, HttpServletRequest req, HttpServletResponse resp) {
|
||||||
|
req.getSession().setAttribute("user", userDto);
|
||||||
|
resp.sendRedirect("/flights");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
package org.example.je.jdbc.servlet;
|
||||||
|
|
||||||
|
import jakarta.servlet.ServletException;
|
||||||
|
import jakarta.servlet.annotation.WebServlet;
|
||||||
|
import jakarta.servlet.http.HttpServlet;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@WebServlet("/logout")
|
||||||
|
public class LogoutServlet extends HttpServlet {
|
||||||
|
@Override
|
||||||
|
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
|
||||||
|
req.getSession().invalidate();
|
||||||
|
resp.sendRedirect("login");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -23,6 +23,7 @@ public final class ConnectionManager {
|
||||||
private static void loadDriver() {
|
private static void loadDriver() {
|
||||||
try {
|
try {
|
||||||
Class.forName("org.postgresql.Driver");
|
Class.forName("org.postgresql.Driver");
|
||||||
|
Class.forName("utils.UrlPath");
|
||||||
} catch (ClassNotFoundException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
package utils;
|
||||||
|
|
||||||
|
public final class UrlPath {
|
||||||
|
public static final String LOGIN = "/login";
|
||||||
|
public static final String REGISTRATION = "/registration";
|
||||||
|
|
||||||
|
private UrlPath() {
|
||||||
|
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
|
||||||
|
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
|
||||||
|
|
||||||
|
<c:if test="${not empty sessionScope.user}">
|
||||||
|
<form action="${pageContext.request.contextPath}/logout" method="post">
|
||||||
|
<button type="submit">Logout</button>
|
||||||
|
</form>
|
||||||
|
</c:if>
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
<%@ page import="org.example.je.jdbc.service.TicketService"%>
|
||||||
|
<%@ page import="org.example.je.jdbc.dto.TicketDto"%>
|
||||||
|
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
|
||||||
|
|
||||||
|
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
|
||||||
|
<%@ taglib prefix="fn" uri="jakarta.tags.functions" %>
|
||||||
|
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Регистрация</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Регистрация:</h1>
|
||||||
|
<form action="/login" method="POST">
|
||||||
|
<label for="email">Email:</label><br>
|
||||||
|
<input type="email" id="email" name="email" required><br><br>
|
||||||
|
|
||||||
|
<label for="password">Password:</label><br>
|
||||||
|
<input type="password" id="password" name="password" required><br><br>
|
||||||
|
|
||||||
|
<button type="submit">Login</button>
|
||||||
|
</form>
|
||||||
|
<a href="${pageContext.request.contextPath}/register">Register</a>
|
||||||
|
<c:if test="${param.error != null}">
|
||||||
|
<div style="color:red">
|
||||||
|
<span>Login or password incorrect</span>
|
||||||
|
</div>
|
||||||
|
</c:if>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -10,6 +10,7 @@
|
||||||
<title>Билеты</title>
|
<title>Билеты</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<%@ include file="header.jsp"%>
|
||||||
<h1>Билеты:</h1>
|
<h1>Билеты:</h1>
|
||||||
<ol>
|
<ol>
|
||||||
<c:forEach var="ticket" items="${requestScope.tickets}">
|
<c:forEach var="ticket" items="${requestScope.tickets}">
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue