Spring-Session Grails插件(第1部分)

Fork me on GitHub

This tutorial will guide you on how to configure and use spring-session grails plugin in grails 2x application. This blog will also cover various datastore currently supported by this plugin along with serializers to serialize/deserialize your session to/from the store.

该博客分为3个部分

  1. 介绍安装Redis数据存储
1. Introduction

This grails plugin helps you to easily set up Spring Session project in your grails application.

What is Spring Session?

春季会议是Spring社区的一个项目,提供用于管理用户会话信息的API和实现。 它允许您将用户的会话存储在数据存储区中,例如雷迪斯,MongoDB,JDBC,淡褐色,宝石火等等。您可以轻松地从一个数据存储更改为另一个数据存储。

它比传统的存储用户会话的方式好吗? 在Spring会话中,您不需要在Servlet容器内添加任何类型的jar(tomcat,jetty等),这意味着没有特定于容器的依赖项。 与会话管理相关的API(jar)将在您的应用程序内部。 因此,一个容器可以包含多个应用程序,这些应用程序可能正在使用不同类型的数据存储区来存储用户的会话。 这也有助于从一个容器迁移到另一个容器或切换到另一个供应商(即从Tomcat迁移到Jetty)。

春季会议提供的其他功能:

  • 分组会议-在不依赖于特定于应用程序容器的解决方案的情况下,支持集群会话很简单。多个浏览器会话-Spring Session支持在单个浏览器实例(即类似于Google的多个经过身份验证的帐户)中管理多个用户的会话。RESTful API - Spring Session allows providing session ids in headers to work with RESTful API.WebSocket支持-提供了在接收WebSocket消息时使HttpSession保持活动状态的功能。

通过使用此插件,您可以在grails应用程序中实现以上功能。

ñote: Spring Session project supports various datastore, which are not configured in this plugin yet. Those data stores are under development. If you wish to contribute in adding datastore support just fork me on GitHub.

2. Installation

插件配置非常简单。 如果您使用的是grails 2x,请在您的代码中添加以下代码BuildConfig.groovy在 - 的里面外挂程式块

plugins {
    ...
    compile "org.grails.plugins:spring-session:2.0.0-RC1"
}

注意:ByDefaultpluginwilluseRedisasit’sdefaultdatastore.Currently,itsupportsRedis,Mongo,andJDBCstoretopersistsession.

当前,此插件支持3个数据存储。

  1. 雷迪斯蒙哥JDBC

该博客将涵盖雷迪斯数据存储。 其他数据存储区将在下一个博客中介绍。

1. Redis

最初,spring-session项目仅支持Redis数据存储。 因此,Redis是此插件的默认数据存储。 要更改数据存储区,您需要在配置槽文件。

springsession.sessionStore=SessionStore.REDIS

确保Redis服务器正在系统上运行。 要验证插件是否正常运行,只需在您的应用中创建一个虚拟控制器即可。 假设您已经创建了一个名为HomeController的控制器。

package demo

class HomeController {

    def index() {
        render "Hello from home controller"
    }
}

现在运行您的grails应用程序,一旦您的应用程序启动,然后在终端上运行以下命令。

curl -c - localhost:8080/g2ss/home/index

#Output
#HttpOnly_localhost FALSE /g2ss/ FALSE 0 SESSION 9c3796b4-90d1-4f51-b340-4dc857f6cdd2

您会注意到带有会话cookie名称的响应会议有它的价值9c3796b4-90d1-4f51-b340-4dc857f6cdd2。 干杯!!! 您的插件已成功配置。

如果您想覆盖插件的默认配置,那很容易。 您需要更改与该功能相关的属性。 例如 默认Cookie名称是会议。 要更改Cookie名称,您需要更改您的以下属性配置槽。

springsession.strategy.cookie.name="SPRING_SESSION"

我们来看看一些属性对插件的影响。

Common properties
springsession.maxInactiveIntervalInSeconds=1800 // Session timeout. default is 1800 seconds
springsession.sessionStore=SessionStore.REDIS // Select session store. Default is REDIS
springsession.defaultSerializer=Serializer.JDK // Serialization mechanism, currently supports JDK & JSON Based. Default is JDK
springsession.strategy.defaultStrategy=SessionStrategy.COOKIE // session tracking mechanism. Default is COOKIE also suports HEADER
springsession.strategy.cookie.name="SESSION" // session cookie name. Default is SESSION
springsession.strategy.httpHeader.headerName="x-auth-token" // session header token name. Default is x-auth-token
springsession.allow.persist.mutable=false // check https://github.com/jeetmp3/spring-session/issues/5 for more detail. Default value is false.
Redis store specific properties
springsession.redis.connectionFactory.hostName="localhost" // Redis server hostname. default is localhost
springsession.redis.connectionFactory.port=6397 // Redis server port. default is 6397
springsession.redis.connectionFactory.timeout=2000 // Redis server connection timeout. default is 2000
springsession.redis.connectionFactory.usePool=true // To use connection pool. default is true
springsession.redis.connectionFactory.dbIndex=0 // Database number. Default is 0
springsession.redis.connectionFactory.password=null // Redis server password. Default is null
springsession.redis.connectionFactory.convertPipelineAndTxResults=true // Specifies if pipelined results should be converted to the expected data type. Default is true

springsession.redis.poolConfig.maxTotal=8 // Pool config maximum active connections. Default is 8
springsession.redis.poolConfig.maxIdle=8 // Pool config maximum idle connections. Default is 8
springsession.redis.poolConfig.minIdle=0 // Pool config minimum active connections. Default is 0

springsession.redis.sentinel.master=null // Redis sentinal master node name. Default is null
springsession.redis.sentinel.nodes=[] // List of Map sentinal nodes. e.g. [[host: 'localhost', port: 6379], [host: '', port: 0] ]. Default is blank
springsession.redis.sentinel.password=null // Redis sentinal password. Default is null
springsession.redis.sentinel.timeout=2000 // Redis sentinal timeout. Default is 2000
JSON serialization specific properties
springsession.redis.jackson.modules = [] // List of Application Jackson modules. This plugin uses the Jackson library to JSON serialization.
Json Serialization

默认情况下,此插件使用Java序列化。 这种类型的序列化有一个很大的限制,您需要标记每个类@Serializable。 现在考虑一些库类,即该库随附的任何类,而您没有该源代码。 当您尝试序列化该类时会发生什么?

java.io.NotSerializableException你是对的!!!!

在现实世界的应用程序中,您想尽可能多地使用库,因为您不想编写已经编写的类/例程,为什么不重用它们呢?

JSON序列化来了。 在JSON序列化中,您无需在类上添加@Serializable。 要在插件中使用JSON序列化,您需要更改属性

springsession.defaultSerializer = Serializer.JSON

而已!!!

JSON serialization will work perfectly until your class has a default constructor. But if any class doesn’t have default constructor then you’ll need to add mixin classes or serializer/deserializer for that class and a Jackson module class. This is the blog which will guide you to Deserialize json with Ĵava parameterized constructor.

让我们举个例子。 我有如下所述的User类

package demo;

import java.io.Serializable;

/**
 * @author Jitendra Singh.
 */
public class User {

    private String name;

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                '}';
    }
}

如您所见,有一个参数化的构造函数。 我想在课堂上上这节课。 所以我现在要做的是。

1. Create Mixin for User
package demo;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

/**
 * @author Jitendra Singh.
 */
public class UserMixin {
    private String name;

    @JsonCreator
    public UserMixin(@JsonProperty("name") String name) {

    }
}
2. Create module class to register mixin
package demo;

import com.fasterxml.jackson.core.Version;
import com.fasterxml.jackson.databind.Module;

/**
 * @author Jitendra Singh.
 */
public class SimpleModule extends Module {
    @Override
    public String getModuleName() {
        return "Simple";
    }

    @Override
    public Version version() {
        return Version.unknownVersion();
    }

    @Override
    public void setupModule(SetupContext setupContext) {
        setupContext.setMixInAnnotations(User.class, UserMixin.class);
    }
}
3. Register my module class with spring-session plugin
springsession.redis.jackson.modules = ['demo.SimpleModule']

而已。 你完成了。

In next post I’ll explain Mongo datastore. Happy coding, Cheers !!!

from: https://dev.to//jeetmp3/spring-session-grails-plugin-part-1-2gc4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值