0%

记录一次session做登录记录,写拦截器做权限验证时遇到的问题

记录一次session做登录记录,写拦截器做权限验证时遇到的问题

问题发生前提

  1. 登录之后写session作为登录状态记录
  2. 写拦截器拦截所以请求
  3. 某些接口有自定义注解@loginrequired(require=””,role=?)
  4. 当required为ture,必须要登录,role为用户权限,低于某种权限不允许访问

具体问题

  1. 跨域问题
  2. login、logout接口可以正常使用sessionid一致,get即权限验证接口sessionid不一致

解决办法

  1. 跨域

    1. 在继承HandlerInterceptorAdapter的子类拦截器的preHandle方法里面对response设置header:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      //        请求跨域
      response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
      // response.setHeader("Access-Control-Allow-Origin", "*");
      // 允许携带 用户认证凭据(也就是允许客户端发送的请求携带Cookie)
      response.setHeader("Access-Control-Allow-Credentials", "true");
      response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT");
      response.setHeader("Access-Control-Max-Age", "3600");
      response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");

    2. 在WebMvcConfigurer实现类webConfig里面重写对跨域的处理

      1
      2
      3
      4
      5
      6
      7
      8
      9
      // 设置跨域访问
      @Override
      public void addCorsMappings(CorsRegistry registry) {
      registry.addMapping("/**")
      .allowedOrigins("*")
      .allowedMethods("GET", "HEAD", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "TRACE")
      // 允许携带 用户认证凭据(也就是允许客户端发送的请求携带Cookie)
      .allowCredentials(true);
      }
    3. 直接在方法上面使用@CrossOrigin注解

    4. 客户端请求的时候需要携带Cookie,也就是下面一个问题了

  2. 客户端请求是携带身份验证

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $.ajax({
    url: "http://127.0.0.1:8080/sys/user/get",
    method: "POST",
    data: userName,
    //携带cookie
    xhrFields: {
    withCredentials: true
    },
    success: function(data){
    console.log(data);
    },
    error: function(data){
    console.log("error:" + data.data);
    }

    })
Donate comment here.

欢迎关注我的其它发布渠道