当前位置: 首页 > wzjs >正文

长阳网站建设重庆规模最大的建网站公司

长阳网站建设,重庆规模最大的建网站公司,wordpress Honey 主题,深圳网站建设(信科网络)JavaWeb学习记录 2025.02.27 学习小总结 今天主要看的是登录验证这个板块,认识了三个登录会话技术,两个登录校验的方法,以及SpringAOP的入门案例。 登录校验 学习的三个会话技术分别是:Cookie,Session和令牌技术&a…

JavaWeb学习记录

2025.02.27 学习小总结

今天主要看的是登录验证这个板块,认识了三个登录会话技术,两个登录校验的方法,以及SpringAOP的入门案例。

登录校验

学习的三个会话技术分别是:Cookie,Session和令牌技术,主要使用的还是令牌技术,另外两个技术大概了解了一下,这里就不赘述了。

学习的令牌技术是JWT令牌技术,目前应用的比较广泛,JWT令牌由三个部分组成

  1. 头部:(typ:标识令牌的类型 ,alg:使用的签名算法)

  2. 有效载荷 :有效载荷包含了声明,声明是关于实体以及其他数据的声明,写的案例是关于校验登陆的案例,所以令牌里面携带的是id(唯一值)和用户名

  3. 签名:为了防止数据被篡改,JWT需要使用密钥进行签名,密钥是由服务器端自己提供的

下面的代码就是关于JWT的使用:生成JWT令牌和解析JWT令牌,里面还可以添加上过期时间

public class JwtUtils {private static String signKey = "SVRIRUlNQQ==";private static Long expire = 43200000L;/*** 生成JWT令牌* @return*/public static String generateJwt(Map<String,Object> claims){String jwt = Jwts.builder().addClaims(claims).signWith(SignatureAlgorithm.HS256, signKey).setExpiration(new Date(System.currentTimeMillis() + expire)).compact();return jwt;}/*** 解析JWT令牌* @param jwt JWT令牌* @return JWT第二部分负载 payload 中存储的内容*/public static Claims parseJWT(String jwt){Claims claims = Jwts.parser().setSigningKey(signKey).parseClaimsJws(jwt).getBody();return claims;}
}

JWT令牌会储存在每一个请求的token里面,会一直携带着,可以根据这个特点来进行登陆校验的功能。但是因为一个案例中的控制层和服务层的方法有很多。不可能在每一个方法中都添加上校验,这样特别的麻烦,于是就有了过滤器和拦截器。

过滤器可以拦截所有的请求,浏览器发送请求的时候回先到达过滤器,如果通过验证,过滤器就放行,再到控制层,服务层和数据持久层。然后返回的时候,也会经过过滤器,再返回到浏览器。所以可以在过滤器中解析令牌,判断该请求是否合法。

下面是代码示例:

@Slf4j
@WebFilter("/*")
public class TokenFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//1.首先将协议转化为HTTP类型的协议HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;//2.获取请求路径String requestURI = request.getRequestURI();//3.判断路径中是否包含登录请求,如果是就放行if(requestURI.contains("login")){filterChain.doFilter(request,response);return;}//4.获取请求头,判断是否为空,为空就响应401状态码String token = request.getHeader("token");if(token==null ||token.isEmpty()){log.info("令牌为空,响应401状态码");response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);return;}//5.解析请求头tokentry {Claims claims = JwtUtils.parseJWT(token);Integer empId=Integer.valueOf(claims.get("id").toString());CurrentHolder.setCurrentId(empId);log.info("解析成功,放行");filterChain.doFilter(request,response);} catch (Exception e) {log.info("令牌解析失败,响应401状态码");response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);return;}CurrentHolder.remove();}
}

需要拦截的路径在注解@WebFilter中添加 /* 就是拦截所有的路径
同时在启动Spring方法上还要添加注解@ServletComponentScan,这样能够扫描到所有的拦截。过滤器的顺序是按照自然排序的。
拦截器也差不多是一个道理,在过滤器后面,是先到过滤器再到拦截器,再到控制层然后往下。但拦截器只能拦截Spring的请求。

下面是拦截器的代码:

这是注册拦截器的代码:

package com.itheima.interceptor;import com.itheima.utils.JwtUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;@Slf4j
@Component
public class TokenInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//1.获取请求路径String requestURI = request.getRequestURI();//2.判断路径中是否包含登录请求,如果是就放行if(requestURI.contains("login")){return true;}//4.获取请求头,判断是否为空,为空就响应401状态码String token = request.getHeader("token");if(token==null ||token.isEmpty()){log.info("令牌为空,响应401状态码");response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);return false;}//5.解析请求头tokentry {JwtUtils.parseJWT(token);return true;} catch (Exception e) {log.info("令牌解析失败,响应401状态码");response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);return false;}}
}

还需要实现WebMvcConfigure接口 启动拦截器

@Configuration
public class WebConfig implements WebMvcConfigurer {/*** 添加拦截器*/@Autowiredprivate TokenInterceptor tokenInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(tokenInterceptor).addPathPatterns("/**");}
}

这样就能够顺利的完成登录校验的功能了

SpringAOP

SpringAOP解决了一些重复代码的问题。例如日志记录,比如要记录对员工表的操作,添加,删除,更新员工表的时间,案例里这样的表和同样的操作有很多,如果一个一个写,记录操作前时间,操作后时间,操作时间,代码重复很高,而且也很麻烦,这个时候就有AOP技术,使用代理模式的方法,在目标资源执行前执行,在目标资源执行后执行,资源就省略了一大部分的代码。
下面是代码示例:

@Aspect
@Component
public class OperationLogAspect {@Autowiredprivate OperateLogMapper operateLogMapper;// 环绕通知@Around("@annotation(com.itheima.anno.LogOperation)")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {// 记录开始时间long startTime = System.currentTimeMillis();// 执行方法Object result = joinPoint.proceed();// 当前时间long endTime = System.currentTimeMillis();// 耗时long costTime = endTime - startTime;// 构建日志对象OperateLog operateLog = new OperateLog();operateLog.setOperateEmpId(getCurrentUserId()); // 需要实现 getCurrentUserId 方法operateLog.setOperateTime(LocalDateTime.now());operateLog.setClassName(joinPoint.getTarget().getClass().getName());operateLog.setMethodName(joinPoint.getSignature().getName());operateLog.setMethodParams(Arrays.toString(joinPoint.getArgs()));operateLog.setReturnValue(result.toString());operateLog.setCostTime(costTime);// 插入日志operateLogMapper.insert(operateLog);return result;}// 示例方法,获取当前用户IDprivate int getCurrentUserId() {return CurrentHolder.getCurrentId();}
}

这一句代码,就是执行目标资源的代码
Object result = joinPoint.proceed();

这是指定生效的目标资源,annotion是采用了注解的方式,在需要执行这个放的方法名上加上对应的注释,就可以生效了

@Around("@annotation(com.itheima.anno.LogOperation)")

自定义的注解如下:target注解是使方法生效 retention是在运行时生效

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogOperation {
}

整个案例需要完成的是记录员工的操作日志,所以在执行每一个方法的时候需要知道员工的名字,这个时候就要想什么是一直携带着这个信息的。令牌技术里的token,就记录了员工的id,所以我们可以解析令牌来获取员工的id,然后记录到日志里面。这个时候就有了ThreadLocal,这是一个线程的存储空间。

每一次请求都是一个单独的线程,所以资源互不影响,创建一个关于ThreadLocal工具类的方法,来设置和获取id,在最后执行完的时候还要销毁id,避免资源空间的浪费。

public class CurrentHolder {private static final ThreadLocal<Integer> CURRENT_LOCAL = new ThreadLocal<>();public static void setCurrentId(Integer employeeId) {CURRENT_LOCAL.set(employeeId);}public static Integer getCurrentId() {return CURRENT_LOCAL.get();}public static void remove() {CURRENT_LOCAL.remove();}
}

在这里插入图片描述
在这里插入图片描述

这样登录校验功能和日志记录功能就顺利完成了!

题外话:

希望自己能够坚持记录和总结下学习的内容(虽然有点潦草),但希望自己每天的学习是有收获的,不能因为着急学习技术,就囫囵吞枣!希望能尽快学好,找到实习吧!


文章转载自:

http://ClA8wT65.zbpqq.cn
http://hzjCw8Cl.zbpqq.cn
http://F65OgATo.zbpqq.cn
http://lVjKQOqE.zbpqq.cn
http://BmIB3wwh.zbpqq.cn
http://sAQPT2L0.zbpqq.cn
http://kVbkYH2z.zbpqq.cn
http://9xMgyEPJ.zbpqq.cn
http://yKStIy6k.zbpqq.cn
http://1qHFMkFf.zbpqq.cn
http://Yhh9fQ0L.zbpqq.cn
http://lRJaii3N.zbpqq.cn
http://rv3qSq7l.zbpqq.cn
http://WjeFsRVz.zbpqq.cn
http://XHpnEOS4.zbpqq.cn
http://peeEUIia.zbpqq.cn
http://ZMOECdEI.zbpqq.cn
http://ShDJfbqP.zbpqq.cn
http://kvMHD7VL.zbpqq.cn
http://irpOKyT7.zbpqq.cn
http://boi5hXRU.zbpqq.cn
http://ghbdo46w.zbpqq.cn
http://YzTt0yIL.zbpqq.cn
http://HWQtmdSg.zbpqq.cn
http://6XuymITr.zbpqq.cn
http://5B7FSMs5.zbpqq.cn
http://bYVrZe78.zbpqq.cn
http://ELWtPxVu.zbpqq.cn
http://012eSA2b.zbpqq.cn
http://I8AJep6n.zbpqq.cn
http://www.dtcms.com/wzjs/658137.html

相关文章:

  • 海口网站建设价格招聘网站做竞品分析
  • 网站备案 固定电话wordpress邮件新文章
  • 建设厅网站密码忘了怎么办wordpress文章怎么生成标签
  • 400网站建设推广优设网的特点
  • 做网站设计的公司四川整站优化关键词排名
  • 化州网站建设wordpress自定义后台菜单
  • 做seo推广手机网站代做百度首页排名价格
  • 淘宝网站建设属于什么类目网站制作岗位职责
  • 网站申请建设网络推广培训班培训机构
  • 整人网站怎么做沈阳制作网站的公司有哪些
  • 模板建设网站招人在哪个网站比较好找
  • 做网站赚钱交税公司网站建设的分类
  • 陶瓷类网站建设哪些网站做推广
  • 冠县企业做网站推广三亚市住房和城乡建设局
  • 重庆快速网站建设安徽合肥做网站的公司
  • 什么是理财北京网站建设公司西双版纳网站建设开发公司
  • 网站建设的实践体会购物网站建设价格
  • 做公司网站 烟台爱企业查询
  • 网站的管理付网站建设费用会计分录
  • 漯河建网站主播做的头像在哪个网站上做的
  • 兰溪建设网站衡水精品网站建设
  • 网络优化网站 s网站页头尺寸
  • 找企业网站制作遵义市建设局网站官网
  • 哈尔滨网站制作哪儿好薇注册一个有限公司需要多少钱
  • 网站建设申请计划wordpress yusi主题
  • 绵阳网站建设开发甘肃省安装建设集团公司网站
  • 洮南市城乡和住房建设局网站网站免费正能量直接进入小说
  • 中国建设银行官网站哈南分理处如何做简易的网站
  • 给网站挂黑链凡科快图网站
  • 网站开发智能化方向小米手表网站