文档说org.springframework.web.filter.OncePerRequestFilter" 保证每次请求只执行一次 ".在什么情况下,每个请求可能会多次执行过滤器?
我在学习Spring Boot时遇到了一些编码问题; 我想添加像Spring 3.x这样的CharacterEncodingFilter.像这样:
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud) 我目前正在尝试将我的项目从Java EE转移到Spring Boot项目.但是,我对调度程序servlet和web.xml的部分感到困惑和困惑,似乎web.xml不再被项目读取了.当前项目在tomcat 7上运行.
在我的web.xml文件,我有很多的servlet,servlet-mapping,filter和filter mapping我真的不知道该怎么办的调度映射.
我附上了我的web.xml下面的样本,版本是2.5.
<?xml version="1.0" encoding="UTF-8"?>
<web-app metadata-complete="true" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>displayName</display-name>
<description>description</description>
<resource-ref>
...
</resource-ref>
<filter>
<filter-name>Some Filter Name</filter-name>
<filter-class>Some Filter Class</filter-class>
<init-param>
<param-name>Some Param Name</param-name>
<param-value>Some Value</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Some Filter Name</filter-name>
<url-pattern>Some url-pattern</url-pattern>
</filter-mapping>
<context-param>
<param-name>Some Param Name</param-name>
<param-value>Some Param Value</param-value>
</context-param>
<servlet>
<servlet-name>Some Servlet Name</servlet-name>
<servlet-class>Some Servlet Class</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Some Servlet Name</servlet-name>
<url-pattern>Some Url Pattern</url-pattern> …Run Code Online (Sandbox Code Playgroud)我想要ETag支持.为此目的,有一个ShallowEtagHeaderFilter完成所有工作.如何添加它而不在我的声明web.xml(实际上不存在,因为我到目前为止没有它的某种方式得到它)?
PS我使用Spring Boot 1.1.4
PPS这是一个完整的解决方案
package cuenation.api;
import org.springframework.boot.context.embedded.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.ShallowEtagHeaderFilter;
import javax.servlet.DispatcherType;
import java.util.EnumSet;
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean shallowEtagHeaderFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new ShallowEtagHeaderFilter());
registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
registration.addUrlPatterns("/cue-categories");
return registration;
}
}
Run Code Online (Sandbox Code Playgroud) 我需要一些帮助.
我把代码片段放在我的下面web.xml.
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter </filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
在我的server.xml:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
Run Code Online (Sandbox Code Playgroud)
我的jsp页面编码为UTF-8,我的mysql表编码为utf8_general_ci.
我的问题是每当我保存ñ它就变成了?.
当我尝试手动保存ñ在mysql终端时,它正确保存.我怀疑问题出在我的服务器或我的程序中.请帮忙.
Spring OAuth2多因素身份验证实现的完整代码已上载到文件共享站点,您可以通过单击此链接下载该站点.下面的说明解释了如何使用该链接在任何计算机上重新创建当前问题.提供500点赏金.
当用户尝试使用前一段中链接的Spring Boot OAuth2应用程序中的双因素身份验证进行身份验证时,将触发错误.当应用程序应该提供第二页时要求用户输入密码来确认用户的身份,该过程中会出现错误.
鉴于null客户端正在触发此错误,问题似乎是如何在Spring Boot OAuth2中连接ClientDetailsService到a Custom OAuth2RequestFactory.
在整个调试日志可以在文件共享网站点击此链接上读取.日志中的完整堆栈跟踪仅包含对应用程序中实际代码的一个引用,该代码行为:
AuthorizationRequest authorizationRequest =
oAuth2RequestFactory.createAuthorizationRequest(paramsFromRequest(request));
Run Code Online (Sandbox Code Playgroud)
调试日志中抛出的错误是:
org.springframework.security.oauth2.provider.NoSuchClientException:
No client with requested id: null
Run Code Online (Sandbox Code Playgroud)
我创建了以下流程图,以说明@James建议实现中的多因素身份验证请求的预期流程:
在上面的流程图中,在用户名和密码视图与GET/secure/two_factor_authenticated步骤之间的某个时刻抛出当前错误.
该OP的解决方案的范围仅限于FIRST PASS,其中1.)穿过/oauth/authorize端点,然后2.)通过端口返回/oauth/authorize端点TwoFactorAuthenticationController.
因此,我们只是想解决NoSuchClientException,同时也表明客户端已成功授权ROLE_TWO_FACTOR_AUTHENTICATED的POST /secure/two_factor_authenticated.鉴于随后的步骤是锅炉板,只要用户以成功完成FIRST PASS的所有工件进入SECOND PASS,流程就可以在SECOND PASS条目中明显中断.只要我们在这里成功解决FIRST PASS,SECOND PASS就可以成为一个单独的问题. CustomOAuth2RequestFactory
这是AuthorizationServerConfigurerAdapter …
spring spring-mvc spring-security spring-boot spring-security-oauth2
有了WebApplicationInitializer,我可以轻松地ServletContext在onStartup()方法中添加一个过滤器.
如何添加过滤器WebMvcConfigurerAdapter?我必须使用XML吗?
为了帮助其他人更轻松地理解Spring Web配置,我绘制了下面的插图.
现在您只需要首先了解rationalSpring Web配置的背后.然后选择要继承的配置类以及从下面覆盖的方法.
查找它比记住这么多东西要痛苦得多.
关于Spring Web Initialization的一篇很好的文章:
http://www.kubrynski.com/2014/01/understanding-spring-web-initialization.html
根据Tunaki我的回复,我查了一下AbstractDispatcherServletInitializer.过滤器注册发生在以下代码中:
即使我覆盖绿色getServletFilters()方法,我仍然无法访问Dyanmic结果registerServletFilter().那么如何配置过滤器addMappingForUrlPatterns()呢?
我似乎have to覆盖了整个registerDispatcherServlet()方法.
我已经在spring boot应用程序上开发了rest API。API仅接受GET和POST,但在使用OPTIONS方法请求时,API会响应200状态(而不是405)。我用谷歌搜索了这个问题,但是没有一个解决方案是基于springboot的。
响应:
Allow: OPTIONS, TRACE, GET, HEAD, POST
Public: OPTIONS, TRACE, GET, HEAD, POST
Run Code Online (Sandbox Code Playgroud)
需要禁用OPTIONS方法。
我想在我的 Spring Boot Rest API 项目上实现过滤器,但是我的过滤器没有被调用。我为此添加了以下实现。
public class AutorizationFilter implements Filter{
Logger log = LoggerFactory.getLogger(AutorizationFilter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("**** Start ****");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
log.info("**** doFilter ****");
chain.doFilter(request, response);
}
@Override
public void destroy() {
log.info("**** end ****");
}}
Run Code Online (Sandbox Code Playgroud)
init和destroy方法正在工作,但doFilter方法未调用。
@Configuration
public class RestApiConfig {
@Bean
public FilterRegistrationBean<AutorizationFilter> filterRegistrationBean(){
FilterRegistrationBean<AutorizationFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new AutorizationFilter());
registrationBean.addUrlPatterns("/**");
return registrationBean; …Run Code Online (Sandbox Code Playgroud) 我正在将 Web 应用程序转换为使用 spring-boot。该应用程序当前使用resteasy,我想将其转换为使用spring-rest/mvc。
到目前为止,它非常简单(主要是替换注释)。我遇到问题的地方与过滤器(HTTP 过滤器)有关。
目前,该应用程序有一个在一些端点中使用的过滤器。注释用于指定过滤器应用于哪些休息点。该注解基于@NameBinding
这可以用 Spring 来完成吗(即创建一个注释,并且对于我想要应用过滤器的每个休息端点方法,我将对其进行注释)?
spring ×7
spring-boot ×7
spring-mvc ×4
java ×2
annotations ×1
encoding ×1
filter ×1
hibernate ×1
tomcat6 ×1
tomcat7 ×1
web.xml ×1