java 判断用户是否登陆_springMVC中使用自定义注解判断用户是否登录

在我们做一个项目时,经常会遇见一个问题,那就是,在用户进行某些请求时,需要判断用户是否已经登录,比如在购物项目中用户必须登录过后才能进行购物,还有博客的留言或者评论系统也是一样的.

在java中注解的应用非常广泛,如今的各种框架中都少不了使用大量的注解,这次,就是使用一个自定义的注解来实现判断使用是否登录.

开发环境:idea+maven+mysql+jdk1.8,采用了ssm框架

总体的结构图:

ccc40b3f1cd1

Selection_010.png

在这里主要介绍自定义注解的实现,其他的代码我就直接贴出来

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 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 getAllUsers() {

return userDao.getAllUsers();

}

}

下面是实现自定义注解的主要代码

首先我们需要创建一个注解类

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;

}

在这个注解类中,有四个元注解,他们如下所示

@Target:

表示该注解可以用于什么地方,可能的ElementType参数有:

CONSTRUCTOR:构造器的声明

FIELD:域声明(包括enum实例)

LOCAL_VARIABLE:局部变量声明

METHOD:方法声明

PACKAGE:包声明

PARAMETER:参数声明

TYPE:类、接口(包括注解类型)或enum声明

@Retention

表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括:

SOURCE:注解将被编译器丢弃

CLASS:注解在class文件中可用,但会被VM丢弃

RUNTIME:VM将在运行期间保留注解,因此可以通过反射机制读取注解的信息

@Document

将注解包含在Javadoc中

@Inherited

允许子类继承父类中的注解

其实,现在自定义注解已经完成了,已经可以在一个方法中使用该注解了,但是现在的注解是没有功能的,而完成验证用户是否登录的功能的是一个自定义的拦截器

然后自定义了一个拦截器类,用来实现具体的功能

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,

* 就不需要判断在请求时用户是否已经登录.

*/

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("没有登录,跳转到登录页面");

request.getRequestDispatcher("WEB-INF/views/login.jsp").forward(request, response);

return false;

}

}

}

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

自定义注解已将全部完成了,现在就可以在方法中使用了,比如在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 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时,会判断用户是否登录请求其他的就不会进行判断

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值