您现在的位置是:首页 > java技术交流java技术交流

shiro ajax返回登录成功

上善若水2020-12-19 17:10:33【java技术交流】 2735人已围观

简介shiro默认在我们登录成功后会重定向到用户首页,有些时候,登录是使用ajax完成,登录成功后,会返回给我们登录成功的页面,尽管在ajax中页面不跳转我们可以手动跳转,但是还是有些不爽希望能返回jso

shiro默认在我们登录成功后会重定向到用户首页,有些时候,登录是使用ajax完成,登录成功后,会返回给我们登录成功的页面,尽管在ajax中页面不跳转我们可以手动跳转,但是还是有些不爽希望能返回json登录成功提示.
在网上收集了一些资料,有些是重写onAccessDenied实现.有些是其他方式.
本篇是重写UserFilter中的redirectToLogin实现的.

具体思想是我们在页面进行判断是否ajax请求 是的话我们就不进行跳转,然后我们可以在原始登录控制器中返回登录成功即可.
验证成功后这个控制器就会成功返回登录成功的json

@PostMapping(value = {"/admin/login"})
    @ResponseBody
    public LayResponse login(@RequestParam Map<String, String> param, HttpSession session) {
        //用户认证信息
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(param.get("username"), param.get("password"));
        LayResponse response = new LayResponse();
        response.success("登录成功");
        try {
            //进行验证,这里可以捕获异常,然后返回对应信息
            subject.login(usernamePasswordToken);
        } catch (UnknownAccountException e) {
            response.error("用户名不存在!");
        } catch (AuthenticationException e) {
            response.error("账号或密码错误!");
        } catch (AuthorizationException e) {
            response.error("没有权限");
        } catch (Exception e) {
            response.error("其他错误");
        }
        return response;
    }

自定义过滤器代码,仅在非ajax下进行跳转,这样我们就可以在接收到login控制器返回的json.

package com.springboot.blog.interceptor;

import org.apache.shiro.web.filter.authc.UserFilter;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class ShiroLoginFilter extends UserFilter {

    @Override
    protected void redirectToLogin(ServletRequest request, ServletResponse response) throws IOException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        String requestedWith = httpServletRequest.getHeader("X-Requested-With");//判断ajax请求
        if (requestedWith == null || !requestedWith.equalsIgnoreCase("XMLHttpRequest")) {
            super.redirectToLogin(request, response);
        }
    }
}

别忘了加我们的写Filter加入配置中.

    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        Map<String, String> map = new HashMap<>();
        Map<String, Filter> filters = shiroFilterFactoryBean.getFilters();
        filters.put("authc", new ShiroLoginFilter());//添加自定义拦截器
    }

完成收工~

Tags: shiro

很赞哦! (1)

随机图文

文章评论

站点信息

  • 建站时间:2019-10-24
  • 网站程序:Thinkphp6 Layui
  • 文章统计247篇文章
  • 标签管理标签云
  • 统计数据cnzz统计
  • 微信公众号:扫描二维码,关注我们