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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容