SpringSercurity踩坑之request.getRequestURI()和request.getRequestURL()

文章讲述了开发者在使用Swagger测试权限时遇到的问题,发现`request.getRequestURI()`和`request.getRequestURL()`的区别导致路径判断错误。作者解释了两者功能及适用场景,强调了根据需求选择合适的方法的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在开发的时候遇到一个小小的问题,我在swagger测试权限的时候,直接跳过了放开的路径,直接进行了角色判断,
.addFilterBefore(new TokenAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
在这里if判断路径的时候直接跳过了,没有进行进入过滤链
在这里插入图片描述
最后找了半天,发现这里的问题是
request.getRequestURI()和request.getRequestURL()
这两个太像了,下面就进行一个简单的说明。
在Java Servlet中,request.getRequestURI()和request.getRequestURL()是用于获取请求信息的两个不同的方法,它们的返回值有一些区别。

request.getRequestURI():

返回请求的URI(Uniform Resource Identifier),即不包括主机名、端口号和查询参数的路径部分。

例如,如果请求的URL是http://example.com:8080/myapp/servletPathparam1=value1,
那么request.getRequestURI()将返回/myapp/servletPath。
request.getRequestURL():

返回包含请求的完整URL,包括协议、主机名、端口号、路径和查询参数。

例如,如果请求的URL是http://example.com:8080/myapp/servletPath?param1=value1,
那么request.getRequestURL()将返回http://example.com:8080/myapp/servletPath。

简而言之,getRequestURI()返回的是请求的相对路径部分,而getRequestURL()返回的是完整的URL,包括主机名和协议等信息。选择使用哪个方法取决于你需要的信息的粒度。如果只关心路径,可以使用getRequestURI();如果需要完整的URL,包括协议和主机名,可以使用getRequestURL()。

package sfw.xmut.guomao.aspect; import sfw.xmut.guomao.entity.OperationLog; import sfw.xmut.guomao.mapper.OperationLogMapper; import sfw.xmut.guomao.utils.ServletUtil; import jakarta.servlet.http.HttpServletRequest; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import java.time.LocalDateTime; @Aspect @Component public class OperationLogAspect { private final OperationLogMapper logMapper; public OperationLogAspect(OperationLogMapper logMapper) { this.logMapper = logMapper; } @Around("execution(* sfw.xmut.guomao.controller.*.*(..))") public Object around(ProceedingJoinPoint joinPoint) throws Throwable { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); HttpServletRequest request = attributes.getRequest(); if (request.getRequestURI().endsWith("/operationLog/page")) { return joinPoint.proceed(); } long startTime = System.currentTimeMillis(); Object result = joinPoint.proceed(); long spendTime = System.currentTimeMillis() - startTime; OperationLog log = new OperationLog(); log.setUserName("admin"); // TODO: Get from JWT token log.setOperationType(request.getRequestURI()); log.setOperationMethod(request.getMethod()); log.setRequestUrl(request.getRequestURL().toString()); log.setOperationIp(ServletUtil.getClientIP(request)); log.setOperationStatus("成功"); log.setLastOperationTime(LocalDateTime.now()); logMapper.insert(log); return result; } }log.setUserName("admin"); // TODO: Get from JWT token 这一行代码怎么把他改成不管哪个用户登录这个管理系统日志上面都可以更新,不要像这个admin锁住固定住不管谁登录都是显示他的名称
06-19
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半糖不加奶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值