使用Java Servlet,JSP标签和Stormpath快速构建Java Web App

建筑物身份管理,包括身份验证和授权? 尝试Stormpath! 我们的REST API和强大的Java SDK支持可以消除您的安全风险,并且可以在几分钟内实现。 注册 ,再也不会建立auth了!

我们刚刚发布了Java SDK的主要升级版本,现在包括Java Webapp(Servlet 3.0+)支持以及大量用户自动化功能。 只需将我们的Servlet插件放入您的Java Web应用程序中,然后开始繁荣—无需编写代码即可进行即时用户管理。

这篇文章是一个快速教程,向您展示如何快速建立具有完整的身份验证和用户管理功能以及使用Stormpath的用户界面的Java Web应用程序。

如果您已经构建了Java Web应用程序,那么您将了解建立适当的身份验证和用户管理所涉及的时间痛苦

即使您使用了Apache Shiro或Spring Security这样的出色框架,仍然有很多无聊的UI工作和高风险的后端工作。

至少,除了处理每个视图的控制器,注销处理程序等之外,您还必须构建用于注册,登录和忘记密码的UI屏幕。

然后,您必须担心安全性问题,例如密码哈希方案,随着计算的改进而更新哈希算法,跨站点请求伪造(CSRF)保护,跨站点脚本(xss)攻击等等。

Stormpath可以连接到典型的Java Web应用程序,并为开发人员提供了开箱即用的所有身份验证,授权和用户安全性,因此您可以继续进行真正关心的应用程序。 实际上,您无需编写任何代码即可获得完整的用户界面 太棒了

到本教程完成时(不到15分钟),您将拥有一个功能全面的Java Web应用程序。 我们将重点介绍具有大量用户自动化功能的Stormpath-Servlet插件。 您只需将插件放到Web应用程序中便可以蓬勃发展–无需编写代码即可进行即时用户管理。

您将在此Java Servlet教程中构建什么:

您将使用标准的Servlet 3+和JSP API构建一个简单的Java Web应用程序。 完成后,您将能够:

  • 使用电子邮件和密码创建(注册)新的用户帐户
  • 验证新用户帐户的注册电子邮件地址
  • 使用电子邮件和密码登录(认证)您的新帐户
  • 登录后显示可自定义的用户帐户仪表板,仅已登录的用户可以访问
  • 将尝试访问仪表板的未经身份验证的用户重定向到登录页面
  • 允许登录用户注销
  • 允许用户通过基于电子邮件的忘记密码工作流程重置密码

这是最好的部分–对于上述所有方面, 您无需编写任何代码 -只需进行一些配置即可!

但是,仅出于娱乐目的,我们将编写一个简单的欢迎页面和一个用户帐户仪表板页面,这些页面很可能存在于实际应用程序中。

此示例的所有代码都在Stormpath Java SDK项目中 。

听起来不错? 大! 让我们开始吧!

您需要什么:Stormpath,JDK,Maven或Gradle

  • 约15分钟的时间
  • 与Stormpath通信的Stormpath API密钥
  • JDK 1.6或更高版本
  • Maven 3.0+或Gradle 2.2+

如何完成本指南

如果您已经设置了Stormpath API密钥并使用Maven / Gradle构建了项目,则可以从头开始并完成每个步骤,也可以跳过基本的设置步骤 。

从头开始教程

如果您想从头开始,则需要首先获得一个Stormpath API密钥 。

然后,您将需要根据自己的喜好使用Maven或Gradle进行构建 。

下载Stormpath API密钥

与Stormpath的所有通信都必须通过API密钥进行身份验证。

  1. 如果尚未注册,请免费注册Stormpath 。 您会收到一封验证电子邮件。
  2. 点击验证电子邮件中的链接。
  3. 使用您在注册期间使用的电子邮件地址和密码登录到Stormpath管理控制台 。
  4. 点击信息中心右上角的Manage API Keys链接。
  5. 在“ 安全凭据”下 ,单击“ 创建API密钥” 。这将生成您的API密钥并将其作为apiKey.properties文件下载到您的计算机上。
  6. 将文件保存在主目录中的以下位置:
  • Unix,Linux和Mac OS上的~/.stormpath/apiKey.properties
  • Windows上的C:\Users\YOUR_USERNAME\.stormpath\apiKey.properties
  1. 更改文件权限以确保只有您可以读取此文件。 例如:
    chmod go-rwx ~/.stormpath/apiKey.properties
  2. 为了安全起见,您可能还想防止自己不小心写入/修改文件:
    chmod u-w ~/.stormpath/apiKey.properties

在Windows上,您可以类似地设置API密钥文件权限 。


使用Maven构建项目

选择您要用于项目的目录。 在该目录中,创建以下maven pom.xml文件:
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.stormpath.samples</groupId><artifactId>stormpath-webapp-tutorial</artifactId><version>0.1.0</version><packaging>war</packaging><dependencies><dependency><groupId>com.stormpath.sdk</groupId><artifactId>stormpath-servlet-plugin</artifactId><version>1.0.RC9.2</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.1.7</version><scope>runtime</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><path>/</path></configuration></plugin></plugins></build></project>


使用Gradle构建项目

选择您要用于项目的目录。 在该目录中,创建以下build.gradle文件:
build.gradle

buildscript {repositories {jcenter()}dependencies {classpath 'com.bmuschko:gradle-tomcat-plugin:2.0'}
}apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'com.bmuschko.tomcat'sourceCompatibility = 1.6
version = '0.1.0'
war.baseName = 'stormpath-webapp-tutorial'repositories {mavenLocal()mavenCentral()
}dependencies {compile group: 'com.stormpath.sdk', name: 'stormpath-servlet-plugin', version: '1.0.RC9.2'compile group: 'javax.servlet', name: 'jstl', version: '1.2'providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'runtime group: 'ch.qos.logback', name: 'logback-classic', version: '1.1.7'def tomcatVersion = '7.0.57'tomcat "org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}","org.apache.tomcat.embed:tomcat-embed-logging-juli:${tomcatVersion}"tomcat("org.apache.tomcat.embed:tomcat-embed-jasper:${tomcatVersion}") {exclude group: 'org.eclipse.jdt.core.compiler', module: 'ecj'}
}tomcatRun.contextPath = '/'
tomcatRunWar.contextPath = '/'task wrapper(type: Wrapper) {gradleVersion = '2.2.1'
}

跳过教程基础

将依赖项添加到您的Web应用程序(.war)项目中:

Maven:

<dependency><groupId>com.stormpath.sdk</groupId><artifactId>stormpath-servlet-plugin</artifactId><version>1.0.RC9.2</version>
</dependency>

摇篮:

dependencies {compile 'com.stormpath.sdk:stormpath-servlet-plugin:1.0.RC9.2'
}

构建应用程序的目录结构

我们需要在各个目录中创建一些文件。 确保项目目录下存在以下目录结构:

-- src/|-- main/|-- java/|   |-- tutorial/|-- webapp|-- WEB-INF/|-- jsp/|-- tags/

例如,在* nix操作系统上:

mkdir -p src/main/java/tutorial
mkdir -p src/main/webapp/WEB-INF/jsp
mkdir -p src/main/webapp/WEB-INF/tags

使用JSP标签为您的应用创建页面模板

我们可能希望我们的Web应用程序页面具有相同的外观。 我们可以使用页面模板轻松地做到这一点。 而且,由于JSP 2.0通过JSP标签自动支持页面模板,因此无需引入其他模板库。 让我们创建一个包含以下内容的新模板标签文件:
src/main/webapp/WEB-INF/tags/page.tag

<%@tag description="Default Page template" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@attribute name="title" required="false" %><!DOCTYPE html>
<html>
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Stormpath Webapp Sample | <c:out value="${!empty title ? title : ''}"/></title><link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet"><%-- <link href="${pageContext.request.contextPath}/assets/css/style.css" rel="stylesheet" --%><!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries --><!-- WARNING: Respond.js doesn't work if you view the page via file:// --><!--[if lt IE 9]><script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script><script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script><![endif]--><!-- jQuery (necessary for Bootstrap's JavaScript plugins) --><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script><script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
</head>
<body><div class="container"><div class="header"><ul class="nav nav-pills pull-right"><c:set var="uri" value="${requestScope['javax.servlet.forward.request_uri']}"/><li<c:if test="${fn:endsWith(uri,'/')}"> class="active"</c:if>><a href="${pageContext.request.contextPath}/">Home</a></li><%-- Change upper right context menu depending on if the user is logged in or not: --%><c:choose><c:when test="${!empty account}"><li<c:if test="${fn:endsWith(uri,'dashboard')}"> class="active"</c:if>><a href="${pageContext.request.contextPath}/dashboard">Dashboard</a></li><li><a href="${pageContext.request.contextPath}/logout">Logout</a></li></c:when><c:otherwise><li<c:if test="${fn:endsWith(uri,'login')}"> class="active"</c:if>><a href="${pageContext.request.contextPath}/login">Login</a></li></c:otherwise></c:choose></ul><h3 class="text-muted">Stormpath Webapp Sample</h3></div><jsp:doBody/></div>
</body>
</html>

这只是扩展名为.tag而不是.jsp的标准JSP文件。 的 元素将被使用此模板的任何页面的页面内容替换。

写一个家庭控制器

出于安全原因,我们希望确保在请求期间绝对不能直接访问JSP文件本身。 相反,我们希望Controller处理请求,然后将JSP呈现给请求。 为此,我们将创建一个简单的“ Home”控制器,该控制器呈现内部home.jsp页面:
src/main/java/tutorial/HomeController.java:

package tutorial;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class HomeController extends HttpServlet {public static final String VIEW_TEMPLATE_PATH = "/WEB-INF/jsp/home.jsp";@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.getRequestDispatcher(VIEW_TEMPLATE_PATH).forward(req, resp);}
}

src/main/webapp/WEB-INF/jsp/home.jsp:

<%@ page session="false"%>
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><t:page><jsp:attribute name="title">Welcome!</jsp:attribute><jsp:body><div class="jumbotron" id="welcome"><h1>Welcome to the Stormpath Webapp Sample Application!</h1><p class="lead"><br/><br/>Welcome to this <i>gloriously simple</i><a href="https://docs.stormpath.com/java/servlet-plugin/">Stormpath Java Webapp</a> sample application!<ul><li>First, take a look through this very basic site.</li><li>Then, check out this project's source code<a href="https://github.com/stormpath/stormpath-sdk-java/examples/servlet">on GitHub</a>.</li><li>Lastly, integrate Stormpath into your own sites!</li></ul></p><br/><br/><h2>What This Sample App Demonstrates</h2><br/><br/><p>This simple application demonstrates how easy it is to register, login, and securely authenticateusers on your website using the Stormpath Servlet Plugin.</p><p>Not a Stormpath user yet? <a href="https://stormpath.com">Go signup now!</a></p><br/><br/><p class="bigbutton"><a class="bigbutton btn btn-lg btn-danger"href="${pageContext.request.contextPath}/register" role="button">Register</a></p></div></jsp:body>
</t:page>

最后,我们需要添加一个web.xml文件,以告知servlet容器在访问Web应用程序的默认路径时调用我们的Home Controller:

src/main/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1"xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"><servlet><servlet-name>HomeController</servlet-name><servlet-class>tutorial.HomeController</servlet-class></servlet><servlet-mapping><servlet-name>HomeController</servlet-name><url-pattern>/</url-pattern></servlet-mapping><servlet-mapping><servlet-name>default</servlet-name><url-pattern>/assets/*</url-pattern></servlet-mapping></web-app>

使用Maven或Gradle启动Webapp

您是否可以相信,在添加单个主页后,您将拥有一个具有完整用户管理功能的功能性Web应用程序?

不相信我吗? 试试吧!

使用您选择的构建工具,让我们启动Web应用程序。 例如:
Maven:

mvn tomcat7:run

摇篮:

gradle tomcatRun

打开浏览器,然后访问http://localhost:8080 。 您将在上方看到我们刚刚创建的主页:

家

太酷了! 现在,老实说,这并不令人兴奋。 那毕竟是应该发生的。 但是令人敬畏的功能-您一直在等待的部分-都是自动的东西。 例如,登录页面!

尝试Stormpath用户登录页面

单击页面右上方的“ Login按钮,或手动访问http://localhost:8080/login ,您将看到以下信息:

登录

那就对了! 内置了最佳实践跨站点请求伪造(CSRF)保护的登录页面, 您无需编写任何内容既然是真棒! 您可以使用完整的国际化(i18n)功能自定义以什么顺序显示哪些字段,以及根据需要定制整个外观。 这超出了本文的范围,但是如果需要,您可以稍后阅读有关自定义视图的信息 。

当然,它还不止这些–您可以获得各种各样的好东西,例如用户帐户注册,电子邮件验证和忘记密码自动操作,令牌身份验证等等!

向Stormpath注册新用户

现在,您必须先创建用户帐户,然后才能登录,然后继续并单击“创建帐户”链接,或手动访问http://localhost:8080/register页面,您将看到以下内容:

寄存器

继续并填写并提交表单-您将获得一个新的用户帐户,可用于立即登录。

验证用户电子邮件地址

现在,如何进行电子邮件验证? 许多Web应用程序都希望确保新注册的用户必须先验证其电子邮件地址,然后才能登录该应用程序。 这有助于确保:

  • 电子邮件地址不能被不拥有电子邮件地址的人滥用
  • 应用程序可以根据需要与用户进行通信
  • 注册过程是由人类完成的(而不是执行自动注册的“机器人”,它可能会用于恶意目的)。

这也涵盖了! 您只需要按照文档中所述启用电子邮件验证即可。 由于这是一个简短的教程,我们将继续进行,但是如果您愿意,可以尝试将其打开。

注销您的用户

如果您仍然登录,请单击右上方的logout按钮。 这将访问/logout ,它将自动注销您,然后默认情况下将您重定向回Web应用程序的上下文根页面( / )(您可以稍后自定义下一个URI)。

我们还将对Web应用程序进行另一项更改,因此请继续并按CTRL-C关闭该应用程序。

为忘记密码,更改密码等实施视图

该插件还支持其他开箱即用的视图,您可以在文档中阅读这些视图。 但是,在结束本教程之前,我们想向您展示另外一件事:访问控制。

使用Stormpath实施访问控制(授权)

Stormpath Java Webapp插件还具有根据URI路径实施访问控制的功能。 例如你
可以确保只有经过身份验证的用户才能访问您应用程序中的/account URI。 或者那也许仅仅是
admin组中的帐户可以访问/admin URI。

为了说明这一点,我们将创建一个/dashboard视图,只有经过身份验证的用户才能看到。 这代表一个常见的“登录页面”,登录后可能立即显示用户。

让我们创建一个“仪表板”控制器:

src/main/java/tutorial/DashboardController.java

package tutorial;import com.stormpath.sdk.account.Account;
import com.stormpath.sdk.directory.CustomData;
import com.stormpath.sdk.lang.Strings;
import com.stormpath.sdk.servlet.account.AccountResolver;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class DashboardController extends HttpServlet {private static final String VIEW_TEMPLATE_PATH = "/WEB-INF/jsp/dashboard.jsp";@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String birthday = "";String color = "";Account account = AccountResolver.INSTANCE.getAccount(req);if (account != null) {CustomData data = account.getCustomData();birthday = (String)data.get("birthday");color = (String)data.get("color");}req.setAttribute("birthday", birthday);req.setAttribute("color", color);req.getRequestDispatcher(VIEW_TEMPLATE_PATH).forward(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String birthday = req.getParameter("birthday");String color = req.getParameter("color");//get the currently-logged-in account:Account account = AccountResolver.INSTANCE.getAccount(req);if (account != null) {CustomData data = account.getCustomData();if (Strings.hasText(birthday)) {data.put("birthday", birthday);} else {data.remove("birthday");}if (Strings.hasText(color)) {data.put("color", color);} else {data.remove("color");}data.save();}req.setAttribute("birthday", birthday);req.setAttribute("color", color);req.getRequestDispatcher(VIEW_TEMPLATE_PATH).forward(req, resp);}
}

DashboardController展示了一个非常好的Stormpath功能:可以将您自己的自定义数据直接“附加”到Stormpath REST资源,例如用户帐户的生日或喜欢的颜色。

让我们创建将由控制器渲染的视图文件:

src/main/webapp/WEB-INF/jsp/dashboard.jsp

<%@ page session="false"%>
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><t:page><jsp:attribute name="title">Dashboard</jsp:attribute><jsp:body><div class="dashboard"><div class="row"><div class="col-lg-12"><div class="jumbotron"><h1>Dashboard</h1><br/><br/><p>Welcome to your user dashboard!</p><p>This page displays some of your account information and also allows you to change customdata.</p><p>If you click the Logout link in the navbar at the top of this page, you'll be logged outof your account and redirected back to the main page of this site.</p><br/><br/><h2>Your Account Custom Data</h2><br/><br/><p>Your Email: <span class="data">${account.email}</span></p><c:set var="noBirthday" value="You haven't entered a birthday yet!"/><p>Your Birthday: <span class="data">${!empty account.customData['birthday'] ? account.customData['birthday'] : noBirthday}</span></p><c:set var="noColor" value="You haven't entered a color yet!"/><p>Your Favorite Color: <span class="data">${!empty account.customData['color'] ? account.customData['color'] : noColor}</span></p><br/><br/><p>Stormpath allows you to store up to 10MB of custom user data oneach user account. Data can be anything (in JSON format). The aboveexample shows two custom fields (<code>birthday</code> and<code>color</code>), but you can add whatever fields you'd like.</p><p>You can also store complicated nested JSON documents!</p><br/><br/><h2>Update Custom Data</h2><br/><br/><p>If you enter values below, we'll send and store thesevalues with your user account on Stormpath.</p><p>Please note, we are not doing any validation in this simpleexample -- in a real world scenario, you'd want to check user input on the server side!</p><br/><br/><form method="post" class="bs-example form-horizontal" action="${pageContext.request.contextPath}/dashboard"><div class="form-group"><label for="birthday" class="col-lg-2 control-label">Birthday</label><div class="col-lg-4"><input type="text" class="form-control" id="birthday" name="birthday" placeholder="mm/dd/yyyy"value="${!empty account.customData['birthday'] ? account.customData['birthday'] : ''}"></div></div><div class="form-group"><label for="color" class="col-lg-2 control-label">Favorite Color</label><div class="col-lg-4"><input type="text" class="form-control" id="color" name="color" placeholder="color"value="${!empty account.customData['color'] ? account.customData['color'] : ''}"></div></div><div class="form-group"><div class="col-lg-10 col-lg-offset-2"><button type="submit" class="btn btn-primary">Update Custom Data</button></div></div></form></div></div></div></div></jsp:body>
</t:page>

而且,我们需要更新web.xml以将新视图告知Servlet容器。 web.xml现在应如下所示:

src/main/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1"xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"><servlet><servlet-name>HomeController</servlet-name><servlet-class>tutorial.HomeController</servlet-class></servlet><servlet-mapping><servlet-name>HomeController</servlet-name><url-pattern>/</url-pattern></servlet-mapping><servlet><servlet-name>DashboardController</servlet-name><servlet-class>tutorial.DashboardController</servlet-class></servlet><servlet-mapping><servlet-name>DashboardController</servlet-name><url-pattern>/dashboard</url-pattern></servlet-mapping><servlet-mapping><servlet-name>default</servlet-name><url-pattern>/assets/*</url-pattern></servlet-mapping></web-app>

为您的应用配置Java Servlet插件

请注意,到现在为止,我们没有需要配置插件本身 :一切都只是工作“。 但是现在我们有了一些特定于应用程序的实施规则,我们需要通过一个简单的stormpath.properties配置文件告诉插件该做什么。 让我们创建这个文件:

src/main/webapp/WEB-INF/stormpath.properties

stormpath.web.login.nextUri = /dashboardstormpath.web.uris./dashboard = authc
  • 第一行表示“用户成功登录后,我希望他们访问的下一个URI是/dashboard ”。 插件的登录控制器将自动将新认证的用户重定向到此位置。
  • 第二行表示“为了使任何人都可以访问/dashboard URI,必须对其进行身份验证('authc'是'authenticated'的缩写)。 这将强制所有请求由有效的用户帐户进行身份验证,然后再允许其继续。 如果不是,它们将被重定向到登录页面以首先登录,然后自动被重定向回其最初请求的URI。

运行更新的应用程序

现在,我们已经添加了仪表板视图和控制器,以及一个简单的stormpath.properties文件,让我们尝试一下!

如果还没有,请按CTRL-C关闭应用程序。

现在启动它:

Maven:

mvn tomcat7:run

摇篮:

gradle tomcatRun

现在尝试访问http://localhost:8080/dashboard –您将按预期重定向到登录名。 使用您先前创建的用户帐户登录,然后它将自动将您重定向回仪表板。 真好!

仪表板

Stormpath Java Servlet插件-高级功能

恭喜你! 您现在拥有了一个完整的Web应用程序,其中包括自动用户注册,登录,忘记密码/重置工作流,注销,自定义数据编辑和访问控制执行!

但是,我们只是摸索了您可以做的事情。 还支持:

  • 具有国际化(i18n)支持的完全默认视图自定义。
  • 授权断言(基于帐户数据(例如用户名),它们属于的组等)
  • 针对Javascript和移动客户端的令牌身份验证(我们为您实现了OAuth)
  • 用户名/密码和API密钥的HTTP基本身份验证
  • 事件侦听器对登录,注销,注册等事件做出反应。
  • 缓存可增强性能。
  • 用于自定义身份验证或授权规则的便捷过滤器链定义。
  • Easy Stormpath SDK客户端配置和请求访问
  • 和更多!

请参阅完整的Stormpath Java Servlet插件文档以获取完整信息。

建筑物身份管理,包括身份验证和授权? 尝试Stormpath! 我们的REST API和强大的Java SDK支持可以消除您的安全风险,并且可以在几分钟内实现。 注册 ,再也不会建立auth了!

翻译自: https://www.javacodegeeks.com/2016/07/build-java-web-app-quickly-java-servlet-jsp-tags-stormpath.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353234.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matlab optimtool优化(Optimization)工具箱

1 工具箱概述1.1 功能&#xff08;1&#xff09;求解无约束条件非线性极小值&#xff1b;&#xff08;2&#xff09;求解约束条件下非线性极小值&#xff0c;包括目标逼近问题、极大-极小值问题和半无限极小值问题&#xff1b;&#xff08;3&#xff09;求解二次规划和线性规划…

Python目录链接

第1章  就这么愉快的开始吧 课时1&#xff1a;我和python的第一次亲密接触 一、Python3的下载与安装 二、从IDIE启动Python 三、尝试点新的东西 四、为什么会这样&#xff1f; 五、课时01课后习题及答案 第2章  用Python设计一个游戏 课时2&#xff1a;用python设计第一个…

谚语幸运的开始

谚语:幸运的开始 今天收到一个朋友的邮件&#xff0c;打开一看&#xff0c;是幸运谚语&#xff0c;自以为谚语写的非常好&#xff0c;所以转写出来与朋友们分享&#xff01;希望你能得到幸运哦&#xff01;荷兰的谚语幸运谚语幸运的开始关于金钱&#xff1a;你有了钱&#xff…

VS高版本编写C程序的C4996错误

最简单的可以用的方法:选项Project | Configuration Properties | C/C | Preprocessor | Preprocessor Definitions 添加_CRT_SECURE_NO_DEPRECATE和_SCL_SECURE_NO_DEPRECATE

apache camel_什么时候使用Apache Camel?

apache camelApache Camel是JVM / Java环境中我最喜欢的开源框架之一。 它可以轻松集成使用多种协议和技术的不同应用程序。 本文介绍了何时使用Apache Camel以及何时使用其他替代方法。 问题&#xff1a;企业应用程序集成&#xff08;EAI&#xff09; 由于新产品和新应用&…

Windows、Linux和MAC的CR, LF, CR/LF换行符

在文本处理中, CR, LF, CR/LF是不同操作系统上使用的换行符. Dos和windows&#xff1a; 采用回车换行CR/LF表示下一行. UNIX/Linux &#xff1a; 采用换行符LF表示下一行. MAC OS &#xff1a; 采用回车符CR表示下一行. CR用符号\r表示, 十进制ASCII代码是13, 十六进制代…

GitHub多人协作简明教程

本文面向已经了解/熟悉git基本命令但是并不熟悉如何使用GitHub进行多人协作开发项目的同学。 为了简单起见&#xff0c;这里假设只有两个开发人员&#xff0c;HuanianLi 和 DaxiangLi。他们在GitHub上的地址和角色为&#xff1a; HuanianLi: https://github.com/huanianli # M…

Matlab 图像处理

实验一 Matlab语言、数字图象基本操作 一、实验目的 1、复习MATLAB语言的基本用法&#xff1b; 2、掌握MATLAB语言中图象数据与信息的读取方法&#xff1b; 3、掌握在MATLAB中绘制灰度直方图的方法&#xff0c;了解灰度直方图的均衡化的方法。 二、实验原理 MATLAB是集数值…

JGroups:无需额外基础架构的领导人选举

嗨&#xff0c;您好&#xff0c; 在这篇文章中&#xff0c;我将展示如何在不使用任何其他基础架构&#xff08;例如Apache Zookeeper或Consul&#xff09;的情况下解决领导人选举的问题。 领导者选举是解决以下问题的一种常见方法&#xff1a;在分布式系统中&#xff0c;只有…

8086寄存器

SI源变址寄存器DI目地变址寄存器1:数据寄存器,一般称之为通用寄存器组AH&AL&#xff1d;AX&#xff1a;累加寄存器&#xff0c;常用于运算&#xff1b; BH&BL&#xff1d;BX&#xff1a;基址寄存器&#xff0c;常用于地址索引&#xff1b; CH&CL&#xff1d;CX&…

js中call和apply的作用和用法

call和apply的用途是完全一样的。改变函数中this的指向&#xff1a; 为什么要改变this的指向呢&#xff1f;这个有什么用&#xff1f;有哪些场景呢&#xff1f; 首先this的指向总是在变的&#xff0c;this的指向是由函数执行时所在的环境决定的&#xff0c;而不是函数声明时的环…

二值形态学操作、图像的边缘检测、图像编码

实验五 二值形态学操作 一、实验目的 了解二值形态学的基本运算 掌握基本形态学运算的Matlab实现 了解形态操作的应用 二、原理 收缩和膨胀是数学形态学最基本的变换&#xff0c;数学形态学的应用几乎覆盖了图像处理的所有领域&#xff0c;给出利用数学形态学对二值图像…

初始化思科交换机

Switch#delete flash:vlan.datSwitch#erase startup-configSwitch#reload//重启

Codeforces.666E.Forensic Examination(广义后缀自动机 线段树合并)

题目链接 \(Description\) 给定串\(S\)和\(m\)个串\(T_i\)。\(Q\)次询问&#xff0c;每次询问\(l,r,p_l,p_r\)&#xff0c;求\(S[p_l\sim p_r]\)在\(T_l\sim T_r\)中的哪个串出现次数最多&#xff0c;输出最多次数以及它是\(T\)中的第几个。若最多的有多个&#xff0c;输出下标…

键盘键值分类描述

F1-F12键&#xff1a;值从112-123。 主键盘上数字0-9键&#xff1a;值从48-57。字母A-Z键&#xff1a;值从65-90。 ESC键&#xff1a;值27。"~"符号键&#xff1a;值192。 "-"减号键&#xff1a;189。""等号键&#xff1a;187。 " \ "…

MATLAB中的排序函数

全英文帮助没看懂。sort函数其实就是个排序函数。 sort(A)若A是向量不管是列还是行向量&#xff0c;默认都是对A进行升序排列。sort(A)是默认的升序&#xff0c;而sort(A,descend)是降序排序。 sort(A)若A是矩阵&#xff0c;默认对A的各列进行升序排列 sort(A,dim) dim1时等效…

Django启动服务器时,报错mysql的2059错误的原因。

当启动django自带的服务器时&#xff0c;报错2059&#xff1a;> _mysql_exceptions.OperationalError: (2059, )> django.db.utils.OperationalError: (2059, )启动方式为如下&#xff1a;> python manage.py runserver 0.0.0.0:8000经过一番查询&#xff0c;调试&…

2020地区mysql表_2020年甘肃省军队文职考试职位表下载:张掖地区招13人

2020年6月15日全军面向社会招考文职人员公告已发布&#xff0c;全国招聘27073人&#xff0c;甘肃省招聘370人&#xff0c;其中张掖地区总共招聘13人。此次考试博士招考岗位报名时间为2020年6月17日至21日&#xff0c;其他招考岗位报名时间为7月1日至10日。考试时间为2020年8月2…

superhot预告片下载_预告片:裸指关节SOA

superhot预告片下载我正在研究这个想法&#xff0c;但我不知道它是否对你们有吸引力。 我想就您是否需要进一步探讨提出您的意见。 这是一笔交易&#xff1a;我遇到了一些团队&#xff0c;这些团队在使用SOA技术时由于其工具的绝对复杂性而陷入泥潭。 我只在Java中看到过这种情…