如何在spring-mvc中根据域过滤请求
Posted
技术标签:
【中文标题】如何在spring-mvc中根据域过滤请求【英文标题】:How to filter request based on domain in spring-mvc 【发布时间】:2021-09-17 17:34:13 【问题描述】:我的应用程序有一个 war 文件,我将使用 2 个域来访问它。例如,我想使用 admin.mydomain.com/adminpage 访问 admin.jsp 以及我想使用 local.mydomain.com 访问的其他 jsp 页面。
此外,admin.jsp 应该只能通过 admin.mydomain.com 而不是 local.mydomain.com 访问。如何在 spring-security / spring-mvc 中做到这一点? spring 框架对此有支持吗?
对此的任何帮助都会有所帮助。谢谢。
【问题讨论】:
【参考方案1】:你可以实现RequestMatcher
,也许像
HostOnlyRequestMatch(String relativePath, String hostname)
然后重写boolean matches(HttpServletRequest request)
方法,如果relativePath
和hostname
与request相同,则返回true
。
像这样将requestMatcher
添加到http
:
http
.authorizeRequests()
.requestMatcher(new HostOnlyRequestMatch("/admin", "admin.mydomain.com")).permitAll()
.antMatchers("/admin").denyAll();
【讨论】:
【参考方案2】:一种方法是配置代理(例如 nginx)以正确地将您的请求路由到您的应用程序服务器(例如 Tomcat)。阅读此处了解更多详情https://www.nginx.com/resources/admin-guide/reverse-proxy/
【讨论】:
【参考方案3】:您可以从 mvc 控制器中的请求对象获取请求的 url,如果它不是正确的域,那么您可以根据您的项目抛出或显示正确的错误。以下是代码sn -p
@Controller
@RequestMapping("/adminpage")
public class AdminPageController
@RequestMapping(method = RequestMethod.GET)
public String getAdminPage(HttpServletRequest request)
String url = request.getRequestURL().toString();
if(!url.contains("admin.mydomain.com"))
throw RuntimeException("Not accessible through this domain.");
// You can implement your own logic of showing error here
【讨论】:
安全是一个跨领域的问题,不应该在控制器中实现! Spring Security、HandlerInterceptor 或 @ControllerAdvice 都是更好的机制。以上是关于如何在spring-mvc中根据域过滤请求的主要内容,如果未能解决你的问题,请参考以下文章