教你如何優(yōu)雅的實(shí)現(xiàn)接口登錄限制

在項(xiàng)目開發(fā)時(shí)喇勋,大部分操作時(shí)都是基于用戶登錄狀態(tài)下的。攔截器是最經(jīng)常使用的方式偎行,這里我結(jié)合了自定義注解川背。https://github.com/XMUTLZY/login-check-demo

項(xiàng)目結(jié)構(gòu)

項(xiàng)目結(jié)構(gòu).png

Demo主要用Springboot搭建

  • vo包:定義了一個(gè)用戶實(shí)體類
  • annotation包:存放自定義的注解
  • config包:配置類贰拿,主要用于初始化攔截器
  • controller包:一些操作,比如登錄校驗(yàn)熄云、訪問(wèn)主頁(yè)
  • interceptor包:定義攔截器

具體實(shí)現(xiàn)

自定義注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Created by lin on 2020/04/10
 */
@Target(ElementType.METHOD) //標(biāo)記在方法上
@Retention(RetentionPolicy.RUNTIME) //生命周期(運(yùn)行時(shí)有效)
public @interface LoginRequired {
}

這里主要用到2個(gè)元注解膨更,其中@Target和@Retention有多個(gè)枚舉型可以設(shè)置,具體看源碼缴允。

攔截器
import org.springframework.util.StringUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import redis.clients.jedis.Jedis;
import sch.jake.logincheckdemo.web.annotation.LoginRequired;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;

/**
 * Created by lin on 2020/04/10
 * @Tip: 登錄校驗(yàn)攔截器
 */
public class LoginInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (!(handler instanceof HandlerMethod)) {  //判斷處理請(qǐng)求的handler類型
            return true;
        }
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();  //獲取處理請(qǐng)求的方法
        if (method.getAnnotation(LoginRequired.class) != null) {    //判斷該方法上是否有自定義的注解
            Jedis jedis = new Jedis("127.0.0.1", 6379);
            String userJsonStr = jedis.get("USER_INFO");
            if (!StringUtils.hasText(userJsonStr)) {    //判斷緩存中是否有用戶數(shù)據(jù)
                return false;
            }
        }
        return true;
    }
}

簡(jiǎn)單來(lái)說(shuō)就是荚守,攔截器攔截請(qǐng)求,當(dāng)注解標(biāo)記在該請(qǐng)求方法上時(shí)练般,查詢緩存中是否有用戶信息矗漾。

配置類
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import sch.jake.logincheckdemo.web.interceptor.LoginInterceptor;

/**
 * Created by lin on 2020/04/10
 * @Tip: 配置類,用于初始化攔截器
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor());
    }

    @Bean
    public LoginInterceptor loginInterceptor() {
        return new LoginInterceptor();
    }
}

這里就是初始化攔截器踢俄,并注冊(cè)到配置中缩功。

Controller
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import redis.clients.jedis.Jedis;
import sch.jake.logincheckdemo.vo.User;
import sch.jake.logincheckdemo.web.annotation.LoginRequired;

/**
 * Created by lin on 2020/04/10
 */
@Controller
public class TestController {

    //登錄校驗(yàn)(成功時(shí)在緩存中存放用戶信息)
    @PostMapping("/verify")
    @ResponseBody
    public String verify(@RequestBody User user) {
        if ("Jake.lin".equals(user.getUserName()) && "test123".equals(user.getPassword())) {
            Jedis jedis = new Jedis("127.0.0.1", 6379);
            String userJsonStr = JSONObject.toJSONString(user);
            jedis.set("USER_INFO", userJsonStr);
            return "success";
        }
        return "failure";
    }

    //進(jìn)入主頁(yè)
    @GetMapping("/index")
    @LoginRequired
    public String index() {
        return "index.html";
    }
}

這里主要定義了兩個(gè)方法晴及。
(1)當(dāng)用戶調(diào)用/verify接口時(shí)都办,如果用戶密碼輸入正確,將用戶信息序列化之后存入Redis緩存中虑稼。
(2)自定義注解標(biāo)記在index()方法琳钉,表示當(dāng)訪問(wèn)該方法時(shí),會(huì)對(duì)登錄狀態(tài)進(jìn)行校驗(yàn)(因?yàn)橹耙呀?jīng)定義過(guò)攔截器對(duì)方法上是否存在自定義注解進(jìn)行判斷)

總結(jié)

這樣當(dāng)用戶請(qǐng)求的操作需要登錄狀態(tài)時(shí)蛛倦,只需要在對(duì)應(yīng)請(qǐng)求的方法上添加注解即可歌懒。這里我使用的是Redis替代了session的功能,意思一樣

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末溯壶,一起剝皮案震驚了整個(gè)濱河市及皂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌且改,老刑警劉巖验烧,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異又跛,居然都是意外死亡碍拆,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門慨蓝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)感混,“玉大人,你說(shuō)我怎么就攤上這事礼烈』÷” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵此熬,是天一觀的道長(zhǎng)庭呜。 經(jīng)常有香客問(wèn)我洽蛀,道長(zhǎng),這世上最難降的妖魔是什么疟赊? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任郊供,我火速辦了婚禮,結(jié)果婚禮上近哟,老公的妹妹穿的比我還像新娘驮审。我一直安慰自己,他們只是感情好吉执,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布疯淫。 她就那樣靜靜地躺著,像睡著了一般戳玫。 火紅的嫁衣襯著肌膚如雪熙掺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天咕宿,我揣著相機(jī)與錄音币绩,去河邊找鬼。 笑死府阀,一個(gè)胖子當(dāng)著我的面吹牛缆镣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播试浙,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼董瞻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了田巴?” 一聲冷哼從身側(cè)響起钠糊,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎壹哺,沒(méi)想到半個(gè)月后抄伍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斗躏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年逝慧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啄糙。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡笛臣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出隧饼,到底是詐尸還是另有隱情沈堡,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布燕雁,位于F島的核電站诞丽,受9級(jí)特大地震影響鲸拥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜僧免,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一刑赶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧懂衩,春花似錦撞叨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至法希,卻和暖如春枷餐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背苫亦。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工毛肋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人著觉。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓村生,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親饼丘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容