Blog

CAS返回用户的基本资料[基于数据库]

Sep 25, 2016 | | Say something

相关的视频教程观看地址:单点登录系列视频教程 CAS3.0协议,添加了一个可选的cas:attributes 属性,用来返回用户的基本资料 设置步骤如下: 1、修改deployerConfigContext.xml <bean id=”attributeRepository” class=”org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao”> <constructor-arg index=”0″ ref=”dataSource”/> <constructor-arg index=”1″ value=”select email, phone_number from cas_user where {0} “/> </bean> <!– <bean id=”attributeRepository” class=”org.jasig.services.persondir.support.NamedStubPersonAttributeDao” p:backingMap-ref=”attrRepoBackingMap” /> <util:map id=”attrRepoBackingMap”> <entry key=”uid” value=”uid” /> <entry key=”eduPersonAffiliation” value=”eduPersonAffiliation” /> <entry key=”groupMembership” value=”groupMembership” /> <entry> <key><value>memberOf</value></key> <list> <value>faculty</value> <value>staff</value> <value>org</value> </list> </entry> </util:map> –> 注释掉原来的attributeRepository bean, 声明SingleRowJdbcPersonAttributeDao的实例,官方默认的基于数据库的属性获取有两个实现类MultiRowJdbcPersonAttributeDao和SingleRowJdbcPersonAttributeDao,在此我们使用基于单行版本。 […more]

给准备从事java开发的毕业季同学的建议

Sep 24, 2016 | | Say something

欢迎大家反馈呀,觉得有帮助帮忙点个赞,不好请吐槽啦 推荐大家观看:面试加油站 序言: 很多同学的青春都献给了dota或者LOL,这也无可厚非,谁没年轻过呢,可是又是一年毕业季,大家将要企业的挑选和社会的检验。很多同学每次都是志在必得的前去面试,却一次次铩羽而归。渐渐地开始怀疑自己,看到周围的同学都陆续的找到工作,自己不由自主的开始慌张起来了。下面是我总结的一些建议,希望对大家有所帮助。 1、系统复习的重要性 面试即是对我们专业知识的一个考量,也是对我们临场发挥的一个考量,俗话说只有胸有成竹,才能做到信手拈来,系统的复习真的很重要,专业知识的复习不是高中时地史政的复习,只要记住了就好了,这是需要我们理解性记忆的。比如有的面试官会问”问什么我们要重载自定义对象的equals()和hashCode()方法”,有的则会问”使用自定义的对象作为Map的key需要注意些什么”,实践是检验真理的唯一标准,像这样的问题大家最好是敲敲代码实践验证一下。 2、复习的参考范围: 1)、java基础 比如Object有哪些方法,各个方法的作用。String的操作,StringBuidlder,StringBuffer的区别。hashmap,ConcurrentHashMap的区别。java的值传递。ArrayList,LinkedList的区别。面向对象的概念,继承、多态、封装。接口和抽象类的区别。还有自增操作(i++)。位操作。异常的机制。synchronized关键字的使用,这些大家最好是看看javadoc,然后亲自实践一下,如果你懂一定jvm的基础知识,了解java反射,其实了解点皮毛,比如它的分代回收机制也能让你的简历显得与众不同。 2)、数据库 大家不要以为自己会一个单表的增删改查就足以应付面试,这远远是不够的。比如范式的概念,数据库的隔离级别,乐观锁和悲观锁。自join(比如表结构为(成绩id,课程ID,学生id,成绩)需要查询出(张三,语文,数学,外语)这样的结果)。数据库的索引,如何建立高效的索引,什么是hash索引,什么是B树索引,它们有什么不同。exists关键字的使用。什么是聚簇索引。如何使用数据库的查询执行计划优化SQL(比如MySQL的explain)。 3)网络编程 各个套接字接口的作用,以及一个典型应用的流程,比如你写了一个网络聊天室,那么整个的网络交互流程是什么样的。还有现在大火的NIO编程。这个领域我基本没有使用过,所以抱歉啊,不能更细粒度的分享了,不准备从事这个领域的也可以暂时不用了解。 4)java WEB编程 filter 的概念,多个filter的执行顺序。servlet的请求映射规则。中文乱码问题。OSI的七层模型,http相关的基础知识,比如redirect的code=302,404资源没找到,500以上的错误是服务器内部错误。200表示服务器正确处理请求。了解Accept-Header,比如如何请求返回一个json数据而不是html页面。REST接口一定能让你的简历增色不少。Ajax请求。反而一个具体的jsp页面怎么写在面试的时候真的很少提及。 5)多线程部分 Thread的run()和start()方法的区别。线程如何实现同步,如何将一个集合进行线程安全化,比如Collections.synchronizedList(list)能让该list是线程安全的。不但要了解synchronized的关键字,还要了解java.util.concurrent.locks包下的ReentrantLock等类的机制。java.util.concurrent包是一个值得深挖的矿,比如线程池的创建ExecutorServcie等,生产者消费者模式。 6)算法和数据结构 那几种典型的内存排序算法,冒泡排序,堆排序,归并排序,快速排序,简单排序等,以及各个排序算法的时间复杂度。树的遍历算法以及复杂度。二分查找等。 7)linux的基本操作 java在生产环境基本都是部署在linux上的,了解linux、以及在linux下部署java应用。也是一个闪光点。 8)java WEB框架 比如常见的SSH和SSM,了解为什么要用这些框架。了解spring的依赖注入和AOP功能,了解控制器的工作流程,无论是spring mvc还是Struts无非就是请求分发的功能,spring mvc将请求分发到@controllr注解的类中,struts将请求分发到@Acttion注解的类中。mybatis和hibernate都是数据库的ORM框架,都是讲数据库表中的记录映射为java的vo。比起我们手动的jdbc操作能提高效率和不容易出错。熟悉这整个框架的搭建流程,最好自己动手搭建。切记只会在别人搭建好的框架下垒代码就往简历上写熟悉这个框架。 9)设计模式 如果感兴趣就系统的学习吧,不感兴趣或者时觉得空洞就了解常用的吧,比如单例模式,工厂模式(spring的PropertiesFactoryBean类是对这两个模式的完美解释),适配器模式(spring mvc的HandlerAdapter接口),装饰模式(HttpservletRequest对象典型的装饰模式使用),构建者模式(spring-web的Jackson2ObjectMapperBuilder)等。最好是能列举你在项目中用到的或者在著名的源码中遇到的。 10)大伙复习的时候可以借鉴这个列表,但是不尽限于此喔。 3、谈谈工作经验 很多同学在找工作的时候,很愁的一个问题是所有的招聘岗位都需要工作经验或者项目经验。如果你做过实际的项目那么恭喜你已经比别人多了一个筹码。没有工作经验的同学也不要着急。诸葛亮出山前不是也没带过兵吗?但是诸葛亮出山前可不是在他的茅屋中天天打LOL的,他可是天天分析天下形势,在脑海中一遍一遍模拟演习应对之策,当刘备面试他的时候,才能对答如流。这里的工作经验和项目经验强调的不是工作的经验和做项目的经验。没有工作没关系,没有做过真正的项目也没关系。我觉得可以通过如下的途径获取经验: 1)自己动手写一个系统,在实际操作的过程中肯定会遇到这样那样的问题,比如中文编码问题,解决问题的过程也就是积累经验的过程啦,自己动手做项目的另一个好处是毕竟后面毕业论文的时候还需要呢 2)阅读一个有源码的案例。然后将其吃透 3)深度学习一个开源框架,了解它的原理,如果能了解它的源码那么更能证明你是一名合格的社会主义接班人啦 最好祝大家都能拿到满意的OFFER!

CAS Client使用https协议访问cas服务器

Sep 22, 2016 | | Say something

相关的视频教程观看地址:单点登录系列视频教程 在cas server端需要先产生密钥对:cn后面的名字对应cas服务器的域名 keytool -genkeypair -validity 730 -keyalg RSA -alias cas -keystore thekeystore.jks -dname “cn=cas.javacoder.cn” -keypass changeit -storepass changeit 导出服务器的证书 keytool -export -rfc -keystore thekeystore.jks -alias cas -file MyService.cer -storepass changeit 将服务器的证书导入客户端的密钥库中 keytool -import -noprompt -trustcacerts -file MyService.cer -alias cas -keystore clientKeystore.jks -storepass changeit 客户端添加jvm参数,比如tomcat,在catalina.bat 中添加 set CLIENT_CERT=C:\Endeca\PlatformServices\workspace\etc\eneCert.jks set CATALINA_OPTS=-Djavax.net.ssl.keyStore=%CLIENT_CERT% -Djavax.net.ssl.keyStorePassword=endeca -Djavax.net.ssl.trustStore=%CLIENT_CERT% -Djavax.net.ssl.trustStorePassword=endeca -Djavax.net.ssl.keyStore设置我们的私有秘钥对 如果我们只是导入服务器的证书,只要设置-Djavax.net.ssl.trustStore和-Djavax.net.ssl.trustStorePassword就好了,其实我发现不设置-Djavax.net.ssl.trustStorePassword好像也可以,

CAS使用memcached存储ticket

Sep 22, 2016 | | Say something

相关的视频教程观看地址:单点登录系列视频教程 CAS默认的TicketRegistry是DefaultTicketRegistry,默认的实现是基于内存中的一个ConcurrentHashMap来存放TicketRegistry数据的,如果CAS重启,那么TicketRegistry数据就会丢失,而且也不便于CAS的集群,所以在生产中更多的是使用其他的TicketRegistry存放技术,本文介绍基于memcached的实现。 操作步骤 修改pom.xml,添加依赖 <dependency> <groupId>org.jasig.cas</groupId> <artifactId>cas-server-integration-memcached</artifactId> <version>${cas.version}</version> </dependency> 这个地方官方文档是陈旧的!! 修改deployerConfigContext.xml <!– <alias name=”defaultTicketRegistry” alias=”ticketRegistry” /> –> <alias name=”memcachedTicketRegistry” alias=”ticketRegistry” /> 默认是未加密的,如果需要加密,请添加如下的配置 <alias name=”shiroCipherExecutor” alias=”ticketCipherExecutor” /> 修改cas.properties,添加 memcached.servers=192.168.14.129:11211 表示memcached服务器的地址 如果有加密,请添加加密的key[16字符]和签名的key[八进制数据,512位] ticket.encryption.secretkey=C@$W3bSecretKey! ticket.signing.secretkey=szxK-5_eJjs-aUj-64MpUZ-GPPzGLhYPLGl0wrYjYNVAGva2P0lLe6UGKGM7k8dWxsOVGutZWgvmY3l5oVPO3w 参考信息 https://apereo.github.io/cas/4.2.x/installation/Memcached-Ticket-Registry.html

CAS使用数据库进行用户认证

Sep 21, 2016 | | Say something

相关的视频教程观看地址:单点登录系列视频教程 1、新建一张用户表 需要保护用户名和密码字段,我下文使用的是cas_test数据库下的cas_user表 2、修改pom.xml,引入相关依赖 <dependency> <groupId>org.jasig.cas</groupId> <artifactId>cas-server-support-jdbc</artifactId> <version>4.2.2</version> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.37</version> </dependency> 这三个依赖分别是CAS对数据库支持jar,连接池jar, 和mysql驱动jar。 cas-server-support-jdbc的版本和你cas-overlay-template工程的版本一致 3、修改deployerConfigContext.xml 文件,添加如下配置 <bean id=”dataSource” class=”com.mchange.v2.c3p0.ComboPooledDataSource” p:driverClass=”${database.driverClass}” p:jdbcUrl=”${database.url}” p:user=”${database.user}” p:password=”${database.password}” p:initialPoolSize=”${database.pool.minSize}” p:minPoolSize=”${database.pool.minSize}” p:maxPoolSize=”${database.pool.maxSize}” p:maxIdleTimeExcessConnections=”${database.pool.maxIdleTime}” p:checkoutTimeout=”${database.pool.maxWait}” p:acquireIncrement=”${database.pool.acquireIncrement}” p:acquireRetryAttempts=”${database.pool.acquireRetryAttempts}” p:acquireRetryDelay=”${database.pool.acquireRetryDelay}” p:idleConnectionTestPeriod=”${database.pool.idleConnectionTestPeriod}” p:preferredTestQuery=”${database.pool.connectionHealthQuery}” /> <!– <alias name=”acceptUsersAuthenticationHandler” alias=”primaryAuthenticationHandler” /> –> <alias name=”queryDatabaseAuthenticationHandler” alias=”primaryAuthenticationHandler” /> <alias name=”defaultPasswordEncoder” alias=”passwordEncoder” […more]

单点登录系列视频教程

Sep 21, 2016 | | Say something

又是一年毕业季,为了丰富大家的经验,特此准备了单点登录系列视频教程。本视频教程的主要内容有: 1 常规登录示例及分析 分析常规登录的流程,主要介绍AccessFilter的编写 2 同域名基于memcached登录 介绍Cookie的基本知识,利用同域名下cookie共享实现单点登录功能,即讲解了如何操作cookie,以及如何使用修饰模式封装HttpServletRequest对象和重写HttpSession 3 CAS服务器安装 网上许多关于CAS介绍的文档都是基于老的CAS版本,新的版本推荐我们使用maven 的overlay功能自己构建CAS服务器。本节的主要内容是关于新版本下CAS服务器的构建及运行。介绍spring别名的使用,介绍cas server项目的基本结构 4 CAS Client示例 介绍在客户端集成CAS登录功能 5 使用数据库认证 CAS默认的账号是一个配置在CAS.properties文件中的”casuser:Mellon”账号,现实中用户信息来源有很多种,比如数据库,ldap等,本课程介绍基于数据库的认证。 6 属性释放 CAS3.0协议添加了属性释放功能,就是在认证的过程中将用户相关的属性,比如用户的邮箱,手机号,爱好等信息返回给客户端。 7 Client使用https访问CAS 如果客户端需要使用https协议访问CAS服务器,那么我们需要将服务器的安全证书导入客户端的证书库中。 8 使用memcached存储ticket CAS默认使用一个CurrentHashMap存放ticket,这种方式在CAS服务器重启后会丢失所有的ticket,也不便于集成,所以我们使用memcached实现集中式ticket存储。 9 CAS代理认证 某些场景,比如使用apache或者nginx来集群web服务器,或者A服务需要访问B服务中受权限保护的资源,这是就需要代理服务器或者A服务先获取代理ticket,然后去访问相关的资源。 10 OAuth协议集成简介 很多网站都支持第三方登录功能,其实这个功能就是OAuth协议的应用。本节简介该协议。 心动不如行动,点击我开始学习吧 相关资源: 本课程的相关源码下载:cas-server.zip 本课程的相关课件ppt[从CSDN学院下载] CAS github地址: https://github.com/apereo/cas CAS 文档: https://apereo.github.io/cas/4.2.x/index.html

OpenID协议流程

Aug 29, 2016 | | Say something

dumb mode流程 1、提示end user输入OpenID identity,identity是一个URI,比如http://carol.example.com/Alice 2、官方文档叫(Relying Party),也就是我们的服务提供方,对用户的OpenID identity URL进行标准化,然后通过http GET方法请求该URL,返回含如下header的html页面 <link rel=”openid.server” href=”/http://carol.example.com/openidserver.cgi”> 3、重定向end user的浏览器到openid.server(上一步获取到的server url),含如下的参数 openid.mode = checkid_setup 一种验证用户id的模式,先让openid server获取用户浏览器的控制权,完成验证后,然后再通过openid.return_to参数指定的值将控制权重定向给Relying Party。 openid.identity = http://carol.example.com/Alice end user 提供的OpenID identity openid.return_to = http://bob.example.com/comment.cgi?session_id=Alice&nonce=123456 当完成认证后希望openid server将用户浏览器重定向的地址,当然openid server会附上一些额外的参数来验证end user 就是OpenID identity标识的那个人。nonce一个随机值,让这个重定向url唯一,不易被伪造。 4、openid.server验证用户的真实性,openid协议不关心认证的过程,所以openid.server可以自由发挥,无论是比对用户名和密码也好,使用指纹识别也罢,使用视网膜识别也行, 5、完成认证后,openid.server将end user的浏览器重定向到第三步提供的openid.return_to,并附上如下的值: openid.mode = id_res “id_res”表示end user就是OpenID identity所声明的那个人,可选的值还有”cancel”,表示用户取消了认证 openid.return_to = http://bob.example.com/comment.cgi?session_id=Alice&nonce=123456 第三步的openid.return_to openid.identity = http://carol.example.com/Alice 第三步的openid.identity […more]

mvnw 简介

Aug 17, 2016 | | Say something

背景 maven是一款非常流行的java项目构建软件,它集项目的依赖管理、测试用例运行、打包、构件管理于一身,是我们工作的好帮手,maven飞速发展,它的发行版本也越来越多,如果我们的项目是基于maven构件的,那么如何保证拿到我们项目源码的同事的maven版本和我们开发时的版本一致呢,可能你认为很简单,一个公司嘛,规定所有的同事都用一maven版本不就万事大吉了吗?一个组织内部这是可行的,要是你开源了一个项目呢?如何保证你使用的maven的版本和下载你源码的人的maven的版本一致呢,这时候mvnw就大显身手了。 mvnw 全名是maven wrapper,它的原理是在maven-wrapper.properties文件中记录你要使用的maven版本,当用户执行mvnw clean 命令时,发现当前用户的maven版本和期望的版本不一致,那么就下载期望的版本,然后用期望的版本来执行mvn命令,比如刚才的mvn clean。 为项目添加mvnw支持很简单,有两种方式: 方法一,在pom.xml中添加plugin声明: <plugin> <groupId>com.rimerosolutions.maven.plugins</groupId> <artifactId>wrapper-maven-plugin</artifactId> <version>0.0.4</version> </plugin> 这样当我们执行mvn wrapper:wrapper 时,会帮我们生成mvnw.bat, mvnw, maven/maven-wrapper.jar, maven/maven-wrapper.properties这些文件。 然后我们就可以使用mvnw代替mvn命令执行所有的maven命令,比如mvnw clean package 方法二,直接执行goal mvn -N io.takari:maven:wrapper -Dmaven=3.3.3 表示我们期望使用的maven的版本为3.3.3 产生的内容和第一种方式是一样的,只是目录结构不一样,maven-wrapper.jar和maven-wrapper.properties在”.mvn/wrapper”目录下 使用的注意事项 1、由于我们使用了新的maven ,如果你的settings.xml没有放在当前用户下的.m2目录下,那么执行mvnw时不会去读取你原来的settings.xml文件 2、在mvnw.bat中有如下的一段脚本 if exist “%M2_HOME%\bin\mvn.cmd” goto init 意思是如果找到mvn.cmd就执行初始化操作,但是maven早期版本不叫mvn.cmd,而是叫mvn.bat,所以会报”Error: M2_HOME is set to an invalid directory”错误,改成你本地的maven的匹配后缀就好了。 参考资料 https://github.com/takari/maven-wrapper

mvc:annotation-driven 的作用

May 17, 2016 | | 1 comment

相关的代码在org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser.parse 方法中实现的,分别注册RequestMappingHandlerMapping,RequestMappingHandlerAdapter,ExceptionHandlerExceptionResolver,ResponseStatusExceptionResolver,DefaultHandlerExceptionResolver 到spring 容器,对于RequestMappingHandlerAdapter和ExceptionHandlerExceptionResolver一个重要的属性是messageConverters 用来进行消息转换。如果jackson和jaxb 库在classpath下,那么就会注册Jaxb2RootElementHttpMessageConverter和MappingJackson2HttpMessageConverter,当一个RequestMapping方法添加了@ResponseBody注解后,就会相应地转为json或者xml字符串

使用XShell自带的OpenSSH key产生器

May 5, 2016 | | Say something

产出Key 执行以下步骤: tools->new User key Wizard 选择key Type为RSA key length 为1024 Bits 然后next passphrase 就是口令,输入两次 然后next 选择finish完成产生 导出key 执行以下步骤: tools->user key manager 列表中就是我们刚产生的key,选择export,保存即可 点击Properties->public key 就可以查看对应的公钥,如图 可以将其导出为一个文件,也可以直接将其拷贝出来,追加到对应服务器的~/.ssh/authorized_keys文件中 注意centos 7的/etc/ssh/sshd_config文件的 AuthorizedKeysFile .ssh/authorized_keys 配置项是激活的,可能有些服务器没有激活,需要确认下。 参考阅读 http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html