Springboot shiro 登录成功不跳转成功页面问题。

奥鹏马 2018-07-09 11:17:19
各位大神大家好:
我刚开始接触shiro,现在遇到个问题是登录成功后不跳转成功方法,请各位大神帮我看一下,谢谢。
这是我的shiro配置文件
@Bean
public ShiroFilterFactoryBean shiroFilter (SecurityManager securityManager) {
System.out.println("ShiroConfiguration.shirFilter()");
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
// 登录成功后要跳转的链接
//Map filters = shiroFilterFactoryBean.getFilters();
//filters.put("authc" , new com.example.common.shiro.AuthenticationFilter());
// 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
shiroFilterFactoryBean.setLoginUrl("/login");
//登录成功后需要走的方法
shiroFilterFactoryBean.setSuccessUrl("/search");
//拦截器
Map<String,String> filterChainDefinitionMap = new LinkedHashMap<>();
// 配置不会被拦截的链接 顺序判断
filterChainDefinitionMap.put("/ajaxLogin", "anon");
filterChainDefinitionMap.put("/search", "anon");
//配置退出过滤器,其中具体的退出代码shiro已经替我们实现了
filterChainDefinitionMap.put("/logout" , "logout");
//authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问 ,这个一定要放到最后
filterChainDefinitionMap.put("/**", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
}
@Bean
public MyShiroRealm myShiroRealm(){
MyShiroRealm myShiroRealm = new MyShiroRealm();
return myShiroRealm;
}
@Bean
public SecurityManager securityManager(){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(myShiroRealm());
return securityManager;
}
@Bean
public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){
DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator();
creator.setProxyTargetClass(true);
return creator;
}


根据网上的解决方案是重写一下FormAuthenticationFilter,我重写了,但是好像不起作用。
@Component
@WebFilter(urlPatterns = "/*" , filterName = "authenticationFilter")
public class AuthenticationFilter extends FormAuthenticationFilter {

@Override
protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request, ServletResponse response) throws Exception {
String successUrl = "/search";
WebUtils.getAndClearSavedRequest(request);
WebUtils.issueRedirect(request,response,successUrl);
return false;
}

/**
* SpringBoot 提供了 FilterRegistrationBean 方便我们对 Filter 进行管理。 将不需要注册的 Filter 注入方法。 不然会报错
* @param filter
* @return
*/
@Bean
public FilterRegistrationBean registration (com.example.common.shiro.AuthenticationFilter filter) {
FilterRegistrationBean registration = new FilterRegistrationBean(filter);
registration.setEnabled(false);
return registration;
}
}
...全文
1759 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Junibl1231 2020-08-10
  • 打赏
  • 举报
回复
我的也是 在controller里面写了:

subject.login(token);//登录验证
            if (subject.isAuthenticated()){
                return "index";
            }else{
                return "view/login";
            }
就是不跳转
mililang1094 2020-08-07
  • 打赏
  • 举报
回复
在controller里写了return "/index"; 还是没用
奥鹏马 2018-07-12
  • 打赏
  • 举报
回复
引用 8 楼 tigerJGG 的回复:
认证成功不是登录这个动作 他们两个不是完全一样的 比如你访问一个系统页面,这个页面需要你的认证信息,如果你没有登录操作产生认证信息,那么你会跳转到登录页去认证,登录完之后产生认证信息,你才有权限进入刚才那个页面。在shiro里面如果访问一个页面跳转到登录页让你登录,那么shiro会保存这个url,当你认证成功之后,会跳转到刚才你访问的那个url。
登录成功之后最终会调用redirectToSavedRequest()方法,下面是源码:
public static void redirectToSavedRequest(ServletRequest request, ServletResponse response,
 String fallbackUrl)throws IOException {
String successUrl = null;
boolean contextRelative = true;
//获取保存的上一次的请求信息
SavedRequest savedRequest = WebUtils.getAndClearSavedRequest(request);
if (savedRequest != null &&
      savedRequest.getMethod().equalsIgnoreCase(AccessControlFilter.GET_METHOD)){
//如果保存的有上一次的请求信息,那么会获取到上一次的请求url
successUrl = savedRequest.getRequestUrl();
contextRelative = false;
}
//如果上一次请求url为null,才会使用自己设置的successUrl
if (successUrl == null) {
successUrl = fallbackUrl;
}

if (successUrl == null) {
throw new IllegalStateException(".....");
}

WebUtils.issueRedirect(request, response, successUrl, null, contextRelative);
}
由此可以看出,自己设置的successUrl并不是控制登录成功跳转的页面,而是作为附加配置,登录成功跳转的页面还要自己在controller里面去写的
谢谢,大概明白了。
tigerJGG 2018-07-11
  • 打赏
  • 举报
回复
认证成功不是登录这个动作 他们两个不是完全一样的 比如你访问一个系统页面,这个页面需要你的认证信息,如果你没有登录操作产生认证信息,那么你会跳转到登录页去认证,登录完之后产生认证信息,你才有权限进入刚才那个页面。在shiro里面如果访问一个页面跳转到登录页让你登录,那么shiro会保存这个url,当你认证成功之后,会跳转到刚才你访问的那个url。
登录成功之后最终会调用redirectToSavedRequest()方法,下面是源码:
public static void redirectToSavedRequest(ServletRequest request, ServletResponse response,
 String fallbackUrl)throws IOException {
String successUrl = null;
boolean contextRelative = true;
//获取保存的上一次的请求信息
SavedRequest savedRequest = WebUtils.getAndClearSavedRequest(request);
if (savedRequest != null &&
      savedRequest.getMethod().equalsIgnoreCase(AccessControlFilter.GET_METHOD)){
//如果保存的有上一次的请求信息,那么会获取到上一次的请求url
successUrl = savedRequest.getRequestUrl();
contextRelative = false;
}
//如果上一次请求url为null,才会使用自己设置的successUrl
if (successUrl == null) {
successUrl = fallbackUrl;
}

if (successUrl == null) {
throw new IllegalStateException(".....");
}

WebUtils.issueRedirect(request, response, successUrl, null, contextRelative);
}
由此可以看出,自己设置的successUrl并不是控制登录成功跳转的页面,而是作为附加配置,登录成功跳转的页面还要自己在controller里面去写的
湫丶湫 2018-07-10
  • 打赏
  • 举报
回复
好吧 不好意思没看清
奥鹏马 2018-07-10
  • 打赏
  • 举报
回复
引用 4 楼 love_autumn_q 的回复:
看看在web.xml里面配置了shiroFilter没有
直接在配置文件里面配置不方便一些
<!-- shiro拦截器 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 安全管理器 -->
<property name="securityManager" ref="securityManager"/>
<!-- 注入登录页面访问URL -->
<property name="loginUrl" value="/login"/>
<!-- 权限认证成功,则跳转到指定页面 -->
<!--<property name="successUrl" value="/s/index"/>-->
<!-- 权限认证失败,则跳转到指定页面 -->
<property name="unauthorizedUrl" value="/login"/>
<!-- shiro权限配置 -->
<property name="filterChainDefinitions">
<value>
<!-- anon表示此地址不需要任何权限即可访问 -->
<!-- 引入静态资源文件 -->
/css/** = anon
/verifyCode = anon
/fonts/** = anon
/images/** = anon
/js/** = anon
<!--所有的请求(除去配置的静态资源请求或请求地址为anon的请求)都要通过登录验证,如果未登录则跳到/login-->
/** = authc
/logout = logout
</value>
</property>
</bean>

您好,我是Springboot项目,应该不用在web.xml中配置。
湫丶湫 2018-07-10
  • 打赏
  • 举报
回复
看看在web.xml里面配置了shiroFilter没有
直接在配置文件里面配置不方便一些
<!-- shiro拦截器 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 安全管理器 -->
<property name="securityManager" ref="securityManager"/>
<!-- 注入登录页面访问URL -->
<property name="loginUrl" value="/login"/>
<!-- 权限认证成功,则跳转到指定页面 -->
<!--<property name="successUrl" value="/s/index"/>-->
<!-- 权限认证失败,则跳转到指定页面 -->
<property name="unauthorizedUrl" value="/login"/>
<!-- shiro权限配置 -->
<property name="filterChainDefinitions">
<value>
<!-- anon表示此地址不需要任何权限即可访问 -->
<!-- 引入静态资源文件 -->
/css/** = anon
/verifyCode = anon
/fonts/** = anon
/images/** = anon
/js/** = anon
<!--所有的请求(除去配置的静态资源请求或请求地址为anon的请求)都要通过登录验证,如果未登录则跳到/login-->
/** = authc
/logout = logout
</value>
</property>
</bean>
奥鹏马 2018-07-10
  • 打赏
  • 举报
回复
引用 2 楼 tigerJGG 的回复:
登录成功不跳转什么意思 ? 登录权限判断正确之后 是要自己在controller里面写跳转url吧

您好,就是shiro认证成功后,应该是跳到登录成功的方法中去,也就是这个方法shiroFilterFactoryBean.setSuccessUrl("/search");,但是没跳。如果需要在controller里面写跳转url的话,那设置登录成功跳转方法有什么意义呢。
tigerJGG 2018-07-09
  • 打赏
  • 举报
回复
登录成功不跳转什么意思 ? 登录权限判断正确之后 是要自己在controller里面写跳转url吧
奥鹏马 2018-07-09
  • 打赏
  • 举报
回复
没人吗,那我自己顶一下。

51,412

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧