我正在尝试在j_security_check上执行过滤器来执行一些后期登录操作,例如更改重定向URL等。但问题是我的过滤器永远不会被执行。我可以申请的任何拼凑?任何帮助,将不胜感激。我真的厌倦了容器管理的安全性。
提前致谢。
答案 0 :(得分:1)
您无法以编程方式挂钩/j_security_check
。这是一项安全限制。
您最好的选择是通过手动检查HttpSession
中的用户主体来确定首次登录,如果不存在则将其放在那里,然后执行您的操作。我在here之前发布了类似的答案。以下是过滤器代码的摘录,您只需要在覆盖受保护页面的所需url-pattern
上映射过滤器。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
HttpServletRequest httpRequest = (HttpServletRequest) request;
UserPrincipal user = httpRequest.getUserPrincipal();
HttpSession session = httpRequest.getSession();
if (user != null && session.getAttribute("user") == null) {
session.setAttribute("user", user);
// First-time login. You can do your intercepting thing here.
}
chain.doFilter(request, response);
}
答案 1 :(得分:0)
恕我直言,你不应该试图拦截容器的认证系统;在您的情况下,可以在web.xml中以声明方式设置重定向URL。
如果您想执行一些后认证操作,我建议设置一个虚拟的后验证servlet / jsp,它可以执行您想要的操作,然后重定向到所请求的资源。然后可以将该auth后servlet正确配置为登录后页面。
答案 2 :(得分:0)
一种便携式解决方案。
在pattern / *;
在doFilter()中尝试从会话中获取自定义对象(即用户工作区);
如果object为null,则将新对象放入会话并执行登录后逻辑。
public void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain chain
) throws IOException, ServletException
{
Principal principal = request.getUserPrincipal();
if(principal != null) {
UserWorkspace uwks = (UserWorkspace) getSession(request).getAttribute("com.foo.myproject.userworkspace");
if (uwks == null) {
uwks = new UserWorkspace(principal);
getSession(request).setAttribute("com.foo.myproject.userworkspace", uwks);
//
// post-login code here
//
}
}
chain.doFilter(request, response);
}