13,837
社区成员




后端登录权限控制主要就是检查与拦截,主要有两种实现手段:
servlet自带的filter过滤器
spring提供的interceptor拦截器
这里主要讲interceptor拦截器实现(其实原理都一样)。
JavaWeb中有四大域 page request session application ,用户登录的数据主要在session域中储存,session域作用范围的一次会话,就是指从你浏览器打开一个页面,中间不管你在页面上访问了多少数据,到浏览器与后台断开连接为止。
1.首先得有登录功能,在controller层编写:
@ResponseBody
@RequestMapping("/login")
public Result<String> backgroundLogin(@RequestBody Administrator administrator, HttpServletRequest request){
//先根据传来的用户名查询数据库
LambdaQueryWrapper<Administrator> queryWrapper = new LambdaQueryWrapper<>();
String backgroundUsername = administrator.getBackgroundUsername();
queryWrapper.eq(Administrator::getBackgroundUsername, backgroundUsername);
Administrator _administrator = administratorService.getOne(queryWrapper);
//数据库中储存md5加密的密码 先将传来的密码加密
String password = DigestUtils.md5DigestAsHex(administrator.getBackgroundPassword().getBytes());
String _password = _administrator.getBackgroundPassword();
if (password.equals(_password))
{
//重点在这一步
request.getSession().setAttribute("administrator",backgroundUsername);
return Result.success("登录成功");
} else{
return Result.error("登录失败");
}
}
这里我把前端传回的用户信息封装在实体类Administrator中,在数据库核对无误后,使用
request.getSession().setAttribute("administrator",backgroundUsername);将登录的用户信息储存在session域中。
2.编写拦截器,目的是拦截请求,只对已登录的用户放行
@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object administrator = request.getSession().getAttribute("administrator");
boolean b = administrator != null;
if(b){
return true;
}else {
response.sendRedirect("/background");
return false;
}
}
}
拦截器会检查此时session域中是否有administrator字段信息,如果有就放行,如果没有则拦截(我这里会重定向到后台登录页面)
3.配置拦截器
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
@Autowired
LoginInterceptor loginInterceptor;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/background/**")
.excludePathPatterns("/background","/background/login");
}
}
写一个配置类继承WebMvcConfigurationSupport,重写里面的addInterceptors方法,配置拦截器的拦截范围和放行范围。
我这里会对所有以/background开头的请求拦截,其中放行"/background","/background/login"两个特定登录请求
三步做完就大功告成了,可以启动程序试一下,在没有登录的情况下直接访问拦截器管理的页面,是访问不到的。