- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们实现了由 Redis 支持的 Spring Session,并拥有一个 Tomcat 服务器集群。当我们通过不设置 jvmRoute 来关闭粘性 session 时,我们在 jcaptcha 服务中不断收到“文本验证失败”消息。我认为这是因为 jcaptcha servlet 对 Spring Dispatcher servlet 一无所知,Spring Dispatcher servlet 具有所有 Spring Session 过滤器,因此无法读取 session 变量。我们如何使 jcaptcha 与 Spring Session 一起工作?
这是我们的设置:
Web.xml
<servlet>
<servlet-name>my-servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>throwExceptionIfNoHandlerFound</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>my-servlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>jcaptcha</servlet-name>
<servlet-class>com.octo.captcha.module.servlet.image.SimpleImageCaptchaServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>jcaptcha</servlet-name>
<url-pattern>/jcaptcha/jcaptcha.jpg</url-pattern>
</servlet-mapping>
CustomHttpSessionAppInitializer.java
public class CustomHttpSessionAppInitializer extends AbstractHttpSessionApplicationInitializer {}
RedisSessionConfig.java
@Configuration
@EnableRedisHttpSession
public class RedisSessionConfig {
@Value("${spring.redis.host}")
private String redisServerName;
@Value("${spring.redis.port}")
private Integer redisServerPort;
@Value("${spring.redis.database}")
private Integer redisServerDatabase;
@Value("${spring.redis.password}")
private String redisServerPassword;
@Value("${spring.server.affinity}")
private Boolean isServerAffinity = Boolean.FALSE;
@Autowired
private SessionIdentifierService sessionIdentifierService;
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(redisServerName, redisServerPort);
config.setDatabase(redisServerDatabase);
config.setPassword(RedisPassword.of(redisServerPassword));
return new JedisConnectionFactory(config);
}
/*
* We need to register every HttpSessionListener as a bean to translate SessionDestroyedEvent and SessionCreatedEvent into
* HttpSessionEvent. Otherwise we will got a lot of warning messages about being Unable to publish Events for the session.
* See Spring Session Docs at:
* {@link} https://docs.spring.io/spring-session/docs/current/reference/html5/#httpsession-httpsessionlistener
*/
@Bean
public HttpSessionEventPublisher httpSessionEventPublisher() {
return new HttpSessionEventPublisher();
}
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer serializer = new DefaultCookieSerializer();
serializer.setCookieName("JSESSIONID");
serializer.setUseBase64Encoding(false);
if (isServerAffinity) {
serializer.setJvmRoute(sessionIdentifierService.getJvmRoute());
}
return serializer;
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory());
return template;
}
}
最佳答案
将 jcaptcha 与 Spring Session 集成应该不会有问题。只要有办法从 Redis 加载 session (在本例中是通过 SESSION cookie)并且 session 存在,调用 request.getSession()
或request.getSession(false)
将返回 Redis 支持的 session 。
这适用于任何在 springSessionRepositoryFilter 之后调用的过滤器和 servlet。如果你看SessionRepositoryFilter
的源代码,您会看到HttpServletRequest
与 SessionRepositoryRequestWrapper
交换.
所以你的SimpleImageCaptchaServlet
无论您使用哪个 servlet 来验证用户响应,都将获得一个 SessionRepositoryRequestWrapper,它将让您顺利访问 Redis 支持的 session 。
问题可能出在您的配置上; springSessionRepositoryFilter 可能未在容器中注册,特别是因为您同时使用 web.xml 和 Servlet 3.0+ WebApplicationInitializer
。如果您的应用程序工作正常,那么您的 web.xml 很可能工作正常。您使用的是 WebApplicationInitializer
加载你的web.xml?如果没有,则可能是您的 Java 配置未加载。确保您的 web.xml 以某种方式加载您的配置,也许可以通过在 contextLoaderListener xml 配置文件中启用组件扫描 ( <context:component-scan/>
) 来加载您的 Java 配置:
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>
加载将创建过滤器的配置,然后您必须将其添加到 web.xml 中:
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
关于servlets - 如何使 jcaptcha 与 Spring Session 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54046802/
我在一个项目中使用 JCaptcha 并且需要一种不能直接使用的行为。所以我查看了源代码,看看是否可以扩展它以获得我想要的东西,发现我使用的存储实现 ( MapCaptchaStore ) 使用 Ha
我正在使用 jcaptcha-all-1.0-RC6 生成验证码图像。 相同的代码片段如下 captchaService = new DefaultManageableImageC
我已经根据来自 Jcaptcha 站点的示例提供了一个 Jcaptcha,但我需要使用颜色和字体配置默认的 jcaptcha。 我设法找到了这个 Configuration Jcaptcha with
我们在我的团队正在编写的一个小应用程序中使用 JCaptcha 作为验证码工具。然而,就在开发期间(在一个小团队中——我们 4 个人),我们遇到了一些针对实际验证码的诅咒词和其他可能令人反感的词。有没
我已经在我的网络应用程序中实现了 JCaptcha,它工作正常,但是当浏览器的 cookie 被阻止时,它总是失败并返回 false。 servlet代码如下: protected void doPo
在本地调试我的 webapp 时一切都运行良好,但是当将它部署到服务器(Microsoft Azure,操作系统:Ubuntu 14.04 tomcat7+apache)时,找不到 jcaptcha
在开始回答之前,我知道有 ReCaptcha,它更简单更容易,但我不能使用它。生产服务器不在线。所以我们开始了。 我在 maven 项目和 weblogic 上使用带有 spring security
我们实现了由 Redis 支持的 Spring Session,并拥有一个 Tomcat 服务器集群。当我们通过不设置 jvmRoute 来关闭粘性 session 时,我们在 jcaptcha 服务
简单介绍一下,本框架的基本功能点: Spring:整个框架的主体部分,这个自不用说。 SpringMVC:MVC部分我还是比较喜欢Spring的。 MyBatis:选型的时候选择
您好,我在尝试将 jcaptcha 插件与 grails 1.3.7 一起使用时遇到以下错误。 org.codehaus.groovy.runtime.typehandling.GroovyCastE
我是一名优秀的程序员,十分优秀!