Shiro框架在CORS跨域访问中遇到的问题及解决


背景

最近做一个前后端分离的项目时,使用shiro做权限管理时遇到跨域问题,这里做一下记录。

 

原因

后端通过Shiro配置URL过滤,
shiroFilterFactoryBean.setLoginUrl("/unauth");
默认对于没有授权的访问请求会redirect至LoginUrl.但在跨域访问时,redirect失败.原因是基于安全考虑,redirect发生时Response Header的信息会被清除,导致client端的访问被server端拒绝.

解决
 
@Component
public class CORSFilter extends OncePerRequestFilter {

/*
* 在ResponseBodyWrapHandler中已处理跨域问题
* 但是在shiro验证未通过跳转/unauth时, 因为redirect 重定向会丢失所有请求头,跨域问题重新出现
* */
@Override
protected void doFilterInternal(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {
HttpServletResponse res = (HttpServletResponse) servletResponse;

res.setContentType("text/html;charset=UTF-8");

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

res.setHeader("Access-Control-Allow-Methods", "*");

res.setHeader("Access-Control-Max-Age", "0");

res.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");

res.setHeader("Access-Control-Allow-Credentials", "true");

res.setHeader("XDomainRequestAllowed","1");

filterChain.doFilter(servletRequest, servletResponse);

}
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM