访问 Web 应用程序或点击 url 时,自定义 spring 过滤器未被调用
Custom spring filter not getting called when web application is accessed or url is hit
下面是我在 web.xml 中的配置,我有一个 JwtFilter,但是当调用 rest url 时它无法访问。
web.xml
<web-app
<display-name>Portal Web</display-name>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-dispatcher-servlet-spring-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>jwtFilter</filter-name>
<filter-class>com.pingle.lola.authentication.JwtFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>jwtFilter</filter-name>
<url-pattern>/portal/lola/*</url-pattern>
</filter-mapping>
这是我的 JwtFilter
public class JwtFilter extends GenericFilterBean {
@Override
public void doFilter(final ServletRequest req,
final ServletResponse res,
final FilterChain chain) throws IOException, ServletException {
final HttpServletRequest request = (HttpServletRequest) req;
System.out.println("came here");
final String authHeader = request.getHeader("Authorization");
System.out.println("came here - " + authHeader);
if (authHeader == null || !authHeader.startsWith("Bearer ")) {
System.out.println("should throw");
throw new ServletException("Missing or invalid Authorization header.");
}
final String token = authHeader.substring(7); // The part after "Bearer "
System.out.println("came here" + token);
try {
final Claims claims = Jwts.parser().setSigningKey("secretkey")
.parseClaimsJws(token).getBody();
request.setAttribute("claims", claims);
}
catch (final SignatureException e) {
throw new ServletException("Invalid token.");
}
chain.doFilter(req, res);
}
}
我有控制器,其中配置了基本的其余部分 API。我正在尝试检查是否有任何 URL 像 localhost:8080/portal/lola/getData 一样被击中。它应该转到 JwtFilter 并检查请求的 header 中的身份验证令牌以及是否有效通过它在控制器上以其他方式抛出错误消息。逻辑编写正确,但未调用过滤器,当我点击上面 URL 时,它直接进入控制器而没有到达过滤器。
我的springconfig.xml
<context:component-scan base-package="com.pingle.lola.controller"/>
<mvc:annotation-driven/>
//不知道为什么我在它没有映射到任何控制器时创建它:(
<mvc:default-servlet-handler/>
似乎 /portal
是应用程序上下文的名称。过滤器 url-pattern 不应包含上下文名称。这意味着,过滤器 url-pattern 应该是 /lola/*
而没有 /portal
。尝试将过滤器映射更改为:
<filter-mapping>
<filter-name>jwtFilter</filter-name>
<url-pattern>/lola/*</url-pattern>
</filter-mapping>
下面是我在 web.xml 中的配置,我有一个 JwtFilter,但是当调用 rest url 时它无法访问。
web.xml
<web-app
<display-name>Portal Web</display-name>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-dispatcher-servlet-spring-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>jwtFilter</filter-name>
<filter-class>com.pingle.lola.authentication.JwtFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>jwtFilter</filter-name>
<url-pattern>/portal/lola/*</url-pattern>
</filter-mapping>
这是我的 JwtFilter
public class JwtFilter extends GenericFilterBean {
@Override
public void doFilter(final ServletRequest req,
final ServletResponse res,
final FilterChain chain) throws IOException, ServletException {
final HttpServletRequest request = (HttpServletRequest) req;
System.out.println("came here");
final String authHeader = request.getHeader("Authorization");
System.out.println("came here - " + authHeader);
if (authHeader == null || !authHeader.startsWith("Bearer ")) {
System.out.println("should throw");
throw new ServletException("Missing or invalid Authorization header.");
}
final String token = authHeader.substring(7); // The part after "Bearer "
System.out.println("came here" + token);
try {
final Claims claims = Jwts.parser().setSigningKey("secretkey")
.parseClaimsJws(token).getBody();
request.setAttribute("claims", claims);
}
catch (final SignatureException e) {
throw new ServletException("Invalid token.");
}
chain.doFilter(req, res);
}
}
我有控制器,其中配置了基本的其余部分 API。我正在尝试检查是否有任何 URL 像 localhost:8080/portal/lola/getData 一样被击中。它应该转到 JwtFilter 并检查请求的 header 中的身份验证令牌以及是否有效通过它在控制器上以其他方式抛出错误消息。逻辑编写正确,但未调用过滤器,当我点击上面 URL 时,它直接进入控制器而没有到达过滤器。
我的springconfig.xml
<context:component-scan base-package="com.pingle.lola.controller"/>
<mvc:annotation-driven/>
//不知道为什么我在它没有映射到任何控制器时创建它:(
<mvc:default-servlet-handler/>
似乎 /portal
是应用程序上下文的名称。过滤器 url-pattern 不应包含上下文名称。这意味着,过滤器 url-pattern 应该是 /lola/*
而没有 /portal
。尝试将过滤器映射更改为:
<filter-mapping>
<filter-name>jwtFilter</filter-name>
<url-pattern>/lola/*</url-pattern>
</filter-mapping>