@@ -35,6 +35,10 @@ If you are looking to get started with Spring Session, the best place to start i
|
|||||||
| Demonstrates how to use Spring Session to replace the `HttpSession` with a Redis store.
|
| Demonstrates how to use Spring Session to replace the `HttpSession` with a Redis store.
|
||||||
| link:guides/httpsession.html[HttpSession Guide]
|
| link:guides/httpsession.html[HttpSession Guide]
|
||||||
|
|
||||||
|
| {gh-samples-url}httpsession-xml[HttpSession XML]
|
||||||
|
| Demonstrates how to use Spring Session to replace the `HttpSession` with a Redis store using XML based configuration.
|
||||||
|
| TBD
|
||||||
|
|
||||||
| {gh-samples-url}boot[Spring Boot]
|
| {gh-samples-url}boot[Spring Boot]
|
||||||
| Demonstrates how to use Spring Session with Spring Boot.
|
| Demonstrates how to use Spring Session with Spring Boot.
|
||||||
| link:guides/boot.html[Spring Boot Guide]
|
| link:guides/boot.html[Spring Boot Guide]
|
||||||
|
|||||||
2
gradlew
vendored
2
gradlew
vendored
@@ -7,7 +7,7 @@
|
|||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
DEFAULT_JVM_OPTS=""
|
DEFAULT_JVM_OPTS="-Xmx1024M -XX:MaxPermSize=512M"
|
||||||
|
|
||||||
APP_NAME="Gradle"
|
APP_NAME="Gradle"
|
||||||
APP_BASE_NAME=`basename "$0"`
|
APP_BASE_NAME=`basename "$0"`
|
||||||
|
|||||||
2
gradlew.bat
vendored
2
gradlew.bat
vendored
@@ -9,7 +9,7 @@
|
|||||||
if "%OS%"=="Windows_NT" setlocal
|
if "%OS%"=="Windows_NT" setlocal
|
||||||
|
|
||||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
set DEFAULT_JVM_OPTS=
|
set DEFAULT_JVM_OPTS=-Xmx1024M -XX:MaxPermSize=512M
|
||||||
|
|
||||||
set DIRNAME=%~dp0
|
set DIRNAME=%~dp0
|
||||||
if "%DIRNAME%" == "" set DIRNAME=.
|
if "%DIRNAME%" == "" set DIRNAME=.
|
||||||
|
|||||||
20
samples/httpsession-xml/build.gradle
Normal file
20
samples/httpsession-xml/build.gradle
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
apply from: JAVA_GRADLE
|
||||||
|
apply from: TOMCAT_GRADLE
|
||||||
|
|
||||||
|
tasks.findByPath("artifactoryPublish")?.enabled = false
|
||||||
|
sonarRunner {
|
||||||
|
skipProject = true
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compile project(':spring-session-data-redis'),
|
||||||
|
"org.springframework:spring-web:$springVersion",
|
||||||
|
"redis.embedded:embedded-redis:0.2",
|
||||||
|
jstlDependencies
|
||||||
|
|
||||||
|
providedCompile "javax.servlet:javax.servlet-api:$servletApiVersion"
|
||||||
|
|
||||||
|
testCompile 'junit:junit:4.11'
|
||||||
|
|
||||||
|
integrationTestCompile gebDependencies
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package sample
|
||||||
|
|
||||||
|
import geb.spock.*
|
||||||
|
import sample.pages.HomePage;
|
||||||
|
import spock.lang.Stepwise
|
||||||
|
import pages.*
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the CAS sample application using service tickets.
|
||||||
|
*
|
||||||
|
* @author Rob Winch
|
||||||
|
*/
|
||||||
|
@Stepwise
|
||||||
|
class AttributeTests extends GebReportingSpec {
|
||||||
|
def 'first visit no attributes'() {
|
||||||
|
when:
|
||||||
|
to HomePage
|
||||||
|
then:
|
||||||
|
attributes.empty
|
||||||
|
}
|
||||||
|
|
||||||
|
def 'create attribute'() {
|
||||||
|
when:
|
||||||
|
createAttribute('a','b')
|
||||||
|
then:
|
||||||
|
attributes.size() == 1
|
||||||
|
attributes[0].name == 'a'
|
||||||
|
attributes[0].value == 'b'
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package sample.pages
|
||||||
|
|
||||||
|
import geb.*
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The home page
|
||||||
|
*
|
||||||
|
* @author Rob Winch
|
||||||
|
*/
|
||||||
|
class HomePage extends Page {
|
||||||
|
static url = ''
|
||||||
|
static at = { assert driver.title == 'Session Attributes'; true}
|
||||||
|
static content = {
|
||||||
|
form { $('form') }
|
||||||
|
submit { $('input[type=submit]') }
|
||||||
|
createAttribute(required:false) { name, value ->
|
||||||
|
form.attributeName = name
|
||||||
|
form.attributeValue = value
|
||||||
|
submit.click(HomePage)
|
||||||
|
}
|
||||||
|
attributes { moduleList AttributeRow, $("table tr").tail() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class AttributeRow extends Module {
|
||||||
|
static content = {
|
||||||
|
cell { $("td", it) }
|
||||||
|
name { cell(0).text() }
|
||||||
|
value { cell(1).text() }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package sample;
|
||||||
|
|
||||||
|
import org.springframework.session.data.redis.config.annotation.web.http.*;
|
||||||
|
|
||||||
|
@EnableRedisHttpSession // <1>
|
||||||
|
public class RedisHttpSessionConfig {}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
package sample;
|
||||||
|
/*
|
||||||
|
* Copyright 2002-2014 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||||
|
* use this file except in compliance with the License. You may obtain a copy of
|
||||||
|
* the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations under
|
||||||
|
* the License.
|
||||||
|
*/
|
||||||
|
import org.springframework.beans.BeansException;
|
||||||
|
import org.springframework.beans.factory.DisposableBean;
|
||||||
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
|
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
|
||||||
|
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
||||||
|
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
import redis.clients.jedis.Protocol;
|
||||||
|
import redis.embedded.RedisServer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runs an embedded Redis instance. This is only necessary since we do not want
|
||||||
|
* users to have to setup a Redis instance. In a production environment, this
|
||||||
|
* would not be used since a Redis Server would be setup.
|
||||||
|
*
|
||||||
|
* @author Rob Winch
|
||||||
|
*/
|
||||||
|
public class RedisServerBean implements InitializingBean, DisposableBean, BeanDefinitionRegistryPostProcessor {
|
||||||
|
private RedisServer redisServer;
|
||||||
|
|
||||||
|
|
||||||
|
public void afterPropertiesSet() throws Exception {
|
||||||
|
redisServer = new RedisServer(Protocol.DEFAULT_PORT);
|
||||||
|
redisServer.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void destroy() throws Exception {
|
||||||
|
if(redisServer != null) {
|
||||||
|
redisServer.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {}
|
||||||
|
|
||||||
|
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package sample;
|
||||||
|
|
||||||
|
import javax.servlet.*;
|
||||||
|
import javax.servlet.annotation.*;
|
||||||
|
import javax.servlet.http.*;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@WebServlet("/session")
|
||||||
|
public class SessionServlet extends HttpServlet {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
||||||
|
String attributeName = req.getParameter("attributeName");
|
||||||
|
String attributeValue = req.getParameter("attributeValue");
|
||||||
|
req.getSession().setAttribute(attributeName, attributeValue);
|
||||||
|
resp.sendRedirect(req.getContextPath() + "/");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 2878267318695777395L;
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns:context="http://www.springframework.org/schema/context"
|
||||||
|
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
|
||||||
|
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
|
||||||
|
|
||||||
|
|
||||||
|
<bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"/>
|
||||||
|
|
||||||
|
<context:annotation-config/>
|
||||||
|
<bean class="sample.RedisHttpSessionConfig"/>
|
||||||
|
|
||||||
|
<bean class="sample.RedisServerBean"/>
|
||||||
|
</beans>
|
||||||
38
samples/httpsession-xml/src/main/webapp/WEB-INF/web.xml
Normal file
38
samples/httpsession-xml/src/main/webapp/WEB-INF/web.xml
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
|
||||||
|
<!--
|
||||||
|
- Location of the XML file that defines the root application context
|
||||||
|
- Applied by ContextLoaderListener.
|
||||||
|
-->
|
||||||
|
<context-param>
|
||||||
|
<param-name>contextConfigLocation</param-name>
|
||||||
|
<param-value>
|
||||||
|
/WEB-INF/spring/*.xml
|
||||||
|
</param-value>
|
||||||
|
</context-param>
|
||||||
|
|
||||||
|
<filter>
|
||||||
|
<filter-name>springSessionRepositoryFilter</filter-name>
|
||||||
|
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
|
||||||
|
</filter>
|
||||||
|
|
||||||
|
<filter-mapping>
|
||||||
|
<filter-name>springSessionRepositoryFilter</filter-name>
|
||||||
|
<url-pattern>/*</url-pattern>
|
||||||
|
</filter-mapping>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
- Loads the root application context of this web app at startup.
|
||||||
|
- The application context is then available via
|
||||||
|
- WebApplicationContextUtils.getWebApplicationContext(servletContext).
|
||||||
|
-->
|
||||||
|
<listener>
|
||||||
|
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
|
||||||
|
</listener>
|
||||||
|
|
||||||
|
<welcome-file-list>
|
||||||
|
<welcome-file>index.jsp</welcome-file>
|
||||||
|
</welcome-file-list>
|
||||||
|
</web-app>
|
||||||
5
samples/httpsession-xml/src/main/webapp/assets/bootstrap.min.css
vendored
Normal file
5
samples/httpsession-xml/src/main/webapp/assets/bootstrap.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
48
samples/httpsession-xml/src/main/webapp/index.jsp
Normal file
48
samples/httpsession-xml/src/main/webapp/index.jsp
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>Session Attributes</title>
|
||||||
|
<link rel="stylesheet" href="assets/bootstrap.min.css">
|
||||||
|
<style type="text/css">
|
||||||
|
body {
|
||||||
|
padding: 1em;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<h1>Description</h1>
|
||||||
|
<p>This application demonstrates how to use a Redis instance to back your session. Notice that there is no JSESSIONID cookie. We are also able to customize the way of identifying what the requested session id is.</p>
|
||||||
|
|
||||||
|
<h1>Try it</h1>
|
||||||
|
|
||||||
|
<form class="form-inline" role="form" action="./session" method="post">
|
||||||
|
<label for="attributeValue">Attribute Name</label>
|
||||||
|
<input id="attributeValue" type="text" name="attributeName"/>
|
||||||
|
<label for="attributeValue">Attribute Value</label>
|
||||||
|
<input id="attributeValue" type="text" name="attributeValue"/>
|
||||||
|
<input type="submit" value="Set Attribute"/>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<hr/>
|
||||||
|
|
||||||
|
<table class="table table-striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Attribute Name</th>
|
||||||
|
<th>Attribute Value</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<c:forEach items="${sessionScope}" var="attr">
|
||||||
|
<tr>
|
||||||
|
<td><c:out value="${attr.key}"/></td>
|
||||||
|
<td><c:out value="${attr.value}"/></td>
|
||||||
|
</tr>
|
||||||
|
</c:forEach>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -5,6 +5,7 @@ include 'docs'
|
|||||||
include 'samples:boot'
|
include 'samples:boot'
|
||||||
include 'samples:hazelcast'
|
include 'samples:hazelcast'
|
||||||
include 'samples:httpsession'
|
include 'samples:httpsession'
|
||||||
|
include 'samples:httpsession-xml'
|
||||||
include 'samples:rest'
|
include 'samples:rest'
|
||||||
include 'samples:security'
|
include 'samples:security'
|
||||||
include 'samples:users'
|
include 'samples:users'
|
||||||
|
|||||||
Reference in New Issue
Block a user