SpringBoot基于Shiro处理ajax请求代码实例
写一个Shiro的过滤器
importcn.erika.demo.common.model.vo.Message;
importcom.alibaba.fastjson.JSON;
importorg.apache.shiro.SecurityUtils;
importorg.apache.shiro.subject.Subject;
importorg.apache.shiro.web.servlet.AdviceFilter;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
/**
*Ajax请求处理用于前后台分离的场景
*/
publicclassAjaxFilterextendsAdviceFilter{
@Override
protectedbooleanpreHandle(ServletRequestrequest,ServletResponseresponse)throwsException{
//先判断是不是ajax请求ajax请求都会自带一个请求头X-Requested-With
//如果有值而且是XMLHttpRequest那就可以确定是个ajax请求返回json数据就行
HttpServletRequestreq=(HttpServletRequest)request;
if("XMLHttpRequest".equals(req.getHeader("X-Requested-With"))){
//获取到当前的登录对象如果是没有经过认证的用户就获取不到认证信息
Subjectsubject=SecurityUtils.getSubject();
if(subject.getPrincipal()==null){
HttpServletResponseresp=(HttpServletResponse)response;
//设置响应类型和编码字符不然中文乱码
resp.setContentType("application/json;charset=utf-8");
resp.setCharacterEncoding("UTF-8");
//Message是我写的一个包装类,用来向前台返回数据
resp.getWriter().write(JSON.toJSONString(Message.failed("请登录后操作")));
returnfalse;
}else{
//经过认证的话就放过去让下一个过滤器处理
returntrue;
}
}else{
//不是ajax请求的话也放过去让下一个过滤器处理
returntrue;
}
}
}
Shiro的配置类里面的配置我就全部放出来了就看一下与这次配置相关的
@Bean(name="shiroFilter")
publicShiroFilterFactoryBeanshiroFilterFactoryBean(SecurityManagersecurityManager){
ShiroFilterFactoryBeanfactoryBean=newShiroFilterFactoryBean();
factoryBean.setSecurityManager(securityManager);
//设置登录界面URL
factoryBean.setLoginUrl(loginUrl);
//设置未经认证页面的URL
factoryBean.setUnauthorizedUrl(unauthorizedUrl);
//这里是设置过滤器
//要注意如果你没写的话默认是有一个FormAuthenticationFilter
//如果你手动设置了过滤器会覆盖掉默认设置
//在这里加上就好了
HashMapfilter=newHashMap<>();
filter.put("authc",newAjaxFilter());
filter.put("authc",newFormAuthenticationFilter());
factoryBean.setFilters(filter);
//需要认证的加到authc里面
//不需要认证的加到anon里面
HashMapfilterChain=newHashMap<>();
filterChain.put("/favicon.ico","anon");
filterChain.put("/login","anon");
filterChain.put("/logout","logout");
filterChain.put("/**","authc");
factoryBean.setFilterChainDefinitionMap(filterChain);
returnfactoryBean;
}
这样ajax和网页请求都能正常处理了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。