spring boot+shiro时出现了java.lang.NullPointerException: null ,打印时出现UsernamePasswordToken - null, rememb

先看一下我现在的controller:

@RequestMapping("/login")
public String login(String name,String password,Model model) {
    Subject subject= SecurityUtils.getSubject();
    AuthenticationToken token1=new UsernamePasswordToken(name,password);
    UsernamePasswordToken token=new UsernamePasswordToken(name,password);
    try {
        subject.login(token1);   //执行登录的方法
        return "index";
    }
    catch (IncorrectCredentialsException e){  //密码错误的异常
        model.addAttribute("msg","密码错误");
        return "login";
    }
    catch (Exception e){   //用户不存在的异常
        model.addAttribute("msg","用户名错误");
        return "login";
    }

}

这里我已经新建了Token,然后在subject,login(token)里也已经传入了,再看我的认证方法:

@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
    System.out.println("执行了认证->Authentication");
    String username="root";
    String password="root";
    UsernamePasswordToken token=(UsernamePasswordToken)authenticationToken;
    System.out.println(token);
    System.out.println(token.getUsername());
   if(!token.getUsername().equals(username)){
     return  null;  //返回null值即为出错。 抛出UnknowUsernamePasswordException
 }
    return new SimpleAuthenticationInfo("",password,""); //密码认证,shiro自动帮我们做
}

上面打印的token是:

org.apache.shiro.authc.UsernamePasswordToken - null, rememberMe=false

就是这里的时候我报错了:

java.lang.NullPointerException: null
 at com.example.springshiro.config.UserRealm.doGetAuthenticationInfo(UserRealm.java:18) ~[classes/:na]
 at org.apache.shiro.realm.AuthenticatingRealm.getAuthenticationInfo(AuthenticatingRealm.java:571) ~[shiro-core-1.5.3.jar:1.5.3]

这个报错说的是token参数为null,也就是login里面的实参没有传到这里。。
暂未解决

好了,我就只是发现了有这个问题,但是具体的解决办法我还没有发现,如果谁知道解决办法希望在评论区说一下

2020.11.23已解决:
解决代码:

  @RequestMapping("/validate")
    @ResponseBody
    public  String asign(String username, String password){
        System.out.println("username:"+username+"\n"+"password:"+password);
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        try {
            subject.login(token); //执行登录方法,不通过有异常.
            return "true";
        }
        catch (UnknownAccountException e){
            e.printStackTrace();
            return "false";
        }
        catch (IncorrectCredentialsException e){
            e.printStackTrace();
            return "false";
        }
    } 
  @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("正在执行认证");
        UsernamePasswordToken token1=(UsernamePasswordToken)token;
       queryWrapper.select().eq("username",token1.getUsername());

        return new SimpleAuthenticationInfo(xxxxx,xxxxx.getPassword(),"");  //密码shiro自动帮我们做
    }

可以看到差的其实就只有在controlller里面的token1 和token ,本应该使用token这个对象进入shiro的。
但是也有可能是shiro的版本导致的问题:
我已解决时的shiro依赖:

<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.5.3</version>
        </dependency>
Shiro中,当会话过期或无效,可能会出现“Error while validating the session java.lang.NullPointerException: null”的错误。这通常是由于在会话过期或无效尝试访问会话属性而导致的。为了解决这个问题,您可以在Shiro配置文件中配置一个错误页面,以便在会话过期或无效重定向到该页面。以下是一个示例配置: ```xml <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <!-- ... other properties ... --> <property name="filters"> <util:map> <entry key="authc"> <bean class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter"> <property name="loginUrl" value="/login"/> <property name="errorUrl" value="/login?error=true"/> </bean> </entry> </util:map> </property> <property name="securityManager" ref="securityManager"/> <property name="loginUrl" value="/login"/> <property name="successUrl" value="/"/> <property name="unauthorizedUrl" value="/403"/> <property name="filterChainDefinitions"> <value> /login = authc /** = anon </value> </property> <property name="errorPages"> <util:map> <entry key="org.apache.shiro.authz.UnauthorizedException" value="/403"/> <entry key="org.apache.shiro.authc.AuthenticationException" value="/login?error=true"/> <entry key="java.lang.Exception" value="/error"/> </util:map> </property> </bean> ``` 在这个示例中,我们配置了一个错误页面映射,以便在会话过期或无效重定向到“/login?error=true”页面。这将确保用户在会话过期或无效不会看到“Error while validating the session java.lang.NullPointerException: null”的错误。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值