Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring安全性:需要通道=";https";导致重定向循环_Java_Spring_Ssl_Spring Security_Websphere - Fatal编程技术网

Java Spring安全性:需要通道=";https";导致重定向循环

Java Spring安全性:需要通道=";https";导致重定向循环,java,spring,ssl,spring-security,websphere,Java,Spring,Ssl,Spring Security,Websphere,我在尝试使在WAS上正常工作时遇到问题。应用服务器已启用SSL 当我有这样的配置时:- <security:http auto-config="true"> <security:form-login .../> <security:logout .../> <security:intercept-url pattern="/admin/**" access="ROLE_ADMIN" /> <security:

我在尝试使
在WAS上正常工作时遇到问题。应用服务器已启用SSL

当我有这样的配置时:-

<security:http auto-config="true">
    <security:form-login .../>
    <security:logout .../>

    <security:intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
    <security:intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER" />
</security:http>
。。。现在,当我尝试点击
http://server/myapp
,我看到了
http://server/myapp/myapp/myapp/myapp/myapp/myapp
并进入重定向循环

因此,我重新定义了端口映射:-

<security:http auto-config="true">
    <security:form-login .../>
    <security:logout .../>

    <security:intercept-url pattern="/admin/**" access="ROLE_ADMIN" requires-channel="https" />
    <security:intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER" requires-channel="https" />

    <security:port-mappings>
        <security:port-mapping http="80" https="443"/>
    </security:port-mappings>
</security:http>

。。。当我尝试点击
http://server/myapp
,浏览器栏中的URL没有改变,但我仍然遇到“重定向循环”问题。即使我尝试点击
https://server/myapp
,我仍然遇到同样的问题

关于如何调试这个问题,我已经没有什么想法了。似乎当我添加
requires channel=“https”
时,它会在WAS上中断,但在Jetty上运行良好。我目前的解决方法是删除
requires channel=“https”
,这样https就可以工作了,但是用户可以使用http访问该站点

另一件事是,为http添加端口9080和为https添加端口9443也不能解决WAS上的问题

有什么想法吗?谢谢你的帮助

我当前的解决方法是删除requires channel=“https”,以便 https工作在WAS上,但是用户可以使用http访问该站点

我没有这个问题的解决方案,但这里有一个解决方法:

import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.springframework.stereotype.Component;     
import org.springframework.web.filter.OncePerRequestFilter; 

@Component
public class UnsecureRequestFilter extends OncePerRequestFilter { 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 
                    throws ServletException, IOException { 
        if (!request.isSecure()) {
            response.sendRedirect("https://domain.example.com/");
        } else { 
            filterChain.doFilter(request, response); 
        } 
    }
} 

这是独立于平台的,因此应该与WAS以及任何其他容器一起使用。

Disclamer:我可能错了,这毕竟是Internet:)我似乎记得您需要
或调用
DefaultServletHandlerConfigurer.enable()
,如果您使用注释配置来实现该功能,因此,您可能需要检查是否尚未添加它。您是否找到解决方案?我遇到了同样的问题我也有同样的问题。。。有什么解决方案吗?你有没有试着看看在Spring框架中循环发生在哪里?您可以引入一个打破循环的过滤器
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.springframework.stereotype.Component;     
import org.springframework.web.filter.OncePerRequestFilter; 

@Component
public class UnsecureRequestFilter extends OncePerRequestFilter { 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 
                    throws ServletException, IOException { 
        if (!request.isSecure()) {
            response.sendRedirect("https://domain.example.com/");
        } else { 
            filterChain.doFilter(request, response); 
        } 
    }
}