Http到https重定向

时间:2011-08-09 05:13:07

标签: java http

我们有一个可以通过http和https

访问的网站

我们需要使用http来访问所有页面,这样可以正常工作但是当用户登录到站点时,我们需要所有经过身份验证的页面都需要使用https显示

请告知我们实现此目标的最简单方法

由于 SRINIVAS

5 个答案:

答案 0 :(得分:10)

您可以使用过滤器:

public class MyFilter implements Filter {
    private FilterConfig conf;

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest)request;
        HttpServletResponse resp = (HttpServletResponse)response;
        if (req.getRemoteUser() != null && req.getScheme().equals("http")) {
            String url = "https://" + req.getServerName()
                    + req.getContextPath() + req.getServletPath();
            if (req.getPathInfo() != null) {
                url += req.getPathInfo();
            }
            resp.sendRedirect(url);
        } else {
            chain.doFilter(request, response);
        }
    }

    public FilterConfig getFilterConfig() {
        return conf;
    }

    public void setFilterConfig(FilterConfig filterConfig) {
        conf = filterConfig;
    }

    public void destroy() {        
    }

    public void init(FilterConfig filterConfig) {
        conf = filterConfig;
    }
}

答案 1 :(得分:1)

这是我在Jetty上的Scala解决方案(我使用Jetty独立,没有WAR)。

class RedirectHandler extends ContextHandler {
  override def doHandle(target: String, baseRequest: Request,
      request: HttpServletRequest, response: HttpServletResponse): Unit = {
    if ("http" == request.getScheme.toLowerCase) {
      baseRequest setHandled true
      response sendRedirect s"https://${request.getServerName}${request.getContextPath}"
    }
  }
}

在端口80,8080和c上向服务器添加连接器。 将此处理程序添加到处理程序链的前面。

答案 2 :(得分:0)

您可以使用Apache轻松实现这一目标。

假设您已将用户内容嵌套在“受保护”路径中,这会将每个以“/ protected”开头的请求转发到您的HTTPS主机:

# HTTP redirect configuration
<VirtualHost *:80>
    RewriteEngine on
    RewriteRule ^/protected/ https://hostname/ [R]
</VirtualHost>

使用这种方法,URI的其余部分将丢失,用户应该再次导航到他们想去的地方。

答案 3 :(得分:0)

检查用户是否已登录,然后检查连接是否为HTTPS。

 if (checkIfUserIsLoggedIn) {
   $val = ((@$_SERVER['SERVER_PORT_SECURE'] == 1) || (@$_SERVER['HTTPS'] == 'on')) ? 'https://' : 'http://';
   if ($val == 'http://') {
    // reload page if it not https
    header('Location: https://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']);
   }
}

答案 4 :(得分:-1)

魔术。

开玩笑。

您可以在检查用户是否已登录的每个页面上运行某种例程,对吗?好吧,只需在该例程中添加一些逻辑,该例程还检查当前URL并重定向到https版本(如果您还没有)。

if current url is not https:
    redirect to replace(current url, 'http://', 'https://')