springMVC中使用自定義注解判斷用戶是否登錄

??在我們做一個項目時,經(jīng)常會遇見一個問題,那就是,在用戶進行某些請求時,需要判斷用戶是否已經(jīng)登錄,比如在購物項目中用戶必須登錄過后才能進行購物,還有博客的留言或者評論系統(tǒng)也是一樣的.
??在java中注解的應(yīng)用非常廣泛,如今的各種框架中都少不了使用大量的注解,這次,就是使用一個自定義的注解來實現(xiàn)判斷使用是否登錄.
??開發(fā)環(huán)境:idea+maven+mysql+jdk1.8,采用了ssm框架
??總體的結(jié)構(gòu)圖:
??

Selection_010.png

??在這里主要介紹自定義注解的實現(xiàn),其他的代碼我就直接貼出來

User.java

package com.summer.interceptor.entities;

import lombok.Data;

/**
 * @Author: summer
 * @Mail: lijiahaosummer@gmail.com
 * @Date: 2018 18-3-31 下午6:32
 * Project: LoginInterceptor
 * Package: com.summer.interceptor.entities
 * Desc:
 */
@Data
public class User {
    private int id;
    private String username;
    private String password;
}

UserDao.java

package com.summer.interceptor.dao;

import com.summer.interceptor.entities.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @Author: summer
 * @Date: 2018 18-3-31 下午6:43
 * @Project: LoginInterceptor
 */
public interface UserDao {
    public User getUserByNameAngPasw(@Param("username") String username,
                                     @Param("password") String password);
    public List<User> getAllUsers();
}

UserServiceImpl.java

package com.summer.interceptor.service.impl;

import com.summer.interceptor.dao.UserDao;
import com.summer.interceptor.entities.User;
import com.summer.interceptor.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @Author: summer
 * @Mail: lijiahaosummer@gmail.com
 * @Date: 2018 18-3-31 下午6:54
 * Project: LoginInterceptor
 * Package: com.summer.interceptor.service.impl
 * Desc:
 */
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
    
    @Override
    public User getUserByNameAngPassw(String username, String password) {
        return userDao.getUserByNameAngPasw(username, password);
    }

    @Override
    public List<User> getAllUsers() {
        return userDao.getAllUsers();
    }
}

下面是實現(xiàn)自定義注解的主要代碼
首先我們需要創(chuàng)建一個注解類

package com.summer.interceptor.loginInterceptor;

import java.lang.annotation.*;

/**
 * @Author: summer
 * @Date: 2018 18-4-1 下午12:28
 * @Project: LoginInterceptor
 */
@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface IsCheckUserLogin {
    boolean check() default false;
}

在這個注解類中,有四個元注解,他們?nèi)缦滤?/p>

@Target:
    表示該注解可以用于什么地方,可能的ElementType參數(shù)有:
    CONSTRUCTOR:構(gòu)造器的聲明
    FIELD:域聲明(包括enum實例)
    LOCAL_VARIABLE:局部變量聲明
    METHOD:方法聲明
    PACKAGE:包聲明
    PARAMETER:參數(shù)聲明
    TYPE:類、接口(包括注解類型)或enum聲明
    
@Retention
    表示需要在什么級別保存該注解信息。可選的RetentionPolicy參數(shù)包括:
    SOURCE:注解將被編譯器丟棄
    CLASS:注解在class文件中可用,但會被VM丟棄
    RUNTIME:VM將在運行期間保留注解,因此可以通過反射機制讀取注解的信息
    
@Document
    將注解包含在Javadoc中
    
@Inherited
    允許子類繼承父類中的注解

??其實,現(xiàn)在自定義注解已經(jīng)完成了,已經(jīng)可以在一個方法中使用該注解了,但是現(xiàn)在的注解是沒有功能的,而完成驗證用戶是否登錄的功能的是一個自定義的攔截器
然后自定義了一個攔截器類,用來實現(xiàn)具體的功能
CheckUserLoginInterceptor.java

package com.summer.interceptor.loginInterceptor;

import com.summer.interceptor.entities.User;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * @Author: summer
 * @Mail: lijiahaosummer@gmail.com
 * @Date: 2018 18-4-1 下午12:29
 * Project: LoginInterceptor
 * Package: com.summer.interceptor.loginInterceptor
 * Desc:
 */
public class CheckUserLoginInterceptor extends HandlerInterceptorAdapter {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        IsCheckUserLogin auth = handlerMethod.getMethodAnnotation(IsCheckUserLogin.class);
    
        /**
         * 如果在controller中的方法沒有使用IsCheckUserLogin注解或者check=false,
         * 就不需要判斷在請求時用戶是否已經(jīng)登錄.
         */
        if (auth == null || !auth.check()) {
            return true;
        }
    
        HttpSession session = request.getSession();
        User user = (User) session.getAttribute("user");     //判斷用戶是否登錄,如果user==null,則沒有登錄
        if (user != null) {
            return true;
        } else {
            System.out.println("沒有登錄,跳轉(zhuǎn)到登錄頁面");
            request.getRequestDispatcher("WEB-INF/views/login.jsp").forward(request, response);
            return false;
        }
    }
}

然后在springMVC.xml文件中添加攔截器

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/*.do"/>
        <bean class="com.summer.interceptor.loginInterceptor.CheckUserLoginInterceptor"/>
    </mvc:interceptor>

自定義注解已將全部完成了,現(xiàn)在就可以在方法中使用了,比如在controller類中的方法使用

package com.summer.interceptor.controller;

import com.summer.interceptor.entities.User;
import com.summer.interceptor.loginInterceptor.IsCheckUserLogin;
import com.summer.interceptor.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * @Author: summer
 * @Mail: lijiahaosummer@gmail.com
 * @Date: 2018 18-3-31 下午6:24
 * Project: LoginInterceptor
 * Package: PACKAGE_NAME
 * Desc:
 */
@Controller
public class UserController {
    @Autowired
    private UserService userService;
    @Resource
    private HttpServletRequest request;

    @IsCheckUserLogin(check = true)
    @RequestMapping(value = "showAllUsers.do")
    public ModelAndView showAllUsers() {
        ModelAndView modelAndView = new ModelAndView("showAllUsers");
        List<User> userList = userService.getAllUsers();
        modelAndView.addObject("userList", userList);
        return modelAndView;
    }

    @RequestMapping(value = "doLogin.do", method = RequestMethod.POST)
    public String login(String username, String password) {
        User user = userService.getUserByNameAngPassw(username, password);
        if (user == null) {
            return "fail";
        } else {
            request.getSession().setAttribute("user", user);
            return "success";
        }
    }

    @RequestMapping("login.do")
    public String toLoginPage() {
        return "login";
    }
}
在這個controller類中,就是只有showAllUsers方法使用了自定義注解,其他的方法沒有使用,以為著在請求showAllUsers.do時,會判斷用戶是否登錄請求其他的就不會進行判斷

最后,附上我的整個工程吧
https://github.com/yu-summer/project

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,115評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,577評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,514評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,234評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,621評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,822評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,380評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,128評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,319評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,548評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,970評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,229評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,048評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,285評論 2 376

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,694評論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,810評論 18 139
  • 2018.1.31 月末反思 1.31 1月的最后一天,從前只感嘆時間過得快,真似流水般淌過,毫無聲息。如今跟著萌...
    陸嫻1983閱讀 156評論 0 0
  • 一周的學(xué)習(xí)很快就結(jié)束了!在踏上返程的車上翻看著這些天的筆記:沒有愛就沒有教育,沒有興趣就沒有學(xué)習(xí);一個教師改...
    枧文閱讀 407評論 0 3
  • angular 默認(rèn)數(shù)據(jù)改為單向綁定 數(shù)據(jù)綁定 插值表達(dá)式 使用方括號將HTML標(biāo)簽的一個熟悉綁定到一個表達(dá)式 使...
    喝不醉再來閱讀 336評論 0 0