Browse Source

新增邮件提醒

Administrator 4 years ago
parent
commit
c22d67493a

+ 4 - 0
src/main/java/com/goafanti/admin/controller/AdminReleaseApiController.java

@@ -120,6 +120,10 @@ public class AdminReleaseApiController extends CertifyApiController{
 			res.getError().add(buildError(ErrorConstants.PARAM_EMPTY_ERROR,"审核状态"));
 			return res;
 		}
+		if (remarks.length()>20) {
+			res.getError().add(buildError("备注长度不能超过20个字符。"));
+			return res;
+		}
 		res.setData(publicReleaseService.pushExaminePublicRelease( id , status, remarks,duration));
 		return res;
 	}

+ 1 - 8
src/main/java/com/goafanti/admin/service/impl/PublicReleaseServiceImpl.java

@@ -1,7 +1,6 @@
 package com.goafanti.admin.service.impl;
 
 import java.text.ParseException;
-import java.util.Calendar;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -11,7 +10,6 @@ import java.util.UUID;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import com.alibaba.fastjson.JSONObject;
 import com.goafanti.admin.bo.InputPublicDtails;
 import com.goafanti.admin.bo.InputPublicRelease;
 import com.goafanti.admin.bo.InputPublicReleaseList;
@@ -30,9 +28,7 @@ import com.goafanti.common.error.BusinessException;
 import com.goafanti.common.model.Admin;
 import com.goafanti.common.model.PublicRelease;
 import com.goafanti.common.model.PublicReleaseLog;
-import com.goafanti.common.utils.AsyncUtils;
 import com.goafanti.common.utils.DateUtils;
-import com.goafanti.common.utils.HttpUtils;
 import com.goafanti.common.utils.WeChatUtils;
 import com.goafanti.core.mybatis.BaseMybatisDao;
 import com.goafanti.core.mybatis.page.Pagination;
@@ -113,9 +109,6 @@ public class PublicReleaseServiceImpl extends BaseMybatisDao<PublicReleaseMapper
 		Date date =new Date();
 		p.setId(id);
 		p.setStatus(status);
-		if (status==2) {
-			p.setDuration(duration);
-		}
 		PublicRelease use=publicReleaseMapper.selectByPrimaryKey(id);
 		publicReleaseMapper.updateByPrimaryKeySelective(p);
 		PublicReleaseLog log=new PublicReleaseLog(id,TokenManager.getAdminId(),status,remarks,new Date());
@@ -124,7 +117,7 @@ public class PublicReleaseServiceImpl extends BaseMybatisDao<PublicReleaseMapper
 		Admin s=adminMapper.selectByPrimaryKey(use.getAid());
 		if (my.getOpenId()!=null) {
 			return weChatUtils.addNotice(s.getOpenId(),p.getStatus(),date,my.getName(),
-					"["+my.getName()+"]"+(p.getStatus()==0?"驳回":"同意")+"了您的外出申请。");
+					remarks);
 		}
 			return 1;
 	}

+ 21 - 9
src/main/java/com/goafanti/common/bo/EmailBo.java

@@ -68,7 +68,7 @@ public class EmailBo {
 	 * @param date			时间
 	 * @param adminName		接收人名字
 	 * @param userName		用户名称
-	 * @param type		类型 0通用 1催款 2付款催款
+	 * @param type		类型 0订单提醒 1催款 2付款催款
 	 * @param approval   null 非特批
 	 * @return 
 	 */
@@ -84,6 +84,23 @@ public class EmailBo {
 		if(type==1)this.content=setDunFormat( addressee, sender, deptname,orderNo, date , dunStatusName,adminName,userName,0);
 		if(type==2)this.content=setDunFormat( addressee, sender, deptname,orderNo, date , dunStatusName,adminName,userName,1);
 	}
+	/**
+	 * 通用模版
+	 * @param subject
+	 * @param address
+	 * @param deptname
+	 * @param sender
+	 * @param end
+	 */
+	public  EmailBo(String subject, String address, String deptname, String sender,String end) {
+		this.subject = subject;
+		this.address = address;
+		this.addressee = "";
+		this.deptname = deptname;
+		this.sender = sender;
+		if (end!=null) this.end=end;
+		this.content = setGeneralFormat();
+	}
 	
 	public  EmailBo(String subject, String address, String deptname, String sender,
 			 String orderNo,String adminName) {
@@ -222,12 +239,9 @@ public class EmailBo {
 				"                      <tr>\r\n" + 
 				"                <td width=\"40\" height=\"32\" border=\"0\" align=\"left\" valign=\"middle\" style=\" width:40px; text-align:left;vertical-align:middle; line-height:32px; float:left;\">&nbsp;</td>\r\n" + 
 				"                <td width=\"720\" height=\"32\" border=\"0\" align=\"left\" style=\" width:720px; text-align:left;vertical-align:middle;line-height:32px;\"><span style=\"font-weight: 900\">您收到一条由["+this.deptname+"] 的 ["+this.sender+"] 发起的 ["+this.subject+"] 通知</span></td>\r\n" + 
-				"              </tr>\r\n" + 
-				"              <tr>\r\n" + 
-				"                <td width=\"720\" height=\"24\" colspan=\"2\" style=\"padding-left:40px;\"><span style=\"font-weight: 900\">请登录查看</span></td>\r\n" + 
-				"              </tr>\r\n" + 
+				"              </tr>\r\n" +
 				"              <tr>\r\n" + 
-				"                <td width=\"720\" height=\"24\" colspan=\"2\" style=\"padding-left:40px;\"><span>详情请登录科德业务管理系统查看,谢谢!</span></td>\r\n" + 
+				"                <td width=\"720\" height=\"24\" colspan=\"2\" style=\"padding-left:40px;\"><span>"+end+"</span></td>\r\n" + 
 				"              </tr>\r\n" + 
 				"              <tr>\r\n" + 
 				"                <td width=\"720\" height=\"24\" colspan=\"2\" style=\"padding-left:40px;\"></td>\r\n" + 
@@ -290,9 +304,7 @@ public class EmailBo {
 	}
 	
 	public String format(String name){
-        return "<div>亲爱的" + name + ", 您收到一条由[" + this.deptname +"] 的 [" + this.sender + "] 发起的 [" + this.subject + "] 通知:</div>"
-        		+ "<div>" + this.content + "</div>"
-        		+ "<div>" + this.end + "</div>";
+        return  "<div>" + this.content + "</div>";
     }
 	
 	

+ 1 - 1
src/main/java/com/goafanti/common/dao/AdminMapper.java

@@ -202,7 +202,7 @@ public interface AdminMapper {
 
 	List<String> getAdminRoleListByAid(String id);
 
-	String selectByOpeid(String aid);
+	Admin selectByOpeid(String openid);
 
 	Admin selectGetSuper(String aid);
 	

+ 5 - 3
src/main/java/com/goafanti/common/mapper/AdminMapper.xml

@@ -1241,8 +1241,10 @@ select a.id,a.nickname as name,a.source,c.name contacts,c.mobile as contactMobil
 	where a.id= #{id}
   </select>
   
-  <select id="selectByOpeid" resultType="java.lang.String">
-  select b.open_id from admin a left join admin b on a.superior_id =b.id
-	where a.id= #{aid}
+  <select id="selectByOpeid" parameterType="java.lang.String" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from admin
+    where  open_id= #{openid}
   </select>
 </mapper>

+ 2 - 2
src/main/java/com/goafanti/common/mapper/PublicReleaseMapper.xml

@@ -488,9 +488,9 @@ date_format(a.release_end ,'%Y-%m-%d %H:%i:%S') releaseEnds,date_format(a.create
   
   <select id="listPublicStatistics" resultType="com.goafanti.admin.bo.OutPublicStatistics">
   	select if(a.status=0,1,0)bh ,if(a.status=1,1,0)wsh,if(a.status=2,1,0)tg,b.name 
-  	,sum(a.duration)duration
+  	,sum(if(a.status=2,a.duration,0))duration
     from  public_release a left join admin b on a.aid =b.id
-	where 1=1
+	where 1=1 
 	<if test="aid != null">
 	and a.aid= #{aid}
 	</if>

+ 0 - 9
src/main/java/com/goafanti/common/utils/AsyncUtils.java

@@ -1,27 +1,18 @@
 package com.goafanti.common.utils;
 
 import java.io.UnsupportedEncodingException;
-import java.net.URL;
-import java.util.Date;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 import javax.mail.MessagingException;
 
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
-import com.alibaba.fastjson.JSONObject;
 import com.goafanti.common.bo.EmailBo;
-import com.goafanti.common.constant.AFTConstants;
 import com.goafanti.common.dao.NoticeMapper;
 import com.goafanti.common.enums.NoticeTypes;
-import com.goafanti.common.error.BusinessException;
 import com.goafanti.common.model.Notice;
-import com.goafanti.core.shiro.token.TokenManager;
 
 @Component
 @Async

+ 190 - 0
src/main/java/com/goafanti/common/utils/RedisUtil.java

@@ -0,0 +1,190 @@
+package com.goafanti.common.utils;
+
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import com.alibaba.fastjson.JSON;
+
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisPool;
+/**
+ * redis辅助类
+ * @author 
+ *
+ */
+@Component
+public class RedisUtil {
+	@Value(value = "${jedis.host}")
+	private  String host;
+	@Value(value = "${jedis.password}")
+	private  String pwd;
+	@Autowired
+	private  JedisPool pool;//创建代理对象
+	
+	
+	
+//	 /**
+//     * 初始化Redis连接池
+//     */
+//    public RedisUtil() {
+//    	if (pool==null) {
+//    		try {
+//    			JedisPoolConfig config = new JedisPoolConfig();
+//    			config.setBlockWhenExhausted(false);
+//    			config.setEvictionPolicyClassName("org.apache.commons.pool2.impl.DefaultEvictionPolicy"); 
+//    			config.setJmxEnabled(true);
+//    			config.setJmxNamePrefix("pool");
+//    			config.setLifo(true);
+//    			config.setMaxIdle(8);
+//    			config.setMaxTotal(8);
+//    			config.setMaxWaitMillis(-1);
+//    			config.setMinEvictableIdleTimeMillis(1800000L);
+//    			config.setMinIdle(0);
+//    			config.setNumTestsPerEvictionRun(3);
+//    			config.setSoftMinEvictableIdleTimeMillis(1800000L);
+//    			config.setTestOnBorrow(false);
+//    			config.setTestWhileIdle(false);
+//    			config.setTimeBetweenEvictionRunsMillis(-1);
+//    			pool = new JedisPool(config, host, 6379, 10000, pwd);
+//    		} catch (Exception e) {
+//    			e.printStackTrace();
+//    		}
+//		}
+//    }
+
+	
+	
+	public boolean presence(String key){
+		Jedis jedis = pool.getResource();
+		boolean bool=true;
+		try {
+			bool =jedis.exists(key);//进行判断
+		}catch(Exception e){
+			e.printStackTrace();//输出错误信息
+		}finally {
+			jedis.close();//释放资源
+		}
+		return bool;
+	}
+	/**
+	 * 将缓存中数据进行反序列化
+	 * @param key
+	 * @param clazz
+	 * @return
+	 */
+	@SuppressWarnings("unchecked")
+	public <T>List<T> getObject(String key,Class<T> clazz){
+		Jedis jedis = pool.getResource();
+		ByteArrayInputStream is=null;
+		ObjectInputStream ois=null;
+		try {
+			//将缓存中数据存入byte数组中
+			byte[] b = jedis.get(key.getBytes());
+			is= new ByteArrayInputStream(b);
+			ois = new ObjectInputStream(is);
+			return(List<T>)ois.readObject();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}finally{
+			try {
+				is.close();
+				ois.close();
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+			jedis.close();
+		}
+		return null;
+	}
+	/**
+	 * 将对象进行序列化存入redis中
+	 * @param object
+	 * @param key
+	 */
+	public void saveObject(Object object,String key){
+		Jedis jedis=pool.getResource();
+		ByteArrayOutputStream os=null;
+		ObjectOutputStream oos=null;
+		try {
+			os=new ByteArrayOutputStream();
+			oos =new ObjectOutputStream(os);
+			byte[] b=os.toByteArray();
+			JSON.toJSONString(b);
+			jedis.set(key.getBytes(), b);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}finally{
+			try {
+				os.close();
+				oos.close();
+			} catch (Exception e2) {
+				e2.printStackTrace();
+			}
+			jedis.close();
+		}
+	}
+	// 把List集合对象转换成json格式保存到指定的键中
+	public void saveJsonArray(Object object, String key) {
+		Jedis jedis = pool.getResource();
+		try {
+			// 格式化成Json字符串
+			String array = JSON.toJSONString(object);
+			jedis.set(key, array.toString()); // 存入缓存
+		} finally {
+			jedis.close();
+		}
+	}
+	
+		public void setString(String key, String value) {
+			Jedis jedis = pool.getResource();
+			try {
+				jedis.set(key,value); // 存入缓存
+			} finally {
+				jedis.close();
+			}
+		}
+		
+		public void deleteString(String key) {
+			Jedis jedis = pool.getResource();
+			try {
+				jedis.del(key);
+			} finally {
+				jedis.close();
+			}
+		}
+		
+		public String getString(String key) {
+			Jedis jedis = pool.getResource();
+			String str=new String();
+			try {
+				str=jedis.get(key);
+			} finally {
+				jedis.close();
+			}
+			return str;
+		}
+
+	// 通过键取出Json字符串并转换成 <T>这个T所指定的类型
+	public  <T> T getJsonArray(String key, Class<T> clazz) {
+		Jedis jedis = pool.getResource();
+		try {
+			String str = jedis.get(key);
+			// 把字符串转换回集合对象 clazz是指定的类型
+			return JSON.parseObject(str, clazz);
+		} finally {
+			jedis.close();
+		}
+	}
+}
+
+

+ 54 - 26
src/main/java/com/goafanti/common/utils/WeChatUtils.java

@@ -1,17 +1,26 @@
 package com.goafanti.common.utils;
 
+import java.io.UnsupportedEncodingException;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.mail.MessagingException;
+
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
 import com.alibaba.fastjson.JSONObject;
+import com.goafanti.admin.bo.AdminListBo;
+import com.goafanti.common.bo.EmailBo;
 import com.goafanti.common.constant.AFTConstants;
+import com.goafanti.common.dao.AdminMapper;
 import com.goafanti.common.error.BusinessException;
+import com.goafanti.common.model.Admin;
 import com.goafanti.core.shiro.token.TokenManager;
 
+
 @Component
 public class WeChatUtils {
 	
@@ -20,6 +29,13 @@ public class WeChatUtils {
 	private String appId;
 	@Value(value = "${wx.appSecret}")
 	private String appSecret;
+	@Autowired
+	private RedisUtil redisUtil;
+	@Autowired
+	private	AsyncUtils asyncUtils;
+	@Autowired
+	private AdminMapper	adminMapper;
+	
 	//待审核通知
 	private static final String sptz="j7WH3EwQnxGxwuV2HwmJhryxySPE8vOiV5cVOpp-42I";
 	//审核结通知
@@ -42,8 +58,6 @@ public class WeChatUtils {
 		String url=send_url.replace("ACCESS_TOKEN", accessToken);
 		map.put("access_token", accessToken);
 		map.put("touser", openid);
-		String str=DateUtils.formatDate(date, AFTConstants.YMDHMS_CHINESE);
-		System.out.println(str);
 		if (type==1) {
 			map.put("template_id", sptz);
 			map.put("data",getData(type,date, aname,remarks));
@@ -55,6 +69,19 @@ public class WeChatUtils {
 		JSONObject res=HttpUtils.httpPost(url, map);
 		System.out.println("res="+JSONObject.toJSONString(res));
 		if (res.get("errcode")!=null) {
+			Admin a=adminMapper.selectByOpeid(openid);
+			AdminListBo my=adminMapper.getDeptNameByAid(TokenManager.getAdminId());
+			String title="外出申请提醒";
+			if (type==0) title="外出申请驳回提醒";
+			else if (type==2) title="外出申请同意提醒";
+			if (SendEmailUtil.isEmail(a.getEmail())) {
+				EmailBo email=new EmailBo(title,a.getEmail() , my.getDepartmentName(), my.getName(),"详情请登录微信打卡小程序查看,谢谢!") ;
+				try {
+					asyncUtils.send(email);
+				} catch (UnsupportedEncodingException | MessagingException e) {
+					e.printStackTrace();
+				}
+			}
 			return res.getInteger("errcode");
 		}else {
 			return 1;
@@ -97,29 +124,28 @@ public class WeChatUtils {
 	
 
 	
-	  public  String getAccessToken() {
-	    	String access_token=(String) TokenManager.getVal2Session("access_token");
-	    	Long expires_in= (Long) TokenManager.getVal2Session("expires_in");
-	    	Date date=new Date();
-	    	if (access_token!=null&&expires_in!=null) {
-	    		LoggerUtils.debug(getClass(), "\n"
-	    				+ "access_token="+access_token+"\n "
-	    						+ "expires_in="+expires_in+"\n "
-	    								+ "now="+DateUtils.formatDate(date, AFTConstants.YYYYMMDDHHMMSS));
-	    		if (new Date().getTime()<Long.valueOf(expires_in)) {
-	    			LoggerUtils.debug(getClass(), "session中获取accestoken");
-	    			return access_token;
-				}else {
-					TokenManager.deleteSession("access_token");
-					TokenManager.deleteSession("expires_in");
-					return setSessionAccessToken(date); 
-				}
-			}else {
+	public String getAccessToken() {
+		Date date = new Date();
+		if (redisUtil.presence("access_token")||redisUtil.presence("expires_in")) {
+			String access_token=redisUtil.getString("access_token");
+			String expires_in=redisUtil.getString("expires_in");
+			if (date.getTime() < Long.valueOf(expires_in)) {
+				LoggerUtils.debug(getClass(), "redis中获取accestoken");
+				return access_token;
+			} else {
+				LoggerUtils.debug(getClass(), "accestoken超时重新获取");
+				redisUtil.deleteString("access_token");
+				redisUtil.deleteString("expires_in");
 				return setSessionAccessToken(date);
 			}
-				
-			
-	    }
+		
+		} else {
+			return setSessionAccessToken(date);
+		}
+		
+
+	}
+	
 
 
 	private String setSessionAccessToken(Date date) {
@@ -131,13 +157,15 @@ public class WeChatUtils {
 		if (errcode!=null) {
 			throw new  BusinessException("获取AccessToken失败!");
 		}else {
-			LoggerUtils.debug(AsyncUtils.class,"获取AccessToken成功,accesstoken="+js.getString("access_token"));
+			LoggerUtils.debug(AsyncUtils.class,"获取并存入AccessToken成功,accesstoken="+js.getString("access_token"));
 		}
 		String access_token = js.getString("access_token");
 		Long expires_in = js.getLong("expires_in");
+		//返回时间为秒需要计算换成毫秒
+		expires_in=expires_in*1000;
 		expires_in+=date.getTime();
-		TokenManager.setVal2Session("access_token", access_token);
-		TokenManager.setVal2Session("expires_in", expires_in);
+		redisUtil.setString("access_token", access_token);
+		redisUtil.setString("expires_in", expires_in.toString());
 		return access_token;
 	}
 

+ 71 - 31
src/main/resources/spring/spring-shiro.xml

@@ -1,7 +1,9 @@
 <?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:aop="http://www.springframework.org/schema/aop"
-	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:aop="http://www.springframework.org/schema/aop"
+	xmlns:tx="http://www.springframework.org/schema/tx"
+	xmlns:util="http://www.springframework.org/schema/util"
 	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
@@ -10,11 +12,26 @@
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
 
-	<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
+	<bean id="jedisPoolConfig"
+		class="redis.clients.jedis.JedisPoolConfig">
 		<property name="maxIdle" value="100" />
 		<property name="minIdle" value="10" />
 		<property name="testOnBorrow" value="true" />
 	</bean>
+	  <bean id="poolConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig">
+        <property name="minIdle" value="5"/>
+        <property name="maxIdle" value="20"/>
+        <property name="maxWaitMillis" value="100000"/>
+        <property name="maxTotal" value="10000"/>
+    </bean>
+	
+	 <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
+        <constructor-arg name="poolConfig" ref="poolConfig"/>
+        <constructor-arg name="host" value="${jedis.host}"/>
+        <constructor-arg name="port" value="${jedis.port}"/>
+        <constructor-arg name="password" value="${jedis.password}"/>
+        <constructor-arg name="timeout" value="1000000"/>
+    </bean>
 
 	<bean id="redisConnectionFactory"
 		class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
@@ -26,37 +43,45 @@
 		<!-- <property name="database" value="${jedis.dbIndex}" /> -->
 	</bean>
 
-	<bean id="redisTemplate" class="com.goafanti.core.cache.template.FastJsonRedisTemplate">
-		<constructor-arg index="0" ref="redisConnectionFactory" />
+	<bean id="redisTemplate"
+		class="com.goafanti.core.cache.template.FastJsonRedisTemplate">
+		<constructor-arg index="0"
+			ref="redisConnectionFactory" />
 	</bean>
-	<bean id="sessionRedisTemplate" class="com.goafanti.core.shiro.cache.template.SessionRedisTemplate">
-		<constructor-arg index="0" ref="redisConnectionFactory" />
+	<bean id="sessionRedisTemplate"
+		class="com.goafanti.core.shiro.cache.template.SessionRedisTemplate">
+		<constructor-arg index="0"
+			ref="redisConnectionFactory" />
 	</bean>
-	
-	<bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager">
+
+	<bean id="cacheManager"
+		class="org.springframework.data.redis.cache.RedisCacheManager">
 		<constructor-arg index="0" ref="redisTemplate" />
-		<property name="defaultExpiration" value="86400" />		
+		<property name="defaultExpiration" value="86400" />
 	</bean>
-	
-	<bean id="shrioRedisCacheManager" class="com.goafanti.core.shiro.cache.ShiroRedisCacheManager">
+
+	<bean id="shrioRedisCacheManager"
+		class="com.goafanti.core.shiro.cache.ShiroRedisCacheManager">
 		<property name="redisTemplate" ref="sessionRedisTemplate" />
 		<property name="expire" value="2592000" />
 	</bean>
-	
 
-      
+
+
 
 	<bean id="sessionIdGenerator"
 		class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator" />
 
-	<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
+	<bean id="sessionIdCookie"
+		class="org.apache.shiro.web.servlet.SimpleCookie">
 		<constructor-arg value="AFT_SID" />
 		<property name="httpOnly" value="true" />
 		<property name="maxAge" value="2592000" />
 		<!-- <property name="domain" value=""/> -->
 	</bean>
 
-	<bean id="customSessionListener" class="com.goafanti.core.shiro.listener.CustomSessionListener">
+	<bean id="customSessionListener"
+		class="com.goafanti.core.shiro.listener.CustomSessionListener">
 		<property name="redisTemplate" ref="sessionRedisTemplate" />
 	</bean>
 
@@ -69,11 +94,13 @@
 	<bean id="sessionValidationScheduler"
 		class="org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler">
 		<!-- -->
-		<property name="interval" value="${session.validate.timespan}" />
+		<property name="interval"
+			value="${session.validate.timespan}" />
 		<property name="sessionManager" ref="sessionManager" />
 	</bean>
 	<!-- -->
-	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
+	<bean id="securityManager"
+		class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
 		<property name="realm" ref="userRealm" />
 		<property name="sessionManager" ref="sessionManager" />
 		<property name="cacheManager" ref="shrioRedisCacheManager" />
@@ -87,17 +114,21 @@
 	<!-- credential matcher -->
 	<bean id="credentialsMatcher"
 		class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
-		<property name="hashAlgorithmName" value="${pwd.hash_algorithm_name}" />
-		<property name="hashIterations" value="${pwd.hash_iterations}" />
+		<property name="hashAlgorithmName"
+			value="${pwd.hash_algorithm_name}" />
+		<property name="hashIterations"
+			value="${pwd.hash_iterations}" />
 		<property name="storedCredentialsHexEncoded" value="true" />
 	</bean>
 	<!-- -->
-	<bean id="userRealm" class="com.goafanti.core.shiro.token.UserRealm">
+	<bean id="userRealm"
+		class="com.goafanti.core.shiro.token.UserRealm">
 		<property name="credentialsMatcher" ref="credentialsMatcher" />
 	</bean>
 
 	<!-- Session Manager -->
-	<bean id="sessionManager" class="com.goafanti.core.shiro.session.CustomSessionManager">
+	<bean id="sessionManager"
+		class="com.goafanti.core.shiro.session.CustomSessionManager">
 		<!-- class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> -->
 		<property name="sessionIdUrlRewritingEnabled" value="false" />
 		<!-- -->
@@ -113,35 +144,43 @@
 			</list>
 		</property>
 		<!-- -->
-		<property name="sessionValidationScheduler" ref="sessionValidationScheduler" />
+		<property name="sessionValidationScheduler"
+			ref="sessionValidationScheduler" />
 		<!-- -->
-		<property name="sessionValidationSchedulerEnabled" value="true" />
+		<property name="sessionValidationSchedulerEnabled"
+			value="true" />
 		<!-- -->
 		<property name="deleteInvalidSessions" value="true" />
 		<!-- -->
 		<property name="sessionIdCookie" ref="sessionIdCookie" />
 	</bean>
 
-	<bean id="shiroManager" class="com.goafanti.core.shiro.service.impl.ShiroManagerImpl" />
+	<bean id="shiroManager"
+		class="com.goafanti.core.shiro.service.impl.ShiroManagerImpl" />
 
-	<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
+	<bean id="shiroFilter"
+		class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
 		<property name="securityManager" ref="securityManager" />
 		<property name="loginUrl" value="/user/login" />
 		<property name="successUrl" value="/" />
 		<property name="unauthorizedUrl" value="/user/login" />
-		<property name="filterChainDefinitions" value="#{shiroManager.loadFilterChainDefinitions()}" />
+		<property name="filterChainDefinitions"
+			value="#{shiroManager.loadFilterChainDefinitions()}" />
 		<property name="filters">
 			<util:map>
 				<entry key="login">
-					<bean id="login" class="com.goafanti.core.shiro.filter.LoginFilter" />
+					<bean id="login"
+						class="com.goafanti.core.shiro.filter.LoginFilter" />
 				</entry>
 				<entry key="permission">
-					<bean id="permission" class="com.goafanti.core.shiro.filter.PermissionFilter">
+					<bean id="permission"
+						class="com.goafanti.core.shiro.filter.PermissionFilter">
 						<property name="loginUrl" value="/admin/login" />
 					</bean>
 				</entry>
 				<entry key="admin">
-					<bean id="admin" class="com.goafanti.core.shiro.filter.AdminFilter">
+					<bean id="admin"
+						class="com.goafanti.core.shiro.filter.AdminFilter">
 						<property name="loginUrl" value="/admin/login" />
 					</bean>
 				</entry>
@@ -149,5 +188,6 @@
 		</property>
 	</bean>
 	<!-- -->
-	<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
+	<bean id="lifecycleBeanPostProcessor"
+		class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
 </beans>