renren-security shiro登录态失效时HTTPS自动跳转失败解决方案

建议 0 1625
KURO
KURO 2020-03-16
直接拉下来的源码很棒,后来上线后发现https环境下,shiro失效了自动跳转登录页会无反应,浏览器控制台提示报错,https下无法跳转http链接(大概这个意思),现建议官方修正,本人的解决方案如下。 [hr] 1.维护一个RedirectResponseWrapper [pre] package io.renren.common.filter; /** * 功能描述: <br> * * @since: 1.0.0 * @Author:Created By KURO * @Date: 2020/02/23 16:21 */ import org.apache.commons.lang.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; public class RedirectResponseWrapper extends HttpServletResponseWrapper { private static Logger log = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME); private final HttpServletRequest request; public RedirectResponseWrapper(final HttpServletRequest inRequest, final HttpServletResponse response) { super(response); this.request = inRequest; } @Override public void sendRedirect(final String pLocation) throws IOException { if (StringUtils.isBlank(pLocation)) { super.sendRedirect(pLocation); return; } try { final URI uri = new URI(pLocation); if (uri.getScheme() != null) { super.sendRedirect(pLocation); return; } } catch (URISyntaxException ex) { super.sendRedirect(pLocation); } // !!! FIX Scheme !!! String finalurl = "https://" + this.request.getServerName(); if (request.getServerPort() != 80 && request.getServerPort() != 443) { finalurl += ":" + request.getServerPort(); } finalurl += pLocation; log.info("========= HTTPS shiro重定向跳转:" + finalurl); super.sendRedirect(finalurl); } } [/pre] 2.维护一个过滤器AbsoluteSendRedirectFilter [pre] package io.renren.common.filter; /** * 功能描述: <br> * * @since: 1.0.0 * @Author:Created By KURO * @Date: 2020/02/23 16:19 */ import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class AbsoluteSendRedirectFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { RedirectResponseWrapper redirectResponseWrapper = new RedirectResponseWrapper(request, response); filterChain.doFilter(request, redirectResponseWrapper); } } [/pre] 3.维护一个配置类RedirectFilterConfig [pre] package io.renren.common.config; import io.renren.common.filter.AbsoluteSendRedirectFilter; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; /** * 功能描述: <br> * 解决shiro在https失效跳转http问题 * @since: 1.0.0 * @Author:Created By KURO * @Date: 2020/02/23 16:10 */ @Component @ConditionalOnProperty(name = "project.enable-https", havingValue = "true") // 开启注解才会启动 public class RedirectFilterConfig { @Bean public FilterRegistrationBean registFilter() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new AbsoluteSendRedirectFilter()); registration.addUrlPatterns("*"); registration.setName("filterRegistrationBean"); registration.setOrder(1); return registration; } } [/pre] 4.在各个环境配置文件中添加以下配置 [pre] # dev环境项目配置,test、prod环境如果是https的域名,将enable-https改为true即可 project: enable-https: false [/pre] 5.最后,修改SysLoginController的logout登出接口 [pre] /** * 退出 */ @RequestMapping(value = "logout", method = RequestMethod.GET) public String logout() { ShiroUtils.logout(); return "redirect:/login.html"; } [/pre]
本帖标签: https
回帖
  • 消灭零回复