欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-10-31 13:10:16
写一个shiro的过滤器import cn.erika.demo.common.model.vo.message;import com.alibaba.fastjson.json;import org...

写一个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和网页请求都能正常处理了

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