java - 重定向过滤器不会加载样式

标签 java jsp servlet-filters

我正在尝试创建一个过滤器,以确保用户在转到任何其他页面之前已登录

这里我有两个问题(据我所知)。

1) 我在只允许 jsp 文件时遇到问题。当我尝试访问我的页面时,tomcat 抛出错误

 java.lang.IllegalArgumentException: Invalid <url-pattern> /public/*.jsp in filter mapping

但是当我的 url 映射是/public/* 时,它就按预期工作了

编辑1:事实证明,我使用了不正确的映射,感谢下面的一些评论,对于来到此页面的任何人来说,这都是解决方案的一部分:http://www.roguewave.com/portals/0/products/hydraexpress/docs/3.5.0/html/rwsfservletug/4-3.html

2) 当我确实得到 /public/* 的重定向时我能够访问我的登录页面,但所有样式都丢失了

这是我在 web.xml 中的过滤器

编辑2:下面的代码片段现在反射(reflect)了我对答案所做的更改

<filter> <filter-name>LoginFilter</filter-name> <filter-class>authentication.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping>

这就是我在过滤器中尝试的内容

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        // place your code here
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        HttpSession session = req.getSession(false);
        // Get the requested address
        String from = URLEncoder.encode(req.getRequestURI(), "UTF-8");

        if(req.getQueryString() != null){
            from += "?" + req.getQueryString();
        }
        System.err.println("from str: " + from);
        System.out.println("Serv path: " + req.getServletPath());
        if(!req.getServletPath().startsWith("/public/login")){
            if(session == null || session.getAttribute("username") == null){
                res.sendRedirect(req.getContextPath() + "/public/login.jsp?from="+from);
            }else{
                System.out.println("Username: " + session.getAttribute("username"));
                // pass the request along the filter chain
                chain.doFilter(request, response);
            }
        }else{
            chain.doFilter(request, response);
        }
    }

对改进我的过滤器有什么建议吗?

最佳答案

URL 模式不是真正的全局匹配,仅支持两种类型的通配符:/someting/**.something

http://www.roguewave.com/portals/0/products/hydraexpress/docs/3.5.0/html/rwsfservletug/4-3.html

在设计样式时,您必须允许登录页面使用的资源(CSS、Javascript、图像等)在没有 session 的情况下加载,就像允许访问登录页面本身一样。

关于java - 重定向过滤器不会加载样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22237676/

相关文章:

java - 表单值未提交到 servlet

java - 如何使用 jOOQ 修改纯 sql 文本,例如附加 order-by/limit-offset 子句或更改 where 条件值?

macos - 在 Mac OSX 上升级 JDK

java - STS、Maven和Java运行速度非常慢

java - 如何从服务器外部运行的 Java 客户端访问 WebSphere 身份验证别名信息?

javascript - 如何在JSP中很好地拆分表格

java - 使用 spring-mvc 在网页上显示验证错误?

java - Servlet 请求阻塞

java - Servlet jsp、身份验证过滤器

jsf - 正确设置 HTTP header 以强制缓存 JS、CSS 和 PNG 文件