基於SpringBoot從零構建部落格網站 - 整合ehcache和開發註冊登入功能
對於程式中一些字典資訊、配置資訊應該在程式啟動時載入到快取中,用時先到快取中取,如果沒有命中,再到資料庫中獲取同時放到快取中,這樣做可以減輕資料庫層的壓力。目前暫時先整合ehcache快取,同時預留了整合redis和memcached的介面。
先開發兩個最基本的功能,就是註冊和登入,對於頁面幾乎就是直接用bootstrap的風格,目前沒有過多的設計。
1、整合ehcache
在spring boot中整合ehcache還是很方便的,首先新增依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.10.2</version> </dependency>
新增ehcache的配置檔案,ehcache.xml,即:
<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false" monitoring="autodetect" dynamicConfig="true"> <diskStore path="java.io.tmpdir" /> <!-- 系統臨時快取(十分鐘) --> <cache name="SystemTempCache" maxEntriesLocalHeap="0" maxEntriesLocalDisk="10000000" eternal="false" timeToIdleSeconds="0" timeToLiveSeconds="600" overflowToDisk="false" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" diskSpoolBufferSizeMB="30" memoryStoreEvictionPolicy="LRU"> </cache> <!-- 系統永久快取 --> <cache name="SystemEternalCache" maxEntriesLocalHeap="0" maxEntriesLocalDisk="10000000" eternal="true" overflowToDisk="false" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" diskSpoolBufferSizeMB="30" memoryStoreEvictionPolicy="LRU"> </cache> </ehcache>
其中設定了兩種快取型別,一個是臨時快取,另一個是永久快取。
此處使用快取方式不是基於註解的,雖然基於註解的方式也很方便,但是個人覺得還是自己程式控制快取好一些。
程式中會將站點的配置資訊載入到快取中,那麼使用方式如下:
(1)、首先定義一個快取介面,本程式中需要用到快取的,必須實現該介面,即:
package com.swnote.common.cache; /** * 快取介面 * * @author lzj * @since 1.0 * @date [2019-04-27] */ public interface ICache<T> { /** * 根據key獲取快取資料 * * @param key * @return */ public T get(Object key); /** * 存放快取資料 * * @param key * @param value */ public void put(Object key, T value); /** * 根據key移除內容 * * @param key */ public void remove(Object key); }
(2)、站點配置資訊快取ConfigCache,實現該介面,即:
package com.swnote.common.cache;
import com.swnote.common.domain.Config;
import com.swnote.common.service.IConfigService;
import com.swnote.common.util.Const;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.List;
/**
* 快取配置資訊
* 配置資訊放到系統永久快取中,存放形式為:"_CONFIG" + configId為key,value為配置資訊物件
*
* @author lzj
* @since 1.0
* @date [2019-04-27]
*/
@Slf4j
@DependsOn("configService")
@Component("configCache")
public class ConfigCache implements ICache<Config> {
/**
* 注入基於Spring提供的Cache介面例項,預設由Ehcache實現
* TODO 以後也可以是Redis、Memcached提供實現
*/
@Autowired
private CacheManager cacheManager;
@Autowired
private IConfigService configService;
/**
* 系統臨時快取例項
*/
private Cache cache;
/**
* key的字首
*/
private String keyPrefix = "_CONFIG";
@PostConstruct
public void init() {
// 獲取系統永久快取例項
cache = cacheManager.getCache(Const.CACHE_SYSTEM_ETERNAL);
log.info("獲取系統永久快取例項");
log.info("開始載入所有配置資訊");
List<Config> configs = configService.list();
if (configs != null && !configs.isEmpty()) {
configs.stream().forEach(config -> cache.put(keyPrefix + config.getConfigId(), config));
}
log.info("載入完畢所有配置資訊");
}
@Override
public Config get(Object key) {
Cache.ValueWrapper valueWrapper = cache.get(keyPrefix + key);
if (valueWrapper == null) {
// 此時從資料庫重新載入一次
Config config = configService.getById((String) key);
if (config == null) {
return null;
}
// 再次放到快取中
cache.put(keyPrefix + config.getConfigId(), config);
return config;
}
return (Config) valueWrapper.get();
}
@Override
public void put(Object key, Config value) {
cache.put(keyPrefix + key, value);
}
@Override
public void remove(Object key) {
cache.evict(keyPrefix + key);
}
}
2、註冊功能
註冊頁面效果如下:
頁面風格很素,這個暫時先這樣。
主要看一下UserController中處理註冊資訊的關鍵程式碼,即:
/**
* 儲存註冊資訊
*
* @param model
* @param request
* @return
*/
@RequestMapping(value = "/auth/signup", method = RequestMethod.POST)
@ResponseBody
public Result signup(Model model, HttpServletRequest request) {
Result result = new Result();
try {
// 接收引數
String name = request.getParameter("name");
String email = request.getParameter("email");
String password = request.getParameter("password");
// 簡單校驗
if (StringUtils.isEmpty(name) || StringUtils.isEmpty(email) || StringUtils.isEmpty(password)) {
throw new TipException("缺少必要請求引數");
}
if (!StringUtil.isEmail(email)) {
throw new TipException("郵箱不符全規範");
}
// 校驗使用者名稱
User tempUser = userService.getByName(name);
if (tempUser != null && !StringUtils.isEmpty(tempUser.getUserId())) {
throw new TipException("該使用者已經註冊了");
}
// 校驗郵箱
tempUser = userService.getByEmail(email);
if (tempUser != null && !StringUtils.isEmpty(tempUser.getUserId())) {
throw new TipException("該郵箱已經註冊了");
}
// 獲取使用者ip
String ip = HttpUtil.getIpAddr(request);
// 構建使用者資訊
User user = new User();
user.setLoginName(name);
user.setEmail(email);
user.setPassword(StringUtil.md5(password));
user.setCreateIp(ip);
// 儲存使用者資訊
boolean flag = userService.create(user);
if (!flag) {
throw new TipException("使用者建立失敗");
}
result.setCode(Result.CODE_SUCCESS);
result.setMsg("使用者建立成功");
} catch (Exception e) {
log.error("使用者建立失敗", e);
result.setCode(Result.CODE_EXCEPTION);
result.setMsg("使用者建立失敗");
}
return result;
}
在UserService中有一個create方法,即:
@Override
public boolean create(User user) {
// 獲取當前時間
Date now = new Date();
// 設定主鍵
user.setUserId(IdGenarator.guid());
// 設定未實名認證
user.setRealStatus(User.REAL_STATUS_NO);
// 使用者是否需要啟用
Config config = configCache.get(Const.CONFIG_USER_ACTIVE);
if (config != null && "1".equals(config.getConfigValue())) {
// TODO 傳送啟用郵件資訊
// 說明需要啟用
user.setIsActive(User.ACTIVE_NO);
} else {
// 說明不需要啟用,預設啟用
user.setIsActive(User.ACTIVE_YES);
}
// 設定啟用賬號狀態
user.setStatus(User.STATUS_YES);
// 設定建立時間
user.setCreateTime(now);
// 設定關注數為0
user.setFollows(0);
// 設定粉絲數為0
user.setFans(0);
return save(user);
}
此處有一個還沒有實現的功能,就是傳送啟用郵件資訊,這個功能後面會補上,這裡先處於TODO狀態。
3、登入功能
登入頁面效果如下:
UserController中關鍵的程式碼如下:
/**
* 處理登入資訊
*
* @param request
* @return
*/
@RequestMapping(value = "/auth/login", method = RequestMethod.POST)
@ResponseBody
public Result login(HttpServletRequest request, HttpSession session) {
Result result = new Result();
try {
// 接收引數
String name = request.getParameter("name");
String password = request.getParameter("password");
if (StringUtils.isEmpty(name) || StringUtils.isEmpty(password)) {
throw new TipException("缺少必要請求引數");
}
// 獲取使用者ip
String ip = HttpUtil.getIpAddr(request);
User user = userService.verifyUser(name, password, ip);
if (user == null) {
throw new TipException("使用者名稱或密碼錯誤");
}
// 放置session資訊
session.setAttribute(Const.SESSION_USER, user);
// TODO 還有一些相關統計資訊,後面再加上
result.setCode(Result.CODE_SUCCESS);
result.setMsg("登入成功");
} catch (TipException e) {
result.setCode(Result.CODE_EXCEPTION);
result.setMsg(e.getMessage());
} catch (Exception e) {
log.error("登入失敗", e);
result.setCode(Result.CODE_EXCEPTION);
result.setMsg("登入失敗");
}
return result;
}
當用戶登入時,還有一些相關統計資訊,這裡由於其它功能還沒有開發完,所以獲取統計資訊的程式碼後面再加上。
關注我
以你最方便的方式關注我:
微信公眾號:
相關推薦
基於SpringBoot從零構建部落格網站 - 整合ehcache和開發註冊登入功能
對於程式中一些字典資訊、配置資訊應該在程式啟動時載入到快取中,用時先到快取中取,如果沒有命中,再到資料庫中獲取同時放到快取中,這樣做可以減輕資料庫層的壓力。目前暫時先整合ehcache快取,同時預留了整合redis和memcached的介面。 先開發兩個最基本的功能,就是註冊和登入,對於頁面幾乎就是直接用bo
基於SpringBoot從零構建部落格網站 - 整合editor.md開發釋出文章功能
釋出文章功能裡面最重要的就是需要整合富文字編輯器,目前富文字編輯器有很多,例如ueditor,CKEditor、editor.md等。這裡守望部落格裡面是整合的editor.md,因為editor.md是markdown格式,目前markdown由於簡潔好用,在各種雲筆記、github等中得到了廣泛使用。 1
基於SpringBoot從零構建部落格網站 - 開發設定主頁標識和修改個人資訊功能
由於守望部落格系統中支援由使用者自己設定個人主頁的URL的後半段,所以必須要使用者設定該標識的功能,而且是使用者註冊登入之後自動彈出的頁面,如果使用者沒有設定該標識,其它的操作是不能夠操作的,同時要求主頁標識只能設定一次。 使用者註冊時只是填寫了簡單的登入資訊,所以使用者登入後,可以設定個人詳細的資訊,也即修
基於SpringBoot從零構建部落格網站 - 設計可擴充套件上傳模組和開發修改頭像密碼功能
上傳模組在web開發中是很常見的功能也是很重要的功能,在web應用中需要上傳的可以是圖片、pdf、壓縮包等其它型別的檔案,同時對於圖片可能需要回顯,對於其它檔案要能夠支援下載等。在守望部落格系統中對於上傳模組進行統一管理,同時對於上傳不同的型別檔案,留有自定義實現機制的介面,也即可擴充套件。 基於上傳模組機制
基於SpringBoot從零構建部落格網站 - 新增建立、修改、刪除專欄功能
守望部落格是支援建立專欄的功能,即可以將一系列相關的文章歸檔到專欄中,方便使用者管理和查閱文章。這裡主要講解專欄的建立、修改和刪除功能,至於專欄還涉及其它的功能,例如關注專欄等後續會穿插著介紹。 1、建立專欄 接收和處理專欄相關功能的操作的方法會放在GroupController類中,首先建立專欄的頁面為:
基於SpringBoot從零構建博客網站 - 確定需求和表結構
簡單 order itl long tab 轉載 href 保存文件 存儲 要確定一個系統的需求,首先需要明確該系統的用戶有哪些,然後針對每一類用戶,確定其需求。對於博客網站來說,用戶有3大類,分別是: 作者,也即是註冊用戶 遊客,也即非註冊用戶 管理員,網站維護人員
SpringBoot之從零搭建部落格網站(可提供原始碼)
文字不夠,圖片來湊。 前言 為什麼想要搭建這個部落格? 我還記得,在大二寒假的某天,同往常一樣的在家解決這某個bug,不停地問度娘,很巧的碰到了一個同行在他的部落格中完美的記錄了我的bug的解決方案,隨後我又看了看他寫的其他部落格文章,覺得都非常的不錯,並
基於雲端儲存的個人部落格網站的設計與實現
**基於雲端儲存的個人部落格網站的設計與實現** 基於雲端儲存的個人部落格網站的設計與實現mysql資料庫建立語句 基於雲端儲存的個人部落格網站的設計與實現oracle資料庫建立語句 基於雲端儲存的個人部落格網站的設計與實現sqlserver資料庫建立語句 基於雲端
基於Bmob從零開始寫一個部落格小程式
實現以下技能點 1、整合Bmob小程式SDK作為資料儲存 2、wemark解析markdown文字 3、列表頁佈局與上拉無限載入 實現的效果 一、建立Bmob應用 進入Bmob官網:http://bmob.cn/,註冊一個賬號,免費的賬號可以建立8個子應用,每個應用單表列數是20列,如要購買付費,可以分
使用LAMP建立基於wordpress的個從部落格網站
參考: http://blog.csdn.net/ck_boss/article/details/27866117 一、mysql配置 1、安裝mysql yum install mysql-server CentOS中已經預設安裝,此步驟忽略。 2、啟動mysql
從零到一快速搭建個人部落格網站(域名備案 + https免費證書)(一)
## 前言 為什麼選擇搭建個人部落格?一方面是各個平臺經常下架原創文章,另一個方面是為了熟悉整個建站流程。 通過搭建個人部落格,我們可以自由的
從0開始使用python flask編寫部落格網站(2)
好了上一篇文章中搭建好了完整的框架,以及可以訪問一個“hello world”頁面了。現在繼續完善我們的部落格程式。 1.如法炮製,繼續完善error和admin的路由。 首先寫把404和500的網頁寫好放到templates/errors中。然後在error的資料夾中新建handlers.py 檔案,在
(七)基於SSM+Redis+Nginx+FastDFS的部落格網站
本篇介紹FastDFS,無需整合spring即可使用,前端上傳圖片到控制層,控制層呼叫fastDFS工具類實現上傳,上傳成功返回檔案地址到前端。 配置檔案為fast_client.conf,fastDFS要求使用的檔名和屬性名,要一致。 tracker_server =
(一)基於SSM+Redis+Nginx+FastDFS的部落格網站
這篇部落格介紹的是自我用了SSM(spring、SpringMVC和Mybatis)後,基於一個前端模板做的一個網站。由於自己比較喜歡做分散式架構的網站,所以就基於自己現有所學的技術實現某些功能,當然肯定有很多可以改進的地方。基本框架用的是SSM,資料庫用的是MYSQL,快取用
(三)基於SSM+Redis+Nginx+FastDFS的部落格網站
上一篇主要介紹了SSM整合以及測試。 這一篇主要介紹登入模組,登入模組用到了過濾器,配置過濾器時需要在web.xml裡面進行配置,相關配置已經在第二篇的web.xml有註明。 本篇涉及的類有:控制層的LoginController、過濾器CheckLoginFilte
(五)基於SSM+Redis+Nginx+FastDFS的部落格網站
上一篇介紹了redis的相關使用,這一篇介紹本專案使用的圖片儲存時用到的技術——FastDFS。專案使用時參考的是傳智播客裡的FastDFS的使用教程。由於只有文件沒有地址,所以就直接黏貼過來,若有版權問題請告知,謝謝。 1 課程目標
(六)基於SSM+Redis+Nginx+FastDFS的部落格網站
上一篇介紹了FastDFS。 這一篇開始介紹redis和FastDFS在本專案中是如何使用的。首先介紹redis Jedis工具類介面 package com.tdrip.dao; public interface JedisClient { //redis get方法 :
(四)基於SSM+Redis+Nginx+FastDFS的部落格網站
Redis是用C語言開發的一個開源的高效能鍵值對(key-value)資料庫。它通過提供多種鍵值資料型別來適應不同場景下的儲存需求,目前為止Redis支援的鍵值資料型別如字串型別、雜湊型別、列表型別、集合型別、有序集合型別。 菜鳥教程裡有基本的使用命令:點選開啟連結
(二)基於SSM+Redis+Nginx+FastDFS的部落格網站
上一篇簡單介紹了該網站的所用的框架、技術之類,這篇就開始講搭建過程。本篇為配置檔案。 其中redis和fastdfs的後續用到時再寫。 一、搭建基礎框架SSM之配置檔案 maven工程的pom.xml,基
從0開始使用python flask編寫部落格網站(1)
在學完flask教程時候,總是會遇到難以自己寫專案的問題。在第一次看狗書的時候,作者從單檔案馬上就到了多檔案的專案組織,當時也是仔細看,慢慢打程式碼才漸漸的明白了flask的專案組織方法,當明白了又感覺很簡單。。使用中多思考多打程式碼才能日有所得,願你我共同成長、 1. 編寫專案骨架 一個部落格網站需