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);

}
}

猜你喜欢

转载自www.cnblogs.com/brave-wang/p/9807824.html
今日推荐