1. 基于Session的登录验证
基于Session的登录验证方式是最简单的一种登录校验方式。
为啥能用Session作为登录验证的一种方式,因为每个用户的请求都会有一个Session,这个对象是Servlet
给我们创建的,不需要我们手动创建,并且这个对象的作用域为整个Web
页面,也就是在整个项目中,这个Session
可以存储一些内容,相当于全局缓存,并且这个Session
有默认的过期时间,默认为30
分钟,使得保存到Session
对象中的值,可以在各个Web
页面中共享。因此,我们可以利用这个特性保存用户的登录信息。我们可以编写一个拦截器,在拦截器中通过request
对象获取Session
对象,然后根据Key
值获取到Value
值,类似于Map
集合,获取到值后和数据库进行比对,如果用户名和密码一致就放行,否则拦截。
下面是具体的代码:通过请求登录接口校验输入的用户名和密码是否正确,如果正确就把这个用户信息保存到Session
对象中。
package com.ukefu.characterglm.controller;
import cn.hutool.crypto.SecureUtil;
import com.ukefu.characterglm.entity.User;
import com.ukefu.characterglm.service.UserService;
import com.ukefu.characterglm.utils.BaseResponse;
import com.ukefu.characterglm.utils.ErrorCode;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* @author Luke Ewin
* @date 2024/2/4 14:07
* @blog blog.lukeewin.top
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/login")
public BaseResponse login(HttpServletRequest request, @RequestBody User user) {
if (user != null && StringUtils.isNotBlank(user.getName()) && StringUtils.isNotBlank(user.getPassword())) {
String name = user.getName();
String password = user.getPassword();
User tempUser = userService.login(name, SecureUtil.md5(password));
if (tempUser != null) {
Map<String, String> map = new HashMap<>();
map.put("id", String.valueOf(tempUser.getId()));
map.put("name", tempUser.getName());
map.put("email", tempUser.getEmail());
map.put("phone", tempUser.getPhone());
// 保存用户的登录状态
HttpSession session = request.getSession();
session.setAttribute("user", tempUser);
return BaseResponse.success(map);
} else {
return BaseResponse.error(ErrorCode.USERNAME_PASSWORD_ERROR);
}
}
return BaseResponse.error(ErrorCode.MISS_PARAMS);
}
}
拦截器:
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
if (user != null) {
return true;
}
request.getRequestDispatcher("/error/login").forward(request, response);
return false;
}
}
配置:把自定义的拦截器添加到容器内文章来源:https://www.toymoban.com/news/detail-829365.html
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/user/login", "/error/**");
}
}
这里需要注意:一定要记得放行/error/**
,否则会报错。文章来源地址https://www.toymoban.com/news/detail-829365.html
到了这里,关于Java中基于Session登录验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!