spring security教程

  • springsecurity集成swagger2访问静态资源及图片 @Configuration public class WebMvcConfig extends WebMvcConfigurationSupport { @Override p...
    • 2月前
  • 使用request.getRequestURI()方法获取请求路径时发现如果请求的路由不存在,那么requestDispatcherPath/requestURI/servletPath的value都是/error而不是/test 156384...
    • 2月前
  • spring security过滤器链及认证流程 一、过滤器链 spring Security功能的实现主要是由一系列过滤器链相互配合完成。 下面介绍过滤器链中主要的几个过滤器及其作用: 1.SecurityContextPersistenceF...
    • 3月前
  • Swagger整合Jwt授权配置 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章http://www.javaman.cn/sb2/swagger-jwt 一、Swagger入门 1、什么是Swagger Swagger...
    • 4月前
  • redis存储token 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章http://www.javaman.cn/sb2/redis-token 在实际开发中,token需要保存在redis中,今天我们就来介绍下to...
    • 5月前
  • oauth2.0密码模式 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章http://www.javaman.cn/sb2/oauth-password 如果你高度信任某个应用,RFC 6749 也允许用户把用户名和密...
    • 5月前
  • oauth2.0授权码模式 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章http://www.javaman.cn/sb2/oauth-code 授权码(authorization code)方式,指的是第三方应用先...
    • 5月前
  • springsecurity入门教程 1.springsecurity springsecurity底层实现为一条过滤器链,就是用户请求进来,判断有没有请求的权限,抛出异常,重定向跳转。 2.登录页 springsecurity自带一个登录...
    • 5月前
Spring Security getRequestURI()返回/error问题 - idea激活- IntelliJ IDEA 2021.1激活码破解教程(亲测激活至 2099 年,长期更新)- 爪哇男教程  

使用request.getRequestURI()方法获取请求路径时发现如果请求的路由不存在,那么requestDispatcherPath/requestURI/servletPath的value都是/error而不是/test

img

15638492770020.jpg

调试可以发现真实的path在org.apache.coyote.Request的uriMb字段中

img

15638492770020.jpg

获取使用如下方法uriMb字段内容

//根据Field获得对应的Class
private Class getClassByName(Class classObject, String name){
    Map<Class,List<Field>> fieldMap = new HashMap<>();
    Class returnClass = null;
    Class tempClass = classObject;
    while (tempClass != null) {
        fieldMap.put(tempClass,Arrays.asList(tempClass .getDeclaredFields()));
        tempClass = tempClass.getSuperclass();
    }
    
    for(Map.Entry<Class,List<Field>> entry: fieldMap.entrySet()){
        for (Field f : entry.getValue()) {
            if(f.getName().equals(name)){
                returnClass = entry.getKey();
                break;
            }
        }
    }
    return returnClass;
}

//递归遍历父类寻找coyoteRequest Field   
private Object findCoyoteRequest(Object request)  throws Exception {
    Class a = getClassByName(request.getClass(),"request");
    Field request1 = a.getDeclaredField("request");
    request1.setAccessible(true);
    Object b = request1.get(request);
    if(getClassByName(b.getClass(),"coyoteRequest") == null){
        return findCoyoteRequest(b);
    }else{
        return b;
        }
    }

通过上述代码可以获取到包含coyoteRequest的Object 每一层的调用顺序如下:

org.springframework.security.web.servletapi.HttpServlet3RequestFactory$Servlet3SecurityContextHolderAwareRequestWrapper
org.springframework.security.web.context.HttpSessionSecurityContextRepository$Servlet3SaveToSessionRequestWrapper
org.springframework.security.web.firewall.StrictHttpFirewall$1
org.apache.catalina.core.ApplicationHttpRequest
org.apache.catalina.connector.RequestFacade
org.apache.catalina.connector.Request
org.apache.coyote.Request

获取uriMB的代码

Object a = findCoyoteRequest(request);
Field coyoteRequest = a.getClass().getDeclaredField("coyoteRequest");
coyoteRequest.setAccessible(true);
Object b = coyoteRequest.get(a);

Field uriMB = b.getClass().getDeclaredField("uriMB");
uriMB.setAccessible(true);
MessageBytes c = (MessageBytes)uriMB.get(b);
System.out.println(c.getString());

c.getString()即为uriMB的value

img

15638497923382.jpg

作者:博瑞的西门吹雪 链接:https://www.jianshu.com/p/cfa96f2a1bb4 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


全部评论: 0

    我有话说: