同样是两次post的表单提交
我在自定义Realm中的doGetAuthenticationInfo方法里执行String userName = (String) authenticationToken.getPrincipal();
有时能取到值,有时取不到,比较奇怪.
于是我开始找authenticationToken.getPrincipal()
的实现,一层一层往上找后发现,就是request.getParameter("username")
图1
图2
图3
我遇到的情况如下
正常情况下,前端提交username和password,是能从shiro里获取到username的
-
但是,有少数几次,会遇到下图这样的问题
明明前端提交了username,但是shiro里却获取不到,而且没有改任何代码和参数,这个错误也只是极少数情况出现,很难重现,为了截取到下面这张图,我硬是登陆退出了7 80次……
下面是我shiro的配置文件
<?xml version="1.1" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"
default-lazy-init="true">
<description>Shiro安全配置</description>
<!-- 读取配置文件 -->
<context:property-placeholder ignore-unresolvable="true"
location="classpath*:/config/privsys.properties"/>
<!-- 安全管理器 Shiro的主要业务层对象基于web的应用程序 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="customAuthorizingRealm"/>
<!-- 注入session管理器 -->
<property name="sessionManager" ref="sessionManager"/>
</bean>
<!-- 会话管理 -->
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<!-- session的失效时常,单位是毫秒 -->
<property name="globalSessionTimeout" value="600000"/>
<!-- 删除失效的session -->
<property name="deleteInvalidSessions" value="true"/>
</bean>
<bean id="customAuthorizingRealm" class="com.hongyun.privsys.shiro.CustomAuthorizingRealm">
</bean>
<!-- 注销的时候 登出 跳转到login页面-->
<bean id="logoutFilter" class="org.apache.shiro.web.filter.authc.LogoutFilter">
<property name="redirectUrl" value="/login.jsp"/>
</bean>
<!-- Shiro Filter -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<!-- loginUrl认证提交地址,如果认证没有通过,shiro框架就会自动请求这个地址 -->
<property name="loginUrl" value="${privsys.shiro.loginUrl}"/>
<!-- 如果没有权限,shiro框架就会自动请求这个地址 -->
<property name="unauthorizedUrl" value="${privsys.shiro.unauthorizedUrl}"/>
<!--认证成功自动跳转,不配置自动到上一个请求路径 一般不配置-->
<property name="successUrl" value="${privsys.shiro.successUrl}"/>
<!-- **去掉了自定义过滤器** -->
<property name="filters">
<map>
<!-- <entry key="authc" value-ref="formAuthenticationCaptchaFilter"/>-->
<entry key="logout" value-ref="logoutFilter"/>
</map>
</property>
<property name="filterChainDefinitions">
<value>
<!--从上往下执行 优先执行的放前面 anon 允许匿名访问(资源文件) authc允许登录验证访问(所有页面) perms运行权限验证访问 logout自动退出(url可以不存在)user 记住我或认证通过可以访问的地址 /index.html=user authcBasic不关闭浏览器不清除session-->
<!--
从上往下执行,上面的先于下面的执行,所以将覆盖面小的要放在上边
anon 可以匿名访问
logout 由shiro的LogoutFilter拦截住,然后清除session信息,退出登陆的url可以不存在
-->
/test.do = anon
/logout.do=logout
/login.jsp=anon
/testlogin/login.jsp=anon
/login.html = anon
/login.do=authc
/captcha-image.do = anon
/favicon.ico = anon
/purview/** = anon
/resources/** = anon
/apps/** = anon
/assets/** = anon
/error/** = anon
/home/** = authc
/json/** = anon
/!loginAndPortal/** = anon
/**=authc
</value>
</property>
</bean>
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="org.apache.shiro.authz.UnauthorizedException">/privsys/error/403</prop>
</props>
</property>
</bean>
<!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
<bean id="lifecycleBeanPostProcessor"
class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
<!-- AOP式方法级权限检查 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor">
<property name="proxyTargetClass" value="true"/>
</bean>
<!-- shiro权限注解支持开启 -->
<aop:config proxy-target-class="true"></aop:config>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>
</beans>
1、首先给你个demo。
2、Shiro根本就不用你的HttpSevletRequest和Response对象,Shiro自身维护了自己的Session,在Shrio的包下面。