/*
* Copyright (c) 2017 4PX Information Technology Co.,Ltd. All rights reserved.
*/
package com.fpx.order.csm.config;

import java.util.Arrays;
import java.util.EventListener;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.Filter;

import org.apache.catalina.connector.Connector;
import org.apache.shiro.cas.CasFilter;
import org.apache.shiro.cas.CasSubjectFactory;
import org.apache.shiro.session.mgt.eis.MemorySessionDAO;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.filter.authc.LogoutFilter;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.servlet.Cookie;
import org.apache.shiro.web.servlet.SimpleCookie;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.dozer.DozerBeanMapper;
import org.jasig.cas.client.session.SingleSignOutFilter;
import org.jasig.cas.client.session.SingleSignOutHttpSessionListener;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.MethodInvokingFactoryBean;
import org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.core.env.Environment;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.filter.DelegatingFilterProxy;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver;

import com.fpx.basic.sdk.rbaccenter.RBACCenterService;
import com.fpx.common.core.tool.GIdUtil;
import com.fpx.order.common.context.PcsHandlerExceptionResolver;
import com.fpx.order.common.context.PcsMappingJackson2HttpMessageConverter;
import com.fpx.order.common.util.JsonObjectMapper;
import com.fpx.order.csm.realm.MyCasRealm;
import com.fpx.order.util.convert.PojoConverter;

/**
*
* @author linzhh
* @date 2017年7月7日
*/
@ComponentScan(basePackages = { "com.fpx.order.common.context" })
@Configuration
public class ApplicationConfig extends WebMvcConfigurerAdapter implements EnvironmentAware {

@Autowired
private Environment env;

@Bean
public PojoConverter pojoConverter() {
List<String> mappingFiles = Arrays.asList("META-INF/dozer/dozer-mapping.xml");
DozerBeanMapper dozerBeanMapper = new DozerBeanMapper();
dozerBeanMapper.setMappingFiles(mappingFiles);

return new PojoConverter(dozerBeanMapper);
}

@Value("${datacenterId}")
private long datacenterId;

@Bean
public GIdUtil gIdUtil() {
return new GIdUtil(datacenterId);
}

@Bean(name = "myCasRealm")
public MyCasRealm myCasRealm() {
MyCasRealm realm = new MyCasRealm();
realm.setCasServerUrlPrefix(env.getProperty("cas.server.url"));
realm.setCasService(env.getProperty("cas.client.url") + "/login");
realm.setAuthorizationCachingEnabled(false);
return realm;
}

@Bean
public FilterRegistrationBean filterRegistrationBean1() {
FilterRegistrationBean filterRegistration = new FilterRegistrationBean();
SingleSignOutFilter ssFilter = new SingleSignOutFilter();
filterRegistration.setFilter(ssFilter);
// filterRegistration.addInitParameter("excludedPages",
// "/customer/package/prealert/**");
filterRegistration.setEnabled(true);
filterRegistration.addUrlPatterns("/*");
// CharacterEncodingFilter characterEncodingFilter = new
// CharacterEncodingFilter();
// characterEncodingFilter.setForceEncoding(true);
// characterEncodingFilter.setEncoding("UTF-8");
// filterRegistration.setFilter(characterEncodingFilter);
filterRegistration.setOrder(1);
return filterRegistration;
}

@Bean
public FilterRegistrationBean filterRegistrationBean2() {
FilterRegistrationBean filterRegistration = new FilterRegistrationBean();
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setForceEncoding(true);
characterEncodingFilter.setEncoding("UTF-8");
filterRegistration.setFilter(characterEncodingFilter);
filterRegistration.setOrder(2);
return filterRegistration;
}

@Bean
public FilterRegistrationBean filterRegistrationBean3() {
FilterRegistrationBean filterRegistration = new FilterRegistrationBean();
filterRegistration.setFilter(new DelegatingFilterProxy("shiroFilter"));
// 该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由ServletContainer管理
filterRegistration.addInitParameter("targetFilterLifecycle", "true");
filterRegistration.setEnabled(true);
filterRegistration.addUrlPatterns("/*");
filterRegistration.setOrder(3);
return filterRegistration;
}

// @Bean
// public FilterRegistrationBean filterRegistrationBean3() {
// FilterRegistrationBean filterRegistration = new FilterRegistrationBean();
// filterRegistration.setOrder(3);
// filterRegistration.setFilter(new SessionFilter());
// filterRegistration.setEnabled(true);
// filterRegistration.addUrlPatterns("/*");
// return filterRegistration;
// }

@Bean
public ServletListenerRegistrationBean<EventListener> getListener() {
ServletListenerRegistrationBean<EventListener> registrationBean = new ServletListenerRegistrationBean<>();
registrationBean.setListener(new SingleSignOutHttpSessionListener());
return registrationBean;
}

@Bean(name = "lifecycleBeanPostProcessor")
public LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}

@Bean
public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator daap = new DefaultAdvisorAutoProxyCreator();
daap.setProxyTargetClass(true);
return daap;
}

@Bean(name = "securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(MyCasRealm myCasRealm) {
DefaultWebSecurityManager dwsm = new DefaultWebSecurityManager();
dwsm.setSessionManager(getDefaultWebSessionManager());
dwsm.setRealm(myCasRealm);
dwsm.setSubjectFactory(new CasSubjectFactory());
return dwsm;
}

@Bean(name = "sessionManager")
public DefaultWebSessionManager getDefaultWebSessionManager() {
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
sessionManager.setGlobalSessionTimeout(1000 * 60 * 60 * 24);// 24小时session超时
sessionManager.setSessionDAO(getMemorySessionDAO());
sessionManager.setSessionValidationInterval(1000 * 60 * 60 * 10);// 每10小时检查一次是否有超时session并删除
Cookie cookie = new SimpleCookie("PCSCJSESSIONID");
cookie.setHttpOnly(true);
sessionManager.setSessionIdCookie(cookie);
sessionManager.setDeleteInvalidSessions(true);
sessionManager.setSessionValidationSchedulerEnabled(true);
return sessionManager;
}

@Bean(name = "memorySessionDAO")
public MemorySessionDAO getMemorySessionDAO() {
return new MemorySessionDAO();
}

@Bean
public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor(
DefaultWebSecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor aasa = new AuthorizationAttributeSourceAdvisor();
aasa.setSecurityManager(securityManager);
return aasa;
}

@Bean(name = "rBACCenterService")
public RBACCenterService getRBACCenterService() {
return new RBACCenterService(env.getProperty("rbac.center.url"), env.getProperty("sys.clientId"));
}

// @Bean(name="userFilter")
// public PcsCasFilter userFilter(){
// PcsCasFilter filter = new PcsCasFilter();
// return filter;
// }

@Bean(name = "casFilter")
public CasFilter casFilter() {
CasFilter casFilter = new CasFilter();
// PcsCasFilter casFilter = new PcsCasFilter();
casFilter.setName("casFilter");
casFilter.setEnabled(true);
// 登录失败后跳转的URL,也就是 Shiro 执行 CasRealm 的 doGetAuthenticationInfo
// 方法向CasServer验证tiket
casFilter.setFailureUrl(
env.getProperty("cas.server.url") + "/login?service=" + env.getProperty("cas.client.url") + "/login");// 认证失败后再打开登录页面
return casFilter;
}

@Bean(name = "shiroFilter")
public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager securityManager,
CasFilter casFilter/* ,UserFilter userFilter */) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
LogoutFilter logoutFilter = new LogoutFilter();
logoutFilter.setName("logout");
logoutFilter.setEnabled(true);
logoutFilter.setRedirectUrl(
env.getProperty("cas.server.url") + "/logout?service=" + env.getProperty("cas.client.url"));
// 必须设置 SecurityManager
shiroFilterFactoryBean.setSecurityManager(securityManager);
// 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
shiroFilterFactoryBean.setLoginUrl(
env.getProperty("cas.server.url") + "/login?service=" + env.getProperty("cas.client.url") + "/login");
// 登录成功后要跳转的连接
shiroFilterFactoryBean.setSuccessUrl("/");
shiroFilterFactoryBean.setUnauthorizedUrl("/403");
// SessionFilter sessionFilter = new SessionFilter();
// 添加casFilter到shiroFilter中
Map<String, Filter> filters = new LinkedHashMap<>();
// FormAuthenticationFilter authc = new FormAuthenticationFilter();
// AnonymousFilter anon = new AnonymousFilter();
filters.put("logout", logoutFilter);
filters.put("casFilter", casFilter);
// filters.put("anon", anon);
// filters.put("authc", authc);
// filters.put("sessionFilter", sessionFilter);
// filters.put("user", userFilter);
shiroFilterFactoryBean.setFilters(filters);

Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
filterChainDefinitionMap.put("/js/**", "anon");
filterChainDefinitionMap.put("/script/**", "anon");
filterChainDefinitionMap.put("/css/**", "anon");
filterChainDefinitionMap.put("/error/**", "anon");
filterChainDefinitionMap.put("/manage/**", "anon");// 健康检查
// 支持会员填写无预报包裹数据
filterChainDefinitionMap.put("/customer/package/prealert/**", "anon");
filterChainDefinitionMap.put("/sys/data/dictionary/**", "anon");
filterChainDefinitionMap.put("/category/**", "anon");
filterChainDefinitionMap.put("/area/**", "anon");

filterChainDefinitionMap.put("/common/**", "anon");
filterChainDefinitionMap.put("/WEB-INF/pages/error/**", "anon");
filterChainDefinitionMap.put("/images/**", "anon");
filterChainDefinitionMap.put("/imgs/**", "anon");
filterChainDefinitionMap.put("/img/**", "anon");
filterChainDefinitionMap.put("/plugins/**", "anon");
filterChainDefinitionMap.put("/layer/**", "anon");
filterChainDefinitionMap.put("/widgets/**", "anon");
filterChainDefinitionMap.put("/logout", "logout");
filterChainDefinitionMap.put("/login", "casFilter");
filterChainDefinitionMap.put("/heartbeat", "anon");
filterChainDefinitionMap.put("/prealert/track/simulateMQTrackMessage", "anon");
filterChainDefinitionMap.put("/prealert/track/twxSendTrack", "anon"); // 淘海外系统调用此接口推送轨迹
filterChainDefinitionMap.put("/prealert/track/getSendMessageOrReSend", "anon"); // 修复数据开启,结束后关闭
filterChainDefinitionMap.put("/favicon.ico", "anon");
filterChainDefinitionMap.put("/**", "user");
// filterChainDefinitionMap.put("/**", "sessionFilter");

shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
}

@Bean
public MethodInvokingFactoryBean getMethodInvokingFactoryBean(DefaultWebSecurityManager securityManager) {

MethodInvokingFactoryBean methodInvokingFactoryBean = new MethodInvokingFactoryBean();

methodInvokingFactoryBean.setStaticMethod("org.apache.shiro.SecurityUtils.setSecurityManager");

methodInvokingFactoryBean.setArguments(new Object[] { securityManager });

return methodInvokingFactoryBean;
}

@Override
public void setEnvironment(Environment env) {
this.env = env;
}

@Bean
public TomcatConnectorCustomizer tomcatConnectorCustomizer() {
return new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
connector.setURIEncoding("UTF-8");
connector.setUseBodyEncodingForURI(true);
}
};
}

@Bean
public MessageSource messageSource() {
// ResourceBundleMessageSource ms = new ResourceBundleMessageSource();
// ReloadableResourceBundleMessageSource ms = new
// PcsReloadableResourceBundleMessageSource();
ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
ms.setBasenames(new String[] { "classpath:META-INF/i18n/csm", "classpath:META-INF/i18n/global" });
ms.setCacheSeconds(20);
ms.setUseCodeAsDefaultMessage(true);
return ms;
}

// public MappingJackson2HttpMessageConverter
// mappingJackson2HttpMessageConverter(){
// return new PcsMappingJackson2HttpMessageConverter();
// }
@Bean
public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
RequestMappingHandlerAdapter adapter = new RequestMappingHandlerAdapter();
adapter.getMessageConverters().add(new PcsMappingJackson2HttpMessageConverter());
return adapter;
}

// @Bean
// public DateJsonDeserializer dateJsonDeserializer(){
// return new DateJsonDeserializer();
// }

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
PcsMappingJackson2HttpMessageConverter converter = new PcsMappingJackson2HttpMessageConverter();
//// converter.setMessageSource(messageSource);
// converters.add(converter);
converter.setObjectMapper(new JsonObjectMapper());
converter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON_UTF8));
converters.add(converter);
// converters.add(new PcsMappingJackson2HttpMessageConverter());
}

@Override // 这里配置后,会在HandlerExceptionResolverComposite中的处理器列表中加上这里配置的异常处理器,原默认列表中的处理器都失效
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
DefaultHandlerExceptionResolver pcsExceptionResolver = new PcsHandlerExceptionResolver();
exceptionResolvers.add(pcsExceptionResolver);
}
}

------------------------------------------------------------------------------------------------------------------------------------

Spring 静态注入讲解(MethodInvokingFactoryBean)

 soゝso2016-08-22 14:53:56 3485

分享到:

与其说是静态注入(IOC),不如讲是对JavaBean 的静态成员变量进行赋值。

一般我们在使用依赖注入的时候,如果当前对象(javaBean )创建(实例化)一次,那么非静态的成员变量也会实例化一次,用来支持当前对象的正常使用。而我们有的时候,一些对象是单例(scope="singleton" )的,或者一些变量从项目启动从配置文件加载后不需要变化,那么这种情况下怎么处理呢?

静态注入配置(XML):

 
  1. <!-- 静态注入,相当于调用SecurityUtils.setSecurityManager(securityManager) -->
  2. <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
  3. <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager"/>
  4. <property name="arguments" ref="securityManager"/>
  5. </bean>

上面注释写的很清楚,等于调用了下面的方法:

 
  1. SecurityUtils.setSecurityManager(securityManager)

就这么简单。

指定一个staticMethod ,静态的set 方法,另外一个参数是目标对象。把这个对象赋值过去。

如果arguments 是多个,采用List赋值。

 
  1. <!-- 静态注入,相当于调用SecurityUtils.setSecurityManager(securityManager) -->
  2. <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
  3. <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager"/>
  4. <property name="arguments">
  5. <list>
  6. <value>securityManager</value>
  7. </list>
  8. </property>
  9. </bean>

Spring 静态注入讲解(MethodInvokingFactoryBean)的更多相关文章

  1. Spring静态注入的三种方式

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/chen1403876161/article/details/53644024Spring静态注入的三 ...

  2. spring 静态注入

    1.静态注入 在setter 方法修改为非 static , 然后在上面注入即可 @Component public class WeixinConfig { // token public stat ...

  3. spring静态注入

    与其说是静态注入(IOC),不如讲是对JavaBean 的静态成员变量进行赋值. 一般我们在使用依赖注入的时候,如果当前对象(javaBean )创建(实例化)一次,那么非静态的成员变量也会实例化一次 ...

  4. 转: spring静态注入

    与其说是静态注入(IOC),不如讲是对JavaBean 的静态成员变量进行赋值. 一般我们在使用依赖注入的时候,如果当前对象(javaBean )创建(实例化)一次,那么非静态的成员变量也会实例化一次 ...

  5. Spring静态属性注入

    今天遇到一个工具类,需要静态注入一个属性,方法如下: 第一步:属性的set和get方法不要加static package cn.com.chinalife.ebusiness.common.util; ...

  6. spring配置文件注入到静态变量

    spring配置注入到静态文件代码如下: package com.test.oss; import org.springframework.beans.factory.annotation.Value ...

  7. Spring 依赖注入方式详解

    平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...

  8. Spring依赖注入三种方式详解

    在讲解Spring依赖注入之前的准备工作: 下载包含Spring的工具jar包的压缩包 解压缩下载下来的Spring压缩包文件 解压缩之后我们会看到libs文件夹下有许多jar包,而我们只需要其中的c ...

  9. 使用Dagger2做静态注入, 对比Guice.

    Dagger 依赖注入的诉求, 这边就不重复描述了, 在上文Spring以及Guice的IOC文档中都有提及, 既然有了Guice, Google为啥还要搞个Dagger2出来重复造轮子呢? 因为使用 ...

随机推荐

  1. swiper插件简介及用法

    swiper Swiper是纯javascript打造的滑动特效插件,面向手机.平板电脑等移动终端.Swiper能实现触屏焦点图.触屏Tab切换.触屏多图切换等常用效果.Swiper开源.免费.稳定. ...

  2. Java程序员面试题集(1-50

    下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,原来的题目中有很多重复题目和无价值的题目,还有不少的参考答案也是错误的,修改后的Java面试题集参照了JDK最 ...

  3. jq封装选项卡写法

    jq普通选项卡写法: var tabTag=$('#tabon'); var tabon=tabTag.find('li');//菜单栏 var tabCon=$(".hidden" ...

  4. python多线程锁lock/Rlock/BoundedSemaphore/Condition/Event

    import time import threading lock = threading.RLock() n = 10 def task(arg): # 加锁,此区域的代码同一时刻只能有一个线程执行 ...

  5. 链路的有效性检测 及 基于TCP的通信为什么需要RETRY

    一.链路的有效性检测 当网络发生单通.连接被防火墙Hang住.长时间GC或者通信线程发生非预期异常时,会导致链路不可用且不易被及时发现. 特别是异常发生在凌晨业务低谷期间,当早晨业务高峰期到来时,由于 ...

  6. Python高级教程-filter

    Python中的filter() Python内建的filter()函数用于过滤序列.和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函数依次 ...

  7. this的思考

    问题:JS中为什么要用this? 回答:因为this采用隐式“传递”一个对象的引用,所以可以将API设计得更加简洁和可复用 问题:JS中的this是什么? 背景:this是在运行时绑定的,this的上 ...

  8. HDU4223:Dynamic Programming?(简单dp)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4223 求连续子序列和的最小绝对值,水题. #include <iostream> #inclu ...

  9. 吴超老师课程--Pig的介绍和安装

    1.Pig是基于hadoop的一个数据处理的框架.  MapReduce是使用java进行开发的,Pig有一套自己的数据处理语言,Pig的数据处理过程要转化为MR来运行. 2.Pig的数据处理语言是数 ...

  10. 小知识:pyhon的作用域

    http://www.cnblogs.com/wupeiqi/p/5649402.html    五句话搞定JavaScript作用域 从JavaScript  == pyhon 作用域几乎一致 __ ...