#============================================================Logger CommonLog
log4j.logger.CommonLog=DEBUG, Console, LogRollingFile
# Console output...
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
# RollingFileAppender output...
log4j.appender.LogRollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.LogRollingFile.File=${user.dir}/yccb/log/yccb.log
log4j.appender.LogRollingFile.Append=true
log4j.appender.LogRollingFile.MaxFileSize=46MB
log4j.appender.LogRollingFile.MaxBackupIndex=50
log4j.appender.LogRollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.LogRollingFile.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH\:mm\:ss,SSS} method\:%l%n%m%n
#============================================================Logger SkmLog
log4j.logger.SkmLog=DEBUG, DailyRollingFile
# DailyRollingFile output...
log4j.appender.DailyRollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DailyRollingFile.DatePattern=yyyy-MM-dd'.log'
log4j.appender.DailyRollingFile.File=${user.dir}/yccb/log/skm/skm.log
log4j.appender.DailyRollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.DailyRollingFile.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH\:mm\:ss,SSS} method\:%l%n%m%n
1,公鑰和私鑰成對(duì)出現(xiàn)
2,公開的密鑰叫公鑰,只有自己知道的叫私鑰
3,用公鑰加密的數(shù)據(jù)只有對(duì)應(yīng)的私鑰可以 解密
4,用私鑰加密的數(shù)據(jù)只有對(duì)應(yīng)的公鑰可以解密
5,如果可以用公鑰解密,則必然是對(duì)應(yīng)的私鑰加的密
6,如果可以用私鑰解密,則 必然是對(duì)應(yīng)的公鑰加的密
明白了?
假設(shè)一下,我找了兩個(gè)數(shù)字,一個(gè)是1,一個(gè)是2。我喜歡2這個(gè)數(shù)字,就保留起來(lái),不告訴你們,然 后我告訴大家,1是我的公鑰。
我有一個(gè)文件,不能讓別人看,我就用1加密了。別人找到了這個(gè)文件,但是他不知道2就是解密的私鑰啊,所以 他解不開,只有我可以用數(shù)字2,就是我的私鑰,來(lái)解密。這樣我就可以保護(hù)數(shù)據(jù)了。
我的好朋友x用我的公鑰1加密了字符a,加密后成了b, 放在網(wǎng)上。別人偷到了這個(gè)文件,但是別人解不開,因?yàn)閯e人不知道2就是我的私鑰,只有我才能解密,解密后就得到a。這樣,我們就可以傳送加密的數(shù)據(jù)了。
現(xiàn)在我們知道用公鑰加密,然后用私鑰來(lái)解密,就可以解決安全傳輸?shù)膯?wèn)題了。如果我用私鑰加密一段數(shù)據(jù)(當(dāng)然只有我可以用私鑰加密,因?yàn)橹挥形抑?2是我的私鑰),結(jié)果所有的人都看到我的內(nèi)容了,因?yàn)樗麄兌贾牢业墓€是1,那么這種加密有什么用處呢?
但是我的好朋友x說(shuō)有人冒充我 給他發(fā)信。怎么辦呢?我把我要發(fā)的信,內(nèi)容是c,用我的私鑰2,加密,加密后的內(nèi)容是d,發(fā)給x,再告訴他解密看是不是c。他用我的公鑰1解密,發(fā)現(xiàn)果然 是c。這個(gè)時(shí)候,他會(huì)想到,能夠用我的公鑰解密的數(shù)據(jù),必然是用我的私鑰加的密。只有我知道我得私鑰,因此他就可以確認(rèn)確實(shí)是我發(fā)的東西。這樣我們就能確 認(rèn)發(fā)送方身份了。這個(gè)過(guò)程叫做數(shù)字簽名。當(dāng)然具體的過(guò)程要稍微復(fù)雜一些。用私鑰來(lái)加密數(shù)據(jù),用途就是數(shù)字簽名。
好,我們復(fù)習(xí)一下:
1, 公鑰私鑰成對(duì)出現(xiàn)
2,私鑰只有我知道
3,大家可以用我的公鑰給我發(fā)加密的信了
4,大家用我的公鑰解密信的內(nèi)容,看看能不能解開, 能解開,說(shuō)明是經(jīng)過(guò)我的私鑰加密了,就可以確認(rèn)確實(shí)是我發(fā)的了。
總結(jié)一下結(jié)論:
1,用公鑰加密數(shù)據(jù),用私鑰來(lái)解密數(shù)據(jù)
2, 用私鑰加密數(shù)據(jù)(數(shù)字簽名),用公鑰來(lái)驗(yàn)證數(shù)字簽名。
在實(shí)際的使用中,公鑰不會(huì)單獨(dú)出現(xiàn),總是以數(shù)字證書的方式出現(xiàn),這樣是為了公鑰的安 全性和有效性。
二,SSL
我和我得好朋友x,要進(jìn)行安全的通信。這種通信可以是QQ聊天,很頻繁的。用我的公鑰加密數(shù)據(jù)就不行 了,因?yàn)椋?br />1,我的好朋友x沒(méi)有公私鑰對(duì),我怎么給他發(fā)加密的消息啊? (注:實(shí)際情況中,可以雙方都有公私鑰對(duì))
2,用公私鑰加密運(yùn)算 很費(fèi)時(shí)間,很慢,影響QQ效果。
好了,好朋友x,找了一個(gè)數(shù)字3,用我的公鑰1,加密后發(fā)給我,說(shuō),我們以后就用這個(gè)數(shù)字來(lái)加密信息吧。 我解開后,得到了數(shù)字3。這樣,只有我們兩個(gè)人知道這個(gè)秘密的數(shù)字3,別的人都不知道,因?yàn)樗麄兗炔恢獂挑了一個(gè)什么數(shù)字,加密后的內(nèi)容他們也無(wú)法解開, 我們把這個(gè)秘密的數(shù)字叫做會(huì)話密鑰。
然后,我們選擇一種對(duì)稱密鑰算法,比如DES,(對(duì)稱算法是說(shuō),加密過(guò)程和解密過(guò)程是對(duì)稱的,用一個(gè) 密鑰加密,可以用同一個(gè)密鑰解密。使用公私鑰的算法是非對(duì)稱加密算法),來(lái)加密我們之間的通信內(nèi)容。別人因?yàn)椴恢?是我們的會(huì)話密鑰,因而無(wú)法解密。
好,復(fù)習(xí)一下:
1,SSL實(shí)現(xiàn)安全的通信
2,通信雙方使用一方或者雙方的公鑰來(lái)傳遞和約定會(huì)話密鑰 (這個(gè)過(guò)程叫做握手)
3, 雙方使用會(huì)話密鑰,來(lái)加密雙方的通信內(nèi)容
上面說(shuō)的是原理。大家可能覺(jué)得比較復(fù)雜了,實(shí)際使用中,比這還要復(fù)雜。不過(guò)慶幸的是,好心的先行 者們?cè)诓僮飨到y(tǒng)或者相關(guān)的軟件中實(shí)現(xiàn)了這層(Layer),并且起了一個(gè)難聽的名字叫做SSL,(Secure Socket Layer)。
通常做法是定義一個(gè)Servlet,并在web.xml中配置Servlet的啟動(dòng)順序<load-on-startup>的值在DispatcherServlet之后。但這樣做的缺點(diǎn)是在Servlet中無(wú)法使用Spring的依賴注入功能,只能使用WebApplicationContext的getBean()方法獲取bean。
找到的解決辦法如下:
1、自定義一個(gè)用于代理啟動(dòng)Servlet的類DelegatingServletProxy:
package com.test.common.util;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
public class DelegatingServletProxy extends GenericServlet {
private String targetBean;
private Servlet proxy;
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
proxy.service(arg0, arg1);
}
@Override
public void init() throws ServletException {
this.targetBean = getServletName();
getServletBean();
proxy.init(getServletConfig());
}
private void getServletBean() {
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
this.proxy = (Servlet)wac.getBean(targetBean);
}
}
2、編寫啟動(dòng)Servlet:
package com.test.common.util;
import java.io.IOException;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import cn.edu.swu.oa.agency.model.Department;
import cn.edu.swu.oa.agency.model.Group;
import cn.edu.swu.oa.agency.service.DepService;
import cn.edu.swu.oa.agency.service.GroService;
import cn.edu.swu.oa.common.model.SysCode;
import cn.edu.swu.oa.safe.model.User;
import cn.edu.swu.oa.safe.service.UserService;
/**
*
*
* 類型解釋:Spring啟動(dòng)完成后執(zhí)行初始化操作
* 類型表述:預(yù)讀某些實(shí)體的Key-Value,放入map,方便以后使用
* @author
* @version
*
*/
@Component("initialServlet")
public class InitialServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Resource
private UserService userService;
@Resource
private DepService depService;
@Resource
private GroService groService;
/**
* @see HttpServlet#HttpServlet()
*/
public InitialServlet() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
@Override
public void init(ServletConfig config) throws ServletException {
//初始化eserMap
List<User> users = userService.getUsers();
for(int i = 0; i < users.size(); i++) {
User user = users.get(i);
Integer userId = user.getUserId();
String userName = user.getUserName();
SysCode.userMap.put(userId, userName);
}
//初始化depMap
List<Department> deps = depService.getAllDeps();
for(int i = 0; i < deps.size(); i++) {
Department dep = deps.get(i);
Integer depId = dep.getDepId();
String depName = dep.getDepName();
SysCode.depMap.put(depId, depName);
}
//初始化groMap
List<Group> gros = groService.getAllGroups();
for(int i = 0; i < gros.size(); i++) {
Group gro = gros.get(i);
Integer groId = gro.getGroId();
String groName = gro.getGroName();
SysCode.groMap.put(groId, groName);
}
}
}
3、在web.xml文件中配置InitialServlet :
<servlet>
<description></description>
<display-name>InitialServlet</display-name>
<servlet-name>initialServlet</servlet-name>
<servlet-class>
com.test.common.util.DelegatingServletProxy
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>initialServlet</servlet-name>
<url-pattern>/InitialServlet</url-pattern>
</servlet-mapping>
完成這些操作后,就可以在Spring容器啟動(dòng)后執(zhí)行自定義的Servlet,并且在自定義Servlet中可以使用Spring Annotation的自動(dòng)注入功能。 <script></script>
package com.athrunwang.test;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TestTimer {
static int count = 0;
public static void showTimer() {
TimerTask task = new TimerTask() {
@Override
public void run() {
++count;
System.out.println("時(shí)間=" + new Date() + " 執(zhí)行了" + count + "次"); // 1次
}
};
// 設(shè)置執(zhí)行時(shí)間
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);// 每天
// 定制每天的21:09:00執(zhí)行,
calendar.set(year, month, day, 9, 54, 00);
Date date = calendar.getTime();
Timer timer = new Timer();
System.out.println(date);
int period = 2 * 1000;
// 每天的date時(shí)刻執(zhí)行task,每隔2秒重復(fù)執(zhí)行
timer.schedule(task, date, period);
// 每天的date時(shí)刻執(zhí)行task, 僅執(zhí)行一次
//timer.schedule(task, date);
}
public static void main(String[] args) {
showTimer();
}
}