Erstellen Sie eine einfache Anmeldeanwendung und sichere Seiten mit Java Servlet Filter
1. Warum ist es sicher?
Die Sicherheit (Security) ist ein wichtiger Aspekt einer Applikation mit dem Transport der wictigen Daten im Internet
Authentication (Die Bestätigung)
Die Bestätigung ist ein Prozess, in dem die Zugriffberechtigung (access privileges) des Benutzer bestätigt wird bevor er in der gesicherten Raum von Website. Es gibt 2 Maßnahmen bei der Bestätigung: die grundlegende Bestätigung und die formbasierte Bestätigung (Form-based authentication).
Basic Authentication (Die Basis Bestätigung).
Für die Basis Bestätigung kann der Benutzer normal alle Seite (page) zugreifen. Für die gesicherte Seite wird ein Fenster anzeigen damit der Benutzer den username/password von ihm typen kann. Die Information von username/password wird eingepackt und dann mit der Anforderung (request) zum Server zu schicken.
Wenn der Benutzer einen Pfad auf dem Browser eingibt und auf Enter zur Anforderung einer Seite klickt. Eine Information "User Agent" wird erstellt und mit dem Anforderung geschickt wird. Normalerweise schließt die Information die Browserinformation des Benutzer und die Information von dem Betriebssystem ein. In der Fall von der Basis Bestätigung (basic authentication) wird die Information username/password in "User Agent" eingepackt.
In dieser Unterricht meine ich nicht detailiert die Basis Bestätigung.
Form-based Authentication (Die Bestätigung nach der Forme)
Die meiste Website benutzen die formbasierte Bestätigung (Form-based Authentication). Website erlaubt den Benutzer, in alle normalen Seite ohne das Passwort zuzugreifen. Allerdings wenn der Benutzer in einer gesicherten Seite zugreifen, wird sie zum der Log-in Seite umzuleiten
Im Unterricht meine ich die Benutzung eines Servlet Filter detailiert um die Applikation Java Web zu sichern.
2. Der Begriff über Role und Principal
In der Sicherheit gibt es 2 wichtigen Begriffe Principal und Role.
Role
Role (die Rolle ) ist eine Kollektion der Berechtigung (permission) für eine Applikation.
Ich gebe ein Beispiel um leicht zu verstehen. Zum Beispiel: Die Applikation ABC hat 2 Rolle "EMPLOYEE" (Mitarbeiter) und "MANAGER" (Manager).
- Die Rolle "EMPLOYEE" darf die Funktion vom Verkauf und der Neuerstellung der Kunde benutzen.
- Die Rolle "MANAGER" darf die Funktion zur Management der Mitarbeiter und zum Anschauen der Umsatzsberichte
Principal
Principal kann nach der Anmeldung in einem System vorläufig als ein "Subjekt" verstanden werden. Sie sind berechtig, etwas in System zu machen. Ein "Subjekt" kann eine oder mehre Rolle haben. Das hängt von der Rechtsaufteilung der Applikation für jedes Konto des unterschiedlichen Benutzer ab
3. Die Sicherheit mit Servlet Filter
In der Applikation von Java Servlet wird ein Servlet Filter besonders zur Sicherheitsbehandlung benutzt. Er wird normalerweise als Security Filter genannt.
Unten sind die Operationsgrundsätze vom Security Filter.
Wenn der Benutzer in einer gesicherten Seite zugrifft, wird Security Filter prüfen, wenn der Benutzer noch nicht angemeldet hat, wird die Anforderung vom Benutzer zur Login Seite umgeleitet
Wenn der Benutzer schon angemeldet hat, wird ein Objekt Principal erstellt. Es enthaltet die Information des Benutzer, einschließend die Rolle
Wenn der Benutzer schon vorher angemeldet hat und in einer gesicherten Seite zugegriffen hat, wird Security Filter prüfen, ob die Rolle des Benutzer entsprechen oder nicht. Wenn nicht, wird es dem Benutzer eine Seite zur Benachrichtigun "Zugang abgelehnt" (Access Denied).
4. Das Ziel von Beispiele
Das ist die Struktur von der Applikation, die wir implementieren
Die Applikation fasst die 2 Rolle EMPLOYEE và MANAGER um
- Die Rolle EMPLOYEE darf in 2 Seite /userInfo und /employeeTask zugreifen
- Die Rolle MANAGER darf in die 2 Seite /userInfo und /managerTask zugreifen.
Es gibt 2 Benutzer (user) employee1 und manager1.
- Der Benutzer employee1 wird die Rolle als EMPLOYEE angewiesen
- Der Benutzer manager1 wirde die 2 Rolle MANAGER und EMPLOYEE angewiesen
Der Benutzer kann alle ungesicherten Seite zugreifen. Allerdings wenn der Benutzer in der gesicherten ABC Seite, wird er zur Login Seite weitergeleitet(redirect). Der Benutzer hat erfolgreich angemeldet, gibt es dann 2 Optionen :
- Die Applikation wird in die Seite ABC nach der erfolgreichen Anmeldung umgeleitet wennuserName die angemessene Rolle hat.
- Die Applikation zeigt die Benachrichtigung "Zugang abgelehnt (Access Denied) an wenn userName keine angemessene Rolle hat
5. Die Applikatione erstellen
Auf Eclipse erstellen Sie ein"Dynamic Web Project" mit dem Name SecurityWebApp, und konfigurieren damit es auf Tomcat Server laufen kann. Ich meine die Schritte von der Durchführung nicht detailiert. Sie können die folgende Unterricht lesen
6. UserAccount & DataDAO
Die Klasse UserAccount vertritt den Benutzer der Applikation
UserAccount.java
package org.o7planning.securitywebapp.bean;
import java.util.ArrayList;
import java.util.List;
public class UserAccount {
public static final String GENDER_MALE = "M";
public static final String GENDER_FEMALE = "F";
private String userName;
private String gender;
private String password;
private List<String> roles;
public UserAccount() {
}
public UserAccount(String userName, String password, String gender, String... roles) {
this.userName = userName;
this.password = password;
this.gender = gender;
this.roles = new ArrayList<String>();
if (roles != null) {
for (String r : roles) {
this.roles.add(r);
}
}
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public List<String> getRoles() {
return roles;
}
public void setRoles(List<String> roles) {
this.roles = roles;
}
}
Die Klasse DataDAO wird benutzt um die Daten in Database abzufragen
DataDAO.java
package org.o7planning.securitywebapp.utils;
import java.util.HashMap;
import java.util.Map;
import org.o7planning.securitywebapp.bean.UserAccount;
import org.o7planning.securitywebapp.config.SecurityConfig;
public class DataDAO {
private static final Map<String, UserAccount> mapUsers = new HashMap<String, UserAccount>();
static {
initUsers();
}
private static void initUsers() {
// This user has a role as EMPLOYEE.
UserAccount emp = new UserAccount("employee1", "123", UserAccount.GENDER_MALE, //
SecurityConfig.ROLE_EMPLOYEE);
// This user has 2 roles EMPLOYEE and MANAGER.
UserAccount mng = new UserAccount("manager1", "123", UserAccount.GENDER_MALE, //
SecurityConfig.ROLE_EMPLOYEE, SecurityConfig.ROLE_MANAGER);
mapUsers.put(emp.getUserName(), emp);
mapUsers.put(mng.getUserName(), mng);
}
// Find a User by userName and password.
public static UserAccount findUser(String userName, String password) {
UserAccount u = mapUsers.get(userName);
if (u != null && u.getPassword().equals(password)) {
return u;
}
return null;
}
}
7. SecurityConfig & SecurityUtils
Die Klasse SecurityConfig hilft bei der Konfiguration der Rolle und der Funktion, die zugriffberechtig werden
SecurityConfig.java
package org.o7planning.securitywebapp.config;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class SecurityConfig {
public static final String ROLE_MANAGER = "MANAGER";
public static final String ROLE_EMPLOYEE = "EMPLOYEE";
// String: Role
// List<String>: urlPatterns.
private static final Map<String, List<String>> mapConfig = new HashMap<String, List<String>>();
static {
init();
}
private static void init() {
// Die Rolle "EMPLOYEE" konfigurieren
List<String> urlPatterns1 = new ArrayList<String>();
urlPatterns1.add("/userInfo");
urlPatterns1.add("/employeeTask");
mapConfig.put(ROLE_EMPLOYEE, urlPatterns1);
// Die Rolle "MANAGER" konfigurieren
List<String> urlPatterns2 = new ArrayList<String>();
urlPatterns2.add("/userInfo");
urlPatterns2.add("/managerTask");
mapConfig.put(ROLE_MANAGER, urlPatterns2);
}
public static Set<String> getAllAppRoles() {
return mapConfig.keySet();
}
public static List<String> getUrlPatternsForRole(String role) {
return mapConfig.get(role);
}
}
Die Klasse SecurityUtils ist eine Utility Klasse. Sie hat die Methode, damit können Sie checken, eine Anforderung (request ) muss angemeldet sein oder ob die Request die Rolle des Benutzer entspricht oder nicht
SecurityUtils.java
package org.o7planning.securitywebapp.utils;
import java.util.List;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import org.o7planning.securitywebapp.config.SecurityConfig;
public class SecurityUtils {
// Prüfen, ob 'request' zwanghaft anmelden brauchen oder nicht.
public static boolean isSecurityPage(HttpServletRequest request) {
String urlPattern = UrlPatternUtils.getUrlPattern(request);
Set<String> roles = SecurityConfig.getAllAppRoles();
for (String role : roles) {
List<String> urlPatterns = SecurityConfig.getUrlPatternsForRole(role);
if (urlPatterns != null && urlPatterns.contains(urlPattern)) {
return true;
}
}
return false;
}
// Prüfen, ob 'request' der Rolle entspricht oder nicht?
public static boolean hasPermission(HttpServletRequest request) {
String urlPattern = UrlPatternUtils.getUrlPattern(request);
Set<String> allRoles = SecurityConfig.getAllAppRoles();
for (String role : allRoles) {
if (!request.isUserInRole(role)) {
continue;
}
List<String> urlPatterns = SecurityConfig.getUrlPatternsForRole(role);
if (urlPatterns != null && urlPatterns.contains(urlPattern)) {
return true;
}
}
return false;
}
}
UrlPatternUtils.java
package org.o7planning.securitywebapp.utils;
import java.util.Collection;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletRegistration;
import javax.servlet.http.HttpServletRequest;
public class UrlPatternUtils {
private static boolean hasUrlPattern(ServletContext servletContext, String urlPattern) {
Map<String, ? extends ServletRegistration> map = servletContext.getServletRegistrations();
for (String servletName : map.keySet()) {
ServletRegistration sr = map.get(servletName);
Collection<String> mappings = sr.getMappings();
if (mappings.contains(urlPattern)) {
return true;
}
}
return false;
}
// servletPath:
// ==> /spath
// ==> /spath/*
// ==> *.ext
// ==> /
public static String getUrlPattern(HttpServletRequest request) {
ServletContext servletContext = request.getServletContext();
String servletPath = request.getServletPath();
String pathInfo = request.getPathInfo();
String urlPattern = null;
if (pathInfo != null) {
urlPattern = servletPath + "/*";
return urlPattern;
}
urlPattern = servletPath;
boolean has = hasUrlPattern(servletContext, urlPattern);
if (has) {
return urlPattern;
}
int i = servletPath.lastIndexOf('.');
if (i != -1) {
String ext = servletPath.substring(i + 1);
urlPattern = "*." + ext;
has = hasUrlPattern(servletContext, urlPattern);
if (has) {
return urlPattern;
}
}
return "/";
}
}
8. SecurityFilter
SecurityFilter ist ein Servlet Filter, Es prüft die request vor der Genehmigung zum Zugang in der gesicherten Seite
SecurityFilter liest"die Sicherheit Konfiguration", die in der Klasse SecurityConfig erklärt.
SecurityFilter liest"die Sicherheit Konfiguration", die in der Klasse SecurityConfig erklärt.
SecurityFilter.java
package org.o7planning.securitywebapp.filter;
import java.io.IOException;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.o7planning.securitywebapp.bean.UserAccount;
import org.o7planning.securitywebapp.request.UserRoleRequestWrapper;
import org.o7planning.securitywebapp.utils.AppUtils;
import org.o7planning.securitywebapp.utils.SecurityUtils;
@WebFilter("/*")
public class SecurityFilter implements Filter {
public SecurityFilter() {
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
String servletPath = request.getServletPath();
// Die Information des Benutzer wird in Session gespeichert
// (Nach der Anmeldung).
UserAccount loginedUser = AppUtils.getLoginedUser(request.getSession());
if (servletPath.equals("/login")) {
chain.doFilter(request, response);
return;
}
HttpServletRequest wrapRequest = request;
if (loginedUser != null) {
// User Name
String userName = loginedUser.getUserName();
// Die Rolle (Role).
List<String> roles = loginedUser.getRoles();
// Die alte Anforderung (request) durch ein neues Request mit der Information von userName und Roles einpacken.
wrapRequest = new UserRoleRequestWrapper(userName, roles, request);
}
// Die Seite müssen zwanghaft anmelden.
if (SecurityUtils.isSecurityPage(request)) {
// Wenn der Benutzer nicht angemeldet het, wird zur Login Seite umgeleitet (redirect)
if (loginedUser == null) {
String requestUri = request.getRequestURI();
// Die aktuelle Seite speichern um in diese Seite nach der Anmeldung umzuleiten.
int redirectId = AppUtils.storeRedirectAfterLoginUrl(request.getSession(), requestUri);
response.sendRedirect(wrapRequest.getContextPath() + "/login?redirectId=" + redirectId);
return;
}
// Prüfen, ob der Benutzer die entsprechende Rolle hat oder nicht?
boolean hasPermission = SecurityUtils.hasPermission(wrapRequest);
if (!hasPermission) {
RequestDispatcher dispatcher //
= request.getServletContext().getRequestDispatcher("/WEB-INF/views/accessDeniedView.jsp");
dispatcher.forward(request, response);
return;
}
}
chain.doFilter(wrapRequest, response);
}
@Override
public void init(FilterConfig fConfig) throws ServletException {
}
}
UserRoleRequestWrapper.java
package org.o7planning.securitywebapp.request;
import java.security.Principal;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
* An extension for the HTTPServletRequest that overrides the getUserPrincipal()
* and isUserInRole(). We supply these implementations here, where they are not
* normally populated unless we are going through the facility provided by the
* container.
* <p>
* If he user or roles are null on this wrapper, the parent request is consulted
* to try to fetch what ever the container has set for us. This is intended to
* be created and used by the UserRoleFilter.
*
* @author thein
*
*/
public class UserRoleRequestWrapper extends HttpServletRequestWrapper {
private String user;
private List<String> roles = null;
private HttpServletRequest realRequest;
public UserRoleRequestWrapper(String user, List<String> roles, HttpServletRequest request) {
super(request);
this.user = user;
this.roles = roles;
this.realRequest = request;
}
@Override
public boolean isUserInRole(String role) {
if (roles == null) {
return this.realRequest.isUserInRole(role);
}
return roles.contains(role);
}
@Override
public Principal getUserPrincipal() {
if (this.user == null) {
return realRequest.getUserPrincipal();
}
// Make an anonymous implementation to just return our user
return new Principal() {
@Override
public String getName() {
return user;
}
};
}
}
9. Home Page, Login, Logout
HomeServlet.java
package org.o7planning.securitywebapp.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet({ "/", "/index" })
public class HomeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public HomeServlet() {
super();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
RequestDispatcher dispatcher //
= this.getServletContext().getRequestDispatcher("/WEB-INF/views/homeView.jsp");
dispatcher.forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
LoginServlet.java
package org.o7planning.securitywebapp.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
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 org.o7planning.securitywebapp.bean.UserAccount;
import org.o7planning.securitywebapp.utils.AppUtils;
import org.o7planning.securitywebapp.utils.DataDAO;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LoginServlet() {
super();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
RequestDispatcher dispatcher //
= this.getServletContext().getRequestDispatcher("/WEB-INF/views/loginView.jsp");
dispatcher.forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userName = request.getParameter("userName");
String password = request.getParameter("password");
UserAccount userAccount = DataDAO.findUser(userName, password);
if (userAccount == null) {
String errorMessage = "Invalid userName or Password";
request.setAttribute("errorMessage", errorMessage);
RequestDispatcher dispatcher //
= this.getServletContext().getRequestDispatcher("/WEB-INF/views/loginView.jsp");
dispatcher.forward(request, response);
return;
}
AppUtils.storeLoginedUser(request.getSession(), userAccount);
//
int redirectId = -1;
try {
redirectId = Integer.parseInt(request.getParameter("redirectId"));
} catch (Exception e) {
}
String requestUri = AppUtils.getRedirectAfterLoginUrl(request.getSession(), redirectId);
if (requestUri != null) {
response.sendRedirect(requestUri);
} else {
// Default nach der Anmeldung wird die Seite /userInfo umgeleitet
response.sendRedirect(request.getContextPath() + "/userInfo");
}
}
}
AppUtils.java
package org.o7planning.securitywebapp.utils;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
import org.o7planning.securitywebapp.bean.UserAccount;
public class AppUtils {
private static int REDIRECT_ID = 0;
private static final Map<Integer, String> id_uri_map = new HashMap<Integer, String>();
private static final Map<String, Integer> uri_id_map = new HashMap<String, Integer>();
// Die Information des Benutzer in Session speichern.
public static void storeLoginedUser(HttpSession session, UserAccount loginedUser) {
// Auf JSP kann durch ${loginedUser} zugreifen
session.setAttribute("loginedUser", loginedUser);
}
// Die vom Benutzer in Session gespeicherten Information aufnehmen
public static UserAccount getLoginedUser(HttpSession session) {
UserAccount loginedUser = (UserAccount) session.getAttribute("loginedUser");
return loginedUser;
}
public static int storeRedirectAfterLoginUrl(HttpSession session, String requestUri) {
Integer id = uri_id_map.get(requestUri);
if (id == null) {
id = REDIRECT_ID++;
uri_id_map.put(requestUri, id);
id_uri_map.put(id, requestUri);
return id;
}
return id;
}
public static String getRedirectAfterLoginUrl(HttpSession session, int redirectId) {
String url = id_uri_map.get(redirectId);
if (url != null) {
return url;
}
return null;
}
}
LogoutServlet.java
package org.o7planning.securitywebapp.servlet;
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;
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LogoutServlet() {
super();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getSession().invalidate();
// Redrect to Home Page.
response.sendRedirect(request.getContextPath() + "/");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
UserInfoServlet.java
package org.o7planning.securitywebapp.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/userInfo")
public class UserInfoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public UserInfoServlet() {
super();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
RequestDispatcher dispatcher //
= this.getServletContext().getRequestDispatcher("/WEB-INF/views/userInfoView.jsp");
dispatcher.forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>SecurityWebApp</display-name>
<welcome-file-list>
<welcome-file>/</welcome-file>
</welcome-file-list>
</web-app>
/WEB-INF/views/_menu.jsp
<a href="${pageContext.request.contextPath}/employeeTask">
Employee Task
</a>
||
<a href="${pageContext.request.contextPath}/managerTask">
Manager Task
</a>
||
<a href="${pageContext.request.contextPath}/userInfo">
User Info
</a>
||
<a href="${pageContext.request.contextPath}/login">
Login
</a>
||
<a href="${pageContext.request.contextPath}/logout">
Logout
</a>
<span style="color:red">[ ${loginedUser.userName} ]</span>
/WEB-INF/views/homeView.jsp
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Home Page</title>
</head>
<body>
<jsp:include page="_menu.jsp"></jsp:include>
<h3>Home Page</h3>
</body>
</html>
/WEB-INF/views/loginView.jsp
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<jsp:include page="_menu.jsp"></jsp:include>
<h3>Login Page</h3>
<p style="color: red;">${errorString}</p>
<form method="POST" action="${pageContext.request.contextPath}/login">
<input type="hidden" name="redirectId" value="${param.redirectId}" />
<table border="0">
<tr>
<td>User Name</td>
<td><input type="text" name="userName" value= "${user.userName}" /> </td>
</tr>
<tr>
<td>Password</td>
<td><input type="password" name="password" value= "${user.password}" /> </td>
</tr>
<tr>
<td colspan ="2">
<input type="submit" value= "Submit" />
<a href="${pageContext.request.contextPath}/">Cancel</a>
</td>
</tr>
</table>
</form>
<p style="color:blue;">Login with:</p>
employee1/123 <br>
manager1/123
</body>
</html>
/WEB-INF/views/userInfoView.jsp
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>User Info</title>
</head>
<body>
<jsp:include page="_menu.jsp"></jsp:include>
<h3>Hello: ${loginedUser.userName}</h3>
User Name: <b>${loginedUser.userName}</b>
<br />
Gender: ${loginedUser.gender } <br />
</body>
</html>
Die Applikation laufen:
10. Die Seite müssen angemeldet sein
EmployeeTaskServlet.java
package org.o7planning.securitywebapp.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/employeeTask")
public class EmployeeTaskServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public EmployeeTaskServlet() {
super();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
RequestDispatcher dispatcher //
= this.getServletContext()//
.getRequestDispatcher("/WEB-INF/views/employeeTaskView.jsp");
dispatcher.forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
ManagerTaskServlet.java
package org.o7planning.securitywebapp.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/managerTask")
public class ManagerTaskServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public ManagerTaskServlet() {
super();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
RequestDispatcher dispatcher //
= this.getServletContext()//
.getRequestDispatcher("/WEB-INF/views/managerTaskView.jsp");
dispatcher.forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
/WEB-INF/views/employeeTaskView.jsp
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Employee Task</title>
</head>
<body>
<jsp:include page="_menu.jsp"></jsp:include>
<h3>Employee Task</h3>
Hello, This is a protected page!
</body>
</html>
/WEB-INF/views/managerTaskView.jsp
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Manager Task</title>
</head>
<body>
<jsp:include page="_menu.jsp"></jsp:include>
<h3>Manager Task</h3>
Hello, This is a protected page!
</body>
</html>
/WEB-INF/views/accessDenied.jsp
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Access Denied</title>
</head>
<body>
<jsp:include page="_menu.jsp"></jsp:include>
<br/><br/>
<h3 style="color:red;">Access Denied!</h3>
</body>
</html>
Die Applikation laufen:
Die Applikation laufen und mit userName = "employee1" anmelden. Das ist der Benutzer mit der Rolle von "EMPLOYEE".
Die Applikation laufen und mit userName = "manager1" anmelden. Das ist der Benutzer mit 2 Rollen "EMPLOYEE" und "MANAGER".
Anleitungen Java Servlet/JSP
- Installieren Sie Tomcat Server für Eclipse
- Installieren Sie Glassfish Web Server unter Windows
- Führen Sie die Maven Java-Webanwendung im Tomcat Maven Plugin aus
- Führen Sie die Maven Java-Webanwendung im Jetty Maven Plugin aus
- Ausführen einer Hintergrundaufgabe in der Java Servlet-Anwendung
- Die Anleitung zum Java Servlet für den Anfänger
- Die Anleitung zu Java Servlet Filter
- Die Anleitung zum Java JSP für den Anfänger
- Die Anleitung zu Java JSP Standard Tag Library (JSTL)
- Installieren Sie WebToolsPlatform für Eclipse
- Erstellen Sie eine einfache Anmeldeanwendung und sichere Seiten mit Java Servlet Filter
- Erstellen Sie eine einfache Java Web Application mit Servlet, JSP und JDBC
- Hochladen und Herunterladen von Dateien die auf der Festplatte mit Java Servlet gespeichert sind
- Laden Sie mit Java Servlet Dateien aus der Datenbank hoch und laden Sie sie herunter
- Bild von Datenbank mit Java Servlet anzeigen
- Redirect 301 Permanentes Umleiten in Java Servlet
- Wie automatisch http auf https in einer Web-Anwendung Java umleiten?
- Verwenden Sie Google reCAPTCHA in der Java-Webanwendung
Show More