Spring Boot + Vue + Shiro 实现前后端分离,写得太好了!

本文介绍了在前后端分离项目中,由于跨域问题导致的预检请求(OPTIONS)无法通过Shiro验证的问题。为解决此问题,文章提供了一个自定义的CORSAuthenticationFilter过滤器,允许OPTIONS请求并处理响应。此外,还展示了Shiro的相关配置,包括自定义Session管理和设置Session超时时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前后端分离项目中,由于跨域,会导致复杂请求,即会发送 preflighted request,这样会导致在 GET/POST 等请求之前会先发一个 OPTIONS 请求,但 OPTIONS 请求并不带 shiro 的’Authorization’字段(shiro 的 Session),即 OPTIONS 请求不能通过 shiro 验证,会返回未认证的信息。

解决方法:给 shiro 增加一个过滤器,过滤 OPTIONS 请求

public class CORSAuthenticationFilter extends FormAuthenticationFilter {

private static final Logger logger = LoggerFactory.getLogger(CORSAuthenticationFilter.class);

public CORSAuthenticationFilter() {

super();

}

@Override

public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {

//Always return true if the request’s method is OPTIONSif (request instanceof HttpServletRequest) {

if (((HttpServletRequest) request).getMethod().toUpperCase().equals(“OPTIONS”)) {

return true;

}

}

return super.isAccessAllowed(request, response, mappedValue);

}

@Override

protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {

HttpServletResponse res = (HttpServletResponse)response;

res.setHeader(“Access-Control-Allow-Origin”, “*”);

res.setStatus(HttpServletResponse.SC_OK);

res.setCharacterEncoding(“UTF-8”);

PrintWriter writer = res.getWriter();

Map<String, Object> map= new HashMap<>();

map.put(“code”, 702);

map.put(“msg”, “未登录”);

writer.write(JSON.toJSONString(map));

writer.close();

return false;

}

}

贴一下我的 config 文件:

@Configuration

public class ShiroConfig {

@Bean

public Realm realm() {

return new DDRealm();

}

@Bean

public CacheManager cacheManager() {

return new MemoryConstrainedCacheManager();

}

/**

  • cookie对象;

  • rememberMeCookie()方法是设置Cookie的生成模版,比如cookie的name,cookie的有效时间等等。

  • @return

*/

@Bean

public SimpleCookie rememberMeCookie(){

//System.out.println(“ShiroConfiguration.rememberMeCookie()”);

//这个参数是cookie的名称,对应前端的checkbox的name = rememberMe

SimpleCookie simpleCookie = new SimpleCookie(“rememberMe”);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值