基于Redis的CAS服务端集群

为了保证生产环境CAS(Central Authentication Service)认证服务的高可用,防止出现单点故障,我们需要对CAS Server进行集群部署。 CAS的Ticket默认是以Map的方式存储在JVM内存中的,多个tomcat之间无法共享,因此我们可以使用MemCached或者Redis来存储Ticket。MemCached的方式官方已经提供了解决方案,我们这里使用的是Redis,具体实现可以参考CAS的模块:cas-server-integration-memcached。 1、pom.xml文件中加入依赖: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.7.2</version> </dependency> <dependency> <groupId>org.springframework.data</gr...
阅读全文

Java BigDecimal 处理高精度计算

Java的Double和Float类型在做运算的时候会出现丢失精度问题,比如: System.out.println(4.8D+3); //7.8 System.out.println(4.8D-3); //1.7999999999999998 System.out.println(4.8D*3); //14.399999999999999 System.out.println(4.8D/3); //1.5999999999999999 System.out.println(4.8F>4.8D); //true 此时我们可以使用“java.math.BigDecimal”来进行运算: System.out.println(new BigDecimal(String.valueOf(4.8D)).add(new BigDecimal(3))); //7.8 System.out.println(new BigDecimal(String.valueOf(4.8D)).subtract(new BigDecimal(3))); //1.8 System.out.println(new BigDe...
阅读全文

CAS+Shiro实现单点退出

CAS+Shiro实现了统一认证,但是在做登出操作的时候子系统并没有退出,依然可以访问。解决方案: 1. 修改业务系统,即cas客户端 1.1、配置“web.xml”,在其他filter之前添加: <!-- 单点退出 begin --> <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener> <filter> <filter-name>singleSignOutFilter</filter-name> <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> </filter> <filter-mapping> <filter-name>s...
阅读全文

CAS单点登录密码加盐的认证

为了安全,我们会对系统中的密码进行特殊方法加密,比如加入密码盐,并用MD5迭代N次,这个时候我们就需要在CAS服务端自定义认证处理类。 1、在CAS服务端新建类”MyAuthenticationHandler”,继承自”AbstractJdbcUsernamePasswordAuthenticationHandler”。 package com.***.authentication.handler; import org.apache.shiro.crypto.hash.Md5Hash; import org.jasig.cas.adaptors.jdbc.AbstractJdbcUsernamePasswordAuthenticationHandler; import org.jasig.cas.authentication.HandlerResult; import org.jasig.cas.authentication.PreventedException; import org.jasig.cas.authentication.UsernamePasswordCredential; im...
阅读全文

CAS单点登录与Shiro的集成

1、CAS 与 Shiro 集成不需要修改”web.xml”文件,也不用依赖”cas-client-core”(参考:“CAS单点登录初使用”),只需要依赖”shiro-cas” 就可以了,因为”shiro-cas”已经依赖了”cas-client-core”。 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-cas</artifactId> <version>1.2.4</version> </dependency> 2、然后修改shiro的配置文件,shiro.xml。 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-insta...
阅读全文

CAS单点登录初使用

CAS(Central Authentication Service),中央认证服务,一种独立开始指令协议,旨在为 Web 应用系统提供一种可靠的单点登录方法。 一、服务端配置。 1、下载、解压并导入到你自己的开发工具中。 目前CAS最新版本为 4.1.5,下载地址:https://github.com/Jasig/cas/archive/v4.1.5.zip 2、CAS推荐的是以HTTPS协议进行统一认证,为了方便,我们只使用HTTP协议实现,需要修改一点代码以支持使用HTTP协议进行认证: 1) 修改”cas-server-webapp”模块的”WEB-INF\deployerConfigContext.xml”文件。 <bean id="proxyAuthenticationHandler" class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref="suppor...
阅读全文

C3P0连接池超时连接失效

使用C3P0做数据库连接池,每天早上第一次打开应用的时候会报数据库链接错误,是因为MYSQL的默认“wait_timeout”为8个小时,如果一个连接空闲时间超过8小时Mysql就会自动断开该连接,而连接池却认为该连接是有效的,因此请求报错。异常中也给出了明确的提示和解决方法: Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 63,210,211 milliseconds ago. The last packet sent successfully to the server was 63,210,212 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validit...
阅读全文

执行数据库'INSERT'操作时事务无法回滚

在使用Spring声明式事务的时候,发现在做”update”时,出现异常事务可以回滚,但是在执行”insert”的时候,后台日志虽然显示回滚了,但是数据却已经保存到了数据库中,本来以为是哪里配置出错了,后来却发现是Mysql存储引擎的的问题。我们用的Mysql版本是”5.1.73”,默认存储引擎是”MyISAM”。 查看mysql版本: mysql> select version(); +-----------+ | version() | +-----------+ | 5.1.73 | +-----------+ 1 row in set (0.00 sec) 查看mysql存储引擎 mysql> SHOW ENGINES; +------------+---------+------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment ...
阅读全文

Nginx中请求大小的限制的设置

Nginx对客户端请求缓冲区大小有个默认限制,如果超过了该值(比如在上传大文件时),会报500错误。 只需要设置三个值,就可以解决该问题: 1、 client_body_buffer_size: 指定客户端请求体缓冲区大小,如果请求大于该值,会报“500 Internal Server Error”错误。 The directive specifies the client request body buffer size. If the request body is more than the buffer, then the entire request body or some part is written in a temporary file. The default size is equal to two pages size, depending on platform it is either 8K or 16K. 2、 client_body_temp_path: 指定请求体临时文件的存放目录。 The directive assigns the directory...
阅读全文

设计模式之——策略模式(Head first设计模式学习笔记)

1、 策略模式的定义: 策略模式定义了算法簇,分别分装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 2、 设计原则: 1) 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起; 2) 针对接口编程,而不是针对实现编程; 3) 多用组合,少用继承; 3、 实现: 假设我们现在有两个角色,骑士和巨魔,骑士使用弓箭做武器,巨魔使用斧头当武器,那么我们如何进行设计呢? 1) 首先我们应该有个武器行为的接口:WeaponBehavior,它有一个use()方法来使用武器。 package designpatterns.strategypattern.behavior; /** * 武器行为策略接口 */ public interface WeaponBehavior { void use(); } 2) 这个接口有两个实现类,分别是弓箭(BowAndArrowBehavior)和斧头(AxeBehavior)。 package designpatterns.strategypattern.behavior; /** ...
阅读全文