Ja基础及开发教程 3_第1页
Ja基础及开发教程 3_第2页
Ja基础及开发教程 3_第3页
Ja基础及开发教程 3_第4页
Ja基础及开发教程 3_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

登录模块实现项目4目录01登录接口02盐值加密03拦截器和过滤器04Token和Redis的基本使用05登录接口全流程4.1JavaWeb应用开发项目教程(SpringBoot+Mybatis)登录接口@ServicepublicclassUserServiceImplimplementsUserService{@ResourceprivateUserMapperuserMapper;publicReturnT<User>login(StringuserName,Stringpassword){try{

Useruser=userMapper.login(userName,password);List<User>listUser=userMapper.checkUserName(userName);if(listUser.isEmpty()){returnReturnT.Failed("账号不存在。");}elseif(user!=null){returnReturnT.Success(user);}else{returnReturnT.Failed("密码不正确。");}}catch(Exceptione){returnReturnT.Failed(e.getMessage());}}}任务4.1登录接口publicclassReturnRandom{publicstaticStringgetCheckCode(){Stringbase="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";intsize=base.length();Randomr=newRandom();StringBuffersb=newStringBuffer();for(inti=1;i<=4;i++){//产生0到size-1的随机值intindex=r.nextInt(size);//在base字符串中获取下标为index的字符charc=base.charAt(index);//将c放入到StringBuffer中去sb.append(c);}returnsb.toString();}}先检查用户名是否存在,再检查用户名和密码是否正确4.2JavaWeb应用开发项目教程(SpringBoot+Mybatis)盐值加密1.信息加密信息加密是指将信息转化为任何第三方都无法读懂,只有发送方和接收方能看懂的信息。2.BCrypt加密BCrypt是一个基于Blowfish加密算法的密码哈希函数,专门用于安全地存储密码。BCrypt生成的哈希值不是一个简单的二进制串,而是一个自包含的、格式化的字符串,它包含了所有需要验证未来密码的必要信息。任务4.2盐值加密3.盐值加密盐值加密是一种增强密码安全性的方法,通过添加随机盐值来生成独特的哈希值。盐是一个随机生成的字符串或数字,与原始密码结合在一起进行哈希运算。由于盐是随机生成的,即使两个用户使用相同的密码,他们的哈希值也会不同。因此,即使黑客获取到了存储的哈希值,没有相应的盐值也无法解密出原始密码。任务4.2盐值加密BCrypt算法的特点:1.自动加盐:BCrypt会自动生成并管理盐值,不需要手动处理。2.抗彩虹表攻击:每个密码都有唯一的盐值,即使相同密码也会生成不同的哈希值。3.可调节的计算成本:可以通过参数控制哈希计算的复杂度,抵御暴力破解。4.内置验证机制:matches()方法会自动提取存储的哈希值中的盐值进行验证。任务4.2盐值加密4.3JavaWeb应用开发项目教程(SpringBoot+Mybatis)拦截器和过滤器拦截器是Spring框架提供的核心功能之一,主要用来拦截请求,并对请求进行处理。在实际开发中,我们可以使用拦截器来实现一些常见的功能,比如权限校验、日志记录、参数校验等。任务4.3拦截器和过滤器-拦截器publicclassMyInterceptorimplementsHandlerInterceptor{

publicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{System.out.println("拦截器MyInterceptor------->1、请求之前调用,也就是controller方法调用之前。");returntrue;}

publicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,@NullableModelAndViewmodelAndView)throwsException{System.out.println("拦截器MyInterceptor------->2、请求之后调用,在视图渲染之前,也就是controller方法调用之后");}

publicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,@NullableExceptionex)throwsException{System.out.println("拦截器MyInterceptor------->3、请求结束之后被调用,主要用于清理工作。");}

}WebConfig.java文件,实现WebMvcConfigurer接口的配置类(使用了@Configuration注解的类),重写addInterceptors()方法,并在该方法中调用registry.addInterceptor()方法将自定义的拦截器注册到容器中。addPathPatterns()方法用于指定拦截路径,例如拦截路径为/**,表示拦截所有请求,包括对静态资源的请求。excludePathPatterns()方法用于排除拦截路径,即指定不需要拦截的请求。任务4.3拦截器和过滤器-拦截器@ConfigurationpublicclassMyMvcConfigimplementsWebMvcConfigurer{……@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){("注册拦截器");registry.addInterceptor(newLoginInterceptor()).addPathPatterns("/**")//拦截所有请求,包括静态资源文件.excludePathPatterns("/","/login","/index.html","/user/login","/css/**","/images/**","/js/**","/fonts/**");//放行登录页,登录操作,静态资源}}过滤器是一种用于Web应用程序的组件,作用是对请求和响应进行处理和转换。它主要用于拦截和处理HTTP请求,对请求进行预处理和过滤,然后将请求传递给下一个过滤器或处理程序。任务4.3拦截器和过滤器-过滤器publicclassMyFilterimplementsFilter{@Override//初始化方法,只调用一次publicvoidinit(FilterConfigfilterConfig)throwsServletException{System.out.println("init初始化方法执行了");}

@Override//拦截到请求之后调用,调用多次publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{System.out.println("doFilter拦截到了请求...放行前逻辑");//放行chain.doFilter(request,response);}

@Override//销毁方法,只调用一次publicvoiddestroy(){System.out.println("destroy销毁方法执行了");}}‌doFilter()方法可以实现定义过滤逻辑,实现权限控制、日志记录、数据转换等功能‌。‌1.拦截请求‌:在请求到达Servlet或响应返回客户端之前,Filter会拦截这些请求。开发者可以在doFilter方法中添加自定义的逻辑,如权限检查、日志记录等‌。‌2.处理响应‌:在服务器的响应发送回客户端之前,Filter可以处理这些响应,例如压缩响应内容、添加安全头等‌。‌3.过滤器链‌:多个Filter按配置顺序形成链式处理,请求依次通过每个Filter,响应则反向传递。这种机制确保了请求和响应的处理顺序和逻辑的灵活性‌。任务4.3拦截器和过滤器-过滤器@OverridepublicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{HttpServletRequestrequest=(HttpServletRequest)servletRequest;HttpServletResponseresponse=(HttpServletResponse)servletResponse;StringrequestURI=request.getRequestURI();//判断当前请求的URL是否在白名单中if(whiteList.contains(requestURI)){//如果在白名单中,则直接放行filterChain.doFilter(servletRequest,servletResponse);}else{//如果不在白名单中,则进行相应的处理,例如重定向到其他页面或返回错误信息}}4.4JavaWeb应用开发项目教程(SpringBoot+Mybatis)Token和Redis的基本使用1.基本定义Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌。当第一次登录成功后,服务器生成一个Token,同时将Token发送给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。2.工作流程(1)客户端使用用户名和密码请求登录;(2)服务端收到请求,验证用户名和密码;(3)验证成功后,服务端会签发一个Token,再把这个Token返回给客户端;(4)客户端收到Token后可以把它存储起来,比如放到Cookie中;(5)客户端每次向服务端请求资源时需要携带服务端签发的Token,可以在Cookie或者Header中携带;(6)服务端收到请求,然后去验证客户端请求里面带着的Token,如果验证成功,就向客户端返回请求数据。任务4.4

Token和Redis的基本使用Redis英文全称是RemoteDictionaryServer(远程字典服务),是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。常用方法如下。1.redisTemplate.hasKey(key)判断是否有key所对应的值,有则返回true,没有则返回false2.redisTemplate.opsForValue().get(key)取出key值所对应的值3.redisTemplate.delete(key)删除单个key值任务4.4

Token和Redis的基本使用4.设置过期时间publicBooleanexpire(Stringkey,longtimeout,TimeUnitunit){returnredisTemplate.expire(key,timeout,unit);}publicBooleanexpireAt(Stringkey,Datedate){returnredisTemplate.expireAt(key,date);}5.设置当前的key以及value值redisTemplate.opsForValue().set(key,value)6.设置当前的key以及value值并且设置过期时间redisTemplate.opsForValue().set(key,value,timeout,unit)任务4.4

Token和Redis的基本使用任务4.4

Token和Redis的基本使用-可视化连接界面任务4.4

Token和Redis的基本使用-存在数据和不存在数据4.5JavaWeb应用开发项目教程(SpringBoot+Mybatis)登录接口全流程1.用户登录用户登录成功,服务器会生成Token令牌,存储在服务器的Redis中并将其发送给客户端。2.客户端请求客户端在后续的请求中,将Token令牌携带在请求的Header中。3.服务器验证服务器在接收到请求后,会从请求的Header中获取Token令牌,和服务器Redis中的Token进行校验。4.授权访问在验证通过后,服务器会根据Token令牌中的用户数据,在过滤器中进行相应的授权操作,判断用户是否有权限访问请求的资源。如果授权通过,服务器会处理请求并返回相应的数据;如果授权不通过,则返回相应的错误信息。任务4.5登录接口全流程新建新闻表tb_news,并添加记录。本任务涉及user表和tb_news表。任务4.5登录接口全流程拦截器白名单为:/api/login、/api/logout、/api/register过滤器白名单为:/api/login、/api/logout、/api/registerpublicObjectlogin(StringuserName,Stringpassword){try{Useruser=userMapper.login(userName,password);List<User>listUser=userMapper.checkUserName(userName);if(listUser.isEmpty()){returnReturnT.Failed("账号不存在。");}elseif(user!=null){Stringtoken=createToken(user.getId());

Map<String,Object>map=newHashMap<>();map.put("code",200);map.put("msg","操作成功");map.put("token",token);returnmap;}else{returnReturnT.Failed("密码不正确。");}}catch(Exceptione){returnReturnT.Failed(e.getMessage());}}任务4.5登录接口全流程-UserServiceImpl.java文件中登录方法login()要返回Token值,所以将返回值类型定义为Object类型定义Object参数,并赋值//删除newsId的数据,需要判断newsId是否属于userIdpublicReturnT<News>deleteNews(StringnewsId,Stringtoken){try{intuserId=parseInt(redisClient.get(token));if(newsMapper.selectUserIdByNewsId(parseInt(newsId))==userId){newsMapper.deleteNews(parseInt(newsId));returnReturnT.Success();}returnReturnT.Failed("您没有权限");}catch(Exceptione){returnReturnT.Failed(e.getMessage());}}任务4.5登录接口全流程-NewsServiceImpl.java文件中登录方法deleteNews()被删除的新闻属于哪个用户登录用户@OverridepublicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{System.out.println("========do过滤器========");HttpServletRequestrequest=(HttpServletRequest)serv

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论