当前位置: 移动技术网 > IT编程>开发语言>Java > SpringBoot基于Shiro处理ajax请求代码实例

SpringBoot基于Shiro处理ajax请求代码实例

2020年06月14日  | 移动技术网IT编程  | 我要评论

厄尔·麦尼考尔特,新妹魔王的契约者第二季无修版,江斗丽

写一个shiro的过滤器

import cn.erika.demo.common.model.vo.message;
import com.alibaba.fastjson.json;
import org.apache.shiro.securityutils;
import org.apache.shiro.subject.subject;
import org.apache.shiro.web.servlet.advicefilter;

import javax.servlet.servletrequest;
import javax.servlet.servletresponse;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;

/**
 * ajax请求处理 用于前后台分离的场景
 */
public class ajaxfilter extends advicefilter {
  @override
  protected boolean prehandle(servletrequest request, servletresponse response) throws exception {
    // 先判断是不是ajax请求 ajax请求都会自带一个请求头x-requested-with
    // 如果有值而且是xmlhttprequest那就可以确定是个ajax请求 返回json数据就行
    httpservletrequest req = (httpservletrequest) request;

    if ("xmlhttprequest".equals(req.getheader("x-requested-with"))) {
      // 获取到当前的登录对象 如果是没有经过认证的用户就获取不到认证信息
      subject subject = securityutils.getsubject();

      if (subject.getprincipal() == null) {
        httpservletresponse resp = (httpservletresponse) response;

        // 设置响应类型和编码字符 不然中文乱码
        resp.setcontenttype("application/json;charset=utf-8");
        resp.setcharacterencoding("utf-8");

        // message是我写的一个包装类,用来向前台返回数据
        resp.getwriter().write(json.tojsonstring(message.failed("请登录后操作")));
        return false;
      } else {
        // 经过认证的话就放过去 让下一个过滤器处理
        return true;
      }
    } else {
      // 不是ajax请求的话也放过去 让下一个过滤器处理
      return true;
    }
  }
}

shiro的配置类里面的配置我就全部放出来了 就看一下与这次配置相关的

@bean(name = "shirofilter")
public shirofilterfactorybean shirofilterfactorybean(securitymanager securitymanager) {
  shirofilterfactorybean factorybean = new shirofilterfactorybean();
  factorybean.setsecuritymanager(securitymanager);
  // 设置登录界面url
  factorybean.setloginurl(loginurl);
  // 设置未经认证页面的url
  factorybean.setunauthorizedurl(unauthorizedurl);

  // 这里是设置过滤器
  // 要注意 如果你没写的话默认是有一个formauthenticationfilter
  // 如果你手动设置了过滤器会覆盖掉默认设置
  // 在这里加上就好了
  hashmap<string, filter> filter = new hashmap<>();
  filter.put("authc", new ajaxfilter());
  filter.put("authc", new formauthenticationfilter());
  factorybean.setfilters(filter);

  // 需要认证的加到authc里面
  // 不需要认证的加到anon里面
  hashmap<string, string> filterchain = new hashmap<>();
  filterchain.put("/favicon.ico", "anon");
  filterchain.put("/login", "anon");
  filterchain.put("/logout", "logout");
  filterchain.put("/**", "authc");
  factorybean.setfilterchaindefinitionmap(filterchain);

  return factorybean;
}

这样ajax和网页请求都能正常处理了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网