我的web.xml中有一个带安全约束的servlet,如下所示:
<security-constraint>
<web-resource-collection>
<web-resource-name>Admin</web-resource-name>
<url-pattern>/admin/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
上面强制切换到https协议并正常工作。但是在安全页面上有一些相对链接到不安全的页面。当用户点击它们时,它们通过https打开,我想避免。将相对链接转换为绝对链接不是一种选择。 Servlet规范没有提供强制不安全连接的方法,因此我将实现一个过滤器,将用户重定向到http:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
if(!isSubjectToAuthConstraint(request)) {
// Check protocol and redirect to http if https
// ....
} else {
// Do nothing, managed by servlet spec
filterChain.doFilter(request, response);
}
}
所以我需要知道请求是否受到安全约束。我怎么知道以编程方式?它有可能吗?
答案 0 :(得分:2)
Hy,正常情况下,https端口为443.通过在浏览器中输入https://www.example.com:443/welcome.html,浏览器将其扩展为https://www.example.com/welcome.html
也许这就是你所需要的:
String serverAddress = "";
String serverName = request.getServerName( );
String serverPort = "" + request.getServerPort( );
if( request.isSecure( ) ) {
serverAddress = "https://" + serverName + ":" + serverPort;
} else {
serverAddress = "http://" + serverName + ":" + serverPort;
}