spring之在没有 Spring Security 的情况下,DelegatingFilterProxy 在 Spring MVC 应用程序上调用了两次
tuyile006
阅读:19
2024-11-01 17:39:52
评论:0
我在我的 Spring MVC 应用程序中有一个作为 DelegatingFilterProxy 实现的过滤器,它被调用了两次。我不知道发生了什么。我确定 Spring 上下文没有被创建两次,因为所有配置都在 root-context.xml 中,而我的 servlet-context.xml 是空的。
我的 web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
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>cheapig</display-name>
<!--Definição do Contexto Global do Container do Spring com recursos (beans) que são compartilhados com
TODOS os Servlets e Filtros -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Cria o container do Spring compartilhado com todos os Servlets e Filtros -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<display-name>sessionListener</display-name>
<listener-class>br.com.cheapig.util.SessionListener</listener-class>
</listener>
<!-- Filtro para controlar acesso -->
<filter>
<filter-name>cheapigFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>cheapigFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Definição do Servlet que processa todos os requests da aplicação. Como se está utilizando
o Framework Spring, o servlet é o DispatcherServlet. -->
<servlet>
<servlet-name>cheapig</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/cheapig/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Mapeamento dos Servlets e URLs -->
<servlet-mapping>
<servlet-name>cheapig</servlet-name>
<url-pattern>/cheapig/*</url-pattern>
</servlet-mapping>
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/view/util/layout_404.jsp</location>
</error-page>
<error-page>
<error-code>405</error-code>
<location>/WEB-INF/view/util/layout_405.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/view/util/layout_500.jsp</location>
</error-page>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
</web-app>
我的根上下文(记住 servlet-context.xml 被注释掉了):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd
">
<mvc:resources mapping="/resources/**" location="/resources/" />
<!-- Imports user-defined @Controller beans that process client requests -->
<import resource="cheapig/controllers.xml" />
<import resource="cheapig/hibernateMySQL5.xml"/>
<import resource="cheapig/integracaoTiles2.xml"/>
<import resource="cheapig/servicoEmail.xml"/>
<mvc:annotation-driven/>
<context:component-scan base-package="br.com.cheapig" />
<task:annotation-driven/>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- Root Context: defines shared resources visible to all other web components -->
<!-- Configurações de Internacionalização -->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:messages" />
<property name="defaultEncoding" value="latin1" />
</bean>
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="defaultLocale" value="pt" />
</bean>
<!-- Mapeamento da view "rssViewer" para o bean "rssViewer" -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
<bean id="rssViewer" class="br.com.cheapig.servico.CustomRssViewer" />
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- one of the properties available; the maximum file size in bytes -->
<property name="maxUploadSize" value="3145728" />
<property name="maxInMemorySize" value="3145728"></property>
</bean>
<bean id="velocityEngine"
class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="velocityProperties">
<value>
resource.loader=file
file.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
</value>
</property>
</bean>
<!-- <bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="velocityProperties"> <value> resource.loader=class class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
</value> </property> <property name="resourceLoaderPath"> <value>/WEB-INF/velocity</value>
</property> </bean> -->
<!-- <bean id="controleAcesso" class="br.com.cheapig.seguranca.ControleAcesso">
<bean id="cheapigFilter" class="br.com.cheapig.seguranca.SegurancaFilter"
> <property name="controleAcesso" ref="controleAcesso" /> <property name="localeResolver"
ref="localeResolver" /> </bean> -->
</beans>
我的过滤器:
package br.com.cheapig.seguranca;
import java.io.IOException;
import java.util.Date;
import java.util.Locale;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.servlet.LocaleResolver;
import br.com.cheapig.controlador.HistoricoVisitasController;
import br.com.cheapig.dominio.HistoricoVisitas;
import br.com.cheapig.dominio.Usuario;
import br.com.cheapig.exception.ControleAcessoException;
import br.com.cheapig.util.CheapigUtil;
import br.com.cheapig.util.ConstantesAmbiente;
import br.com.cheapig.util.ConstantesGenericas;
import br.com.cheapig.util.ConstantesHistoricoVisitas;
import br.com.cheapig.util.ConstantesSessao;
import br.com.cheapig.util.WorkflowUtil;
import br.com.cheapig.workflow.Request;
/**
* Classe responsável por fazer a filtragem do controle de acesso aos recursos do site
*
* @author Guilherme Macedo
* @since Apr 30, 2012
*/
@Component(value = "cheapigFilter")
public class SegurancaFilter extends OncePerRequestFilter {
@Autowired
private ConstantesAmbiente constantesAmbiente;
@Autowired
private LocaleResolver localeResolver;
@Autowired
private ControleAcesso controleAcesso;
@Autowired
private HistoricoVisitasController historicoVisitasController;
/**
* Cria um novo objeto SegurancaFilter
*/
public SegurancaFilter() {
super();
}
/**
* @see org.springframework.web.filter.OncePerRequestFilter#doFilterInternal(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain)
*/
@SuppressWarnings("unchecked")
@Override
protected void doFilterInternal(HttpServletRequest pRequest, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
Locale locale = new Locale("pt", "br");
this.localeResolver.setLocale(pRequest, response, locale);
LocaleContextHolder.setLocale(locale);
String path = pRequest.getRequestURI().substring(pRequest.getContextPath().length());
String uri = pRequest.getRequestURI();
HttpSession vSession = pRequest.getSession();
String appId = (String) vSession.getAttribute("facebookAppId");
if(appId == null || appId.isEmpty()){
vSession.setAttribute("facebookAppId", this.constantesAmbiente.getFacebookAppId());
}
if (path.startsWith("/resources") || path.startsWith("/css")) {
filterChain.doFilter(pRequest, response); // Goes to default servlet.
System.out.println("resources");
} else {
System.out.println("uri: "+uri);
this.salvaVisita(pRequest);
if (uri.equals("/") || uri.equals("/cheapig/")) {
pRequest.getSession().setAttribute("loadCidadeList", true);
} else {
pRequest.getSession().setAttribute("loadCidadeList", false);
}
String vUrl = uri.substring("/cheapig".length());
String vLogado = (String) vSession.getAttribute(ConstantesSessao.SESSION_LOGADO);
if (vLogado == null) {
vLogado = ConstantesGenericas.SIGLA_NAO;
vSession.setAttribute(ConstantesSessao.SESSION_LOGADO, ConstantesGenericas.SIGLA_NAO);
}
if (vLogado.equals(ConstantesGenericas.SIGLA_SIM) && vUrl.contains("login")) {
String vRedirectURL = "/cheapig/";
response.sendRedirect(vRedirectURL);
}else{
Usuario vUsuario = (Usuario) vSession.getAttribute(ConstantesSessao.SESSION_USUARIO);
try {
if (vLogado.equalsIgnoreCase(ConstantesGenericas.SIGLA_NAO)) {
this.controleAcesso.verificaPermissoesAnonimas(vUrl);
} else {
this.controleAcesso.verificaAcesso(vUsuario, vUrl);
}
pRequest.getRequestDispatcher(uri).forward(pRequest, response);
} catch (ControleAcessoException e) {
Request vRequest = new Request();
vRequest.setRequestURI(uri);
vRequest.setRequestURL(vUrl);
vRequest.setRequestParameters(WorkflowUtil.montaParametrosURLParameterMap(pRequest.getParameterMap()));
vRequest.setRequestMethod(pRequest.getMethod());
vSession.setAttribute("COMING_REQUEST", vRequest);
response.sendRedirect("/cheapig/loginTela");
return;
}
}
}
}
public ControleAcesso getControleAcesso() {
return this.controleAcesso;
}
public LocaleResolver getLocaleResolver() {
return this.localeResolver;
}
@Override
protected void initFilterBean() throws ServletException {
}
/**
* Coleta as informações do usuário e persiste no histórico de visitas
*
* @param request
* HttpServletRequest
*/
private void salvaVisita(HttpServletRequest request) {
String locale = request.getLocale().getLanguage();
String browser = CheapigUtil.identificaBrowser(request.getHeader(ConstantesHistoricoVisitas.HTTP_BROWSER));
String metodo = request.getMethod();
String ip = request.getRemoteAddr();
String pagAcessada = request.getRequestURI();
String host = request.getRemoteHost();
HistoricoVisitas historico = new HistoricoVisitas();
historico.setLinguagemNavegador(locale);
historico.setBrowser(browser);
historico.setDataAcesso(new Date());
historico.setHost(host);
historico.setIpVisitante(ip);
historico.setPagAcessada(pagAcessada);
historico.setRequestMethod(metodo);
this.historicoVisitasController.cadastrarHistoricoVisitas(historico);
}
public void setControleAcesso(ControleAcesso controleAcesso) {
this.controleAcesso = controleAcesso;
}
public void setLocaleResolver(LocaleResolver localeResolver) {
this.localeResolver = localeResolver;
}
}
任何人都可以帮助我或给我提示?
提前致谢! :D
请您参考如下方法:
此问题的唯一合乎逻辑的原因是有多个请求,因为您的过滤器正在实现 OncePerRequestFilter
。
可能的原因是重定向和事件冒泡(例如,单击一个元素,该元素后面还有其他元素也具有 onclick 功能)。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。