使用Shiro做登录与退出功能遇到的问题

Shiro在IDEA运行时登录,如果密码错误能够正常捕获异常,前端提示“用户名或密码错误”;

而打包成jar后在控制台运行,如果密码错误,不能捕获异常,前端报500错误

在这里插入图片描述

在这里插入图片描述

错误原因:thymeleaf无法成功渲染“/admin/login”

猜想:查看控制台报错时发现提示“post请求不被支持”,直接 return到了login的post接口

解决方法:return 重定向到 login接口

	return "redirect:/admin/login";
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是使用Shiro写一个登录功能的示例代码: 首先,需要在pom.xml文件中添加Shiro的依赖: ``` <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.7.1</version> </dependency> ``` 然后,在Spring配置文件中配置Shiro的相关信息: ``` <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="myRealm"/> </bean> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <property name="loginUrl" value="/login"/> <property name="successUrl" value="/index"/> <property name="unauthorizedUrl" value="/unauthorized"/> <property name="filterChainDefinitions"> <value> /login = anon /logout = logout /** = authc </value> </property> </bean> <bean id="myRealm" class="com.example.MyRealm"/> ``` 其中,securityManager是Shiro的安全管理器,realm是自定义的Realm,shiroFilter是Shiro的过滤器。 接下来,实现自定义的Realm: ``` public class MyRealm extends AuthorizingRealm { @Autowired private UserService userService; @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // 授权逻辑 return null; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { // 认证逻辑 UsernamePasswordToken upToken = (UsernamePasswordToken) token; String username = upToken.getUsername(); User user = userService.getUserByUsername(username); if (user == null) { throw new UnknownAccountException("用户名不存在"); } String password = user.getPassword(); return new SimpleAuthenticationInfo(username, password, getName()); } } ``` 其中,doGetAuthorizationInfo方法是授权逻辑,doGetAuthenticationInfo方法是认证逻辑。在认证逻辑中,首先获取用户名和密码,然后根据用户名查询数据库中的用户信息,如果用户不存在,则抛出UnknownAccountException异常,否则将用户名和密码封装成SimpleAuthenticationInfo对象返回。 最后,在Controller中处理登录请求: ``` @RequestMapping("/login") public String login(String username, String password) { Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(username, password); try { subject.login(token); return "redirect:/index"; } catch (AuthenticationException e) { return "redirect:/login?error"; } } ``` 其中,使用SecurityUtils.getSubject()获取当前用户的Subject对象,然后使用UsernamePasswordToken封装用户名和密码,调用subject.login(token)进行登录认证,如果认证成功,则重定向到首页,否则重定向到登录页面并带上错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

taiqinnng

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

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

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

打赏作者

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

抵扣说明:

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

余额充值